private final static -> buat variabel ini hanya sekali. private final -> buat variabel ini untuk setiap objek. Yang pertama menyimpan memori, lakukanlah.
user1923551
4
final staticberarti variabel ini adalah konstanta dan hanya terkait dengan kelas itu sendiri, yaitu "satu variabel konstan per kelas" sementara itu finalberarti "satu variabel konstan per instance". Akibatnya, Anda tidak bisa meletakkan final staticvariabel dalam konstruktor kelas karena konstruktor melibatkan dalam instance baru . (Anda dapat mencobanya sendiri dan akan mendapatkan kesalahan)
LittleLittleQ
1
Dengan "tidak dapat meletakkan variabel statis terakhir di konstruktor kelas" Maksud saya orang tidak dapat menginisialisasi final staticvariabel dalam konstruktor, satu-satunya cara adalah dengan menggunakan penginisialisasi statis :)
LittleLittleQ
2
@ user1923551 Efeknya terbalik untuk hal-hal yang hanya diperlukan untuk waktu terbatas dalam aplikasi besar, dalam aplikasi yang langka memori atau ketika menggunakan singleton. Memiliki barang-barang statis di setiap kelas akan menyimpan banyak memori untuk hal-hal yang tidak diperlukan. Ini juga bisa menjadi kebocoran memori untuk mendeklarasikan objek akhir statis atau koleksi.
Semoga
Jawaban:
309
Secara umum, staticberarti "terkait dengan jenis itu sendiri, bukan contoh dari jenis itu."
Itu berarti Anda dapat mereferensikan variabel statis tanpa pernah membuat instance dari tipe, dan kode apa pun yang merujuk ke variabel merujuk ke data yang sama persis. Bandingkan ini dengan variabel instan: dalam hal ini, ada satu versi independen dari variabel per instance kelas. Jadi misalnya:
Test x =newTest();Test y =newTest();
x.instanceVariable =10;
y.instanceVariable =20;System.out.println(x.instanceVariable);
mencetak 10: y.instanceVariabledan x.instanceVariableterpisah, karena xdan ymerujuk ke objek yang berbeda.
Anda dapat merujuk anggota statis melalui referensi, meskipun itu ide yang buruk untuk melakukannya. Jika kami melakukannya:
Test x =newTest();Test y =newTest();
x.staticVariable =10;
y.staticVariable =20;System.out.println(x.staticVariable);
maka itu akan mencetak 20 - hanya ada satu variabel, bukan satu per contoh. Akan lebih jelas untuk menulis ini sebagai:
Test x =newTest();Test y =newTest();Test.staticVariable =10;Test.staticVariable =20;System.out.println(Test.staticVariable);
Itu membuat perilaku jauh lebih jelas. IDE modern biasanya akan menyarankan mengubah daftar kedua menjadi yang ketiga.
Tidak ada alasan untuk memiliki deklarasi inline menginisialisasi nilai seperti berikut, karena setiap instance akan memiliki sendiri NUMBERtetapi selalu dengan nilai yang sama (tidak dapat diubah dan diinisialisasi dengan literal). Ini sama dengan hanya memiliki satu final staticvariabel untuk semua instance.
privatefinalint NUMBER =10;
Karena itu jika tidak dapat diubah, tidak ada gunanya memiliki satu salinan per instance.
Tapi, masuk akal jika diinisialisasi dalam konstruktor seperti ini:
// No initialization when is declaredprivatefinalint number;publicMyClass(int n){// The variable can be assigned in the constructor, but then// not modified later.
number = n;}
Sekarang, untuk setiap instance MyClass, kita dapat memiliki nilai yang berbeda tetapi tidak berubah number.
Sampai enum tersedia di Java 5, final statis adalah cara yang biasa untuk mendeklarasikan konstanta.
Vineet Reynolds
22
@Vineet: final statis masih merupakan cara untuk mendeklarasikan konstanta primitif, kecuali jika Anda memiliki jumlah enumerasi dari mereka =)
Chii
@ Matius: Berpotensi. Bukan untuk konstanta, tetapi untuk beberapa nilai yang terkait secara logika. Lagipula aku tidak terlalu suka lajang.
Jon Skeet
1
Sebuah pertanyaan radikal. Apakah perlu menggunakan private finallebih dari private static finaluntuk memeras / merebut kembali sedikit memori dari kelas? Katakanlah untuk calculatorperangkat dengan ram terbatas tetapi banyak sumber daya CPU.
Menangkan Myo Htet
1
@ WinMyoHtet: Jika Anda menggunakan bidang statis, hanya ada satu total. Jika Anda menggunakan bidang instance, ada satu per instance. Menggunakan bidang statis akan menjadi lebih baik kecuali jika Anda tidak memiliki instance, dalam hal ini tetap tidak berguna.
Jon Skeet
38
Untuk final , dapat diberikan nilai yang berbeda saat runtime saat diinisialisasi. Sebagai contoh
Dengan demikian setiap instance memiliki nilai bidang yang berbeda a .
Untuk final statis , semua instance memiliki nilai yang sama, dan tidak dapat diubah setelah diinisialisasi pertama kali.
ClassTestStatic{publicstaticfinalint a;}TestStatic t1 =newTestStatic();
t1.a =10;TestStatic t2 =newTestStatic();
t1.a =20;// ERROR, CAN'T BE ALTERED AFTER THE FIRST INITIALIZATION.
Ini tidak akan dikompilasi! Variabel akhir harus diberi nilai, atau memiliki nilai yang ditetapkan dalam konstruktornya. Jawaban ini akan benar jika 2 konstruktor diberikan, dengan masing-masing memberikan 'a' ke nilai yang berbeda.
MattC
14
Mengkonfirmasi, ini tidak akan dikompilasi. Seperti yang dinyatakan di atas, variabel instance akhir harus di-instantiated sebelum konstruktor selesai, dan variabel-variabel kelas final harus di-instantiasi sebelum kelas dibuat (Anda bisa menggunakan blok statis). Mengapa ini mendapat begitu banyak upvotes?
Rudi Kershaw
seperti yang ditunjukkan MattC, Anda tidak dapat menetapkan ke variabel akhir setelah membuat objek itu - pada kenyataannya, Anda bahkan tidak bisa membuat objek tanpa memberikan nilai ke variabel terakhirnya ...
jamesdeath123
Untuk berjaga-jaga jika ada yang tersandung pada ini, silakan ikuti jawaban MattC.
Faz
Inilah yang menurut saya ditanyakan oleh OP, saya lupa bahwa final dapat diberi nilai pada instantiasi jika tidak diberikan pada deklarasi.
Salsero69
34
Sebuah staticvariabel tetap dalam memori untuk seumur hidup aplikasi, dan diinisialisasi saat loading kelas. Non- staticvariabel diinisialisasi setiap kali Anda membangun newobjek. Secara umum lebih baik digunakan:
privatestaticfinalint NUMBER =10;
Mengapa? Ini mengurangi jejak memori per instance. Mungkin juga menguntungkan untuk hit cache. Dan itu masuk akal: staticharus digunakan untuk hal-hal yang dibagikan di semua instance (alias objek) dari jenis tertentu (alias class).
variabel statis juga dibuat saat runtime. Oleh karena itu Anda dapat menggunakan variabel atau metode tersebut sebelum objek dibuat.
bobby
13
Dengan konvensi pengkodean Java, nama variabel final statis harus semuanya huruf besar.
starblue
@ Martijn Courteaux, bagaimana dengan situasi di mana kelas akan digunakan sekali selama masa pakai aplikasi! private final intakan dihapus dari memori ketika instance akan GC'ed sedangkan private static final intakan tetap dalam memori sepanjang umur aplikasi itu. Apa yang Anda sarankan dalam skenario di atas?
MANN
@MANN: Ini sangat teoretis. Tidak ada skenario use case yang berguna untuk itu. Ini bisa bermanfaat jika Anda memiliki 50000 int vars di kelas. Bahkan dalam kasus ini, ini akan menghemat memori hingga 200kb. Karena kita berbicara tentang Jawa, ini sepertinya sama sekali tidak relevan. Dalam hal perangkat kritis memori, kompiler C atau C ++ yang layak akan selalu menyejajarkan nilai-nilai integer tersebut, menghilangkan kebutuhan untuk membebaskan memori sepenuhnya.
Martijn Courteaux
17
statis berarti "terkait dengan kelas"; tanpanya, variabel dihubungkan dengan setiap instance kelas. Jika statis, itu berarti Anda hanya memiliki satu di memori; jika tidak, Anda akan memiliki satu untuk setiap instance yang Anda buat. statis berarti variabel akan tetap berada dalam memori selama kelas dimuat; tanpanya, variabel dapat di-gc ketika instance-nya.
Variabel instan mendapatkan gc'd setiap kali semua referensi / objek untuk itu mati, kan?
Ruchir Baronia
Instance adalah gc'd, tetapi statika dikaitkan dengan kelas, bukan instance. Selama kelas masih tersimpan dalam memori, Anda akan dapat merujuk ke instance dan metode statis publiknya. Mereka masuk ke perm gen (atau apa pun yang setara JDK 8) dan tidak gc'd.
duffymo
Salah. Jika Anda memiliki referensi ke instance di memori Anda dapat mengakses metode dan instans yang tersedia. Sisanya salah. Anda gagal memahami perbedaan antara kelas dan instansnya.
duffymo
13
Membaca jawaban yang saya temukan tidak ada tes nyata yang benar-benar langsung ke intinya. Ini 2 sen saya:
Seperti yang saya pikir java membuat perbedaan antara tipe primitif dan lainnya. Tipe primitif di Jawa selalu "di-cache", sama untuk string literal (bukan objek String baru), jadi tidak ada perbedaan antara anggota statis dan non-statis.
Namun ada duplikasi memori untuk anggota non-statis jika mereka bukan turunan dari tipe primitif.
Mengubah nilai valueStatic ke 10 bahkan akan melangkah lebih jauh karena Java akan memberikan alamat yang sama ke dua variabel int.
Autoboxing dari 'int' -> Integer menyebabkan kebingungan di sini. Anda melihat bahwa autoboxing dari beberapa nilai int (kecil) mengarah ke objek Integer yang sama.
dkneller
@StackHola @dkneller Memang, autoboxing adalah detail yang sangat penting yang terjadi di sini. Tanda tangan ObjectUtils.identityToString(Object). (Selain itu, Java tidak memiliki referensi lewat referensi). Tes yang sangat berguna adalah mengalokasikan dua objek dan mengubah nilai public final int FOO = 10variabel menggunakan refleksi Java dengan cara paksa. Kemudian periksa apakah objek lain juga telah mengubah nilainya.
Martijn Courteaux
11
Sementara jawaban lain tampaknya membuatnya cukup jelas bahwa pada umumnya tidak ada alasan untuk menggunakan konstanta non-statis, saya tidak dapat menemukan orang yang menunjukkan bahwa ada kemungkinan untuk memiliki berbagai instance dengan nilai yang berbeda pada variabel konstan mereka.
Perhatikan contoh berikut:
publicclassTestClass{privatefinalstaticdouble NUMBER =Math.random();publicTestClass(){System.out.println(NUMBER);}}
Membuat tiga contoh dari TestClass akan mencetak nilai acak yang sama tiga kali, karena hanya satu nilai yang dihasilkan dan disimpan ke dalam konstanta statis.
Namun, ketika mencoba contoh berikut sebagai gantinya:
publicclassTestClass{privatefinaldouble NUMBER =Math.random();publicTestClass(){System.out.println(NUMBER);}}
Membuat tiga instance dari TestClass sekarang akan mencetak tiga nilai acak yang berbeda, karena setiap instance memiliki nilai konstan yang dihasilkan secara acak.
Saya tidak dapat memikirkan situasi di mana akan sangat berguna untuk memiliki nilai konstan yang berbeda pada contoh yang berbeda, tetapi saya harap ini membantu menunjukkan bahwa ada perbedaan yang jelas antara final statis dan non-statis.
publicclassStaticVariable{staticint noOfInstances;StaticVariable(){
noOfInstances++;}publicstaticvoid main(String[] args){StaticVariable sv1 =newStaticVariable();System.out.println("No. of instances for sv1 : "+ sv1.noOfInstances);StaticVariable sv2 =newStaticVariable();System.out.println("No. of instances for sv1 : "+ sv1.noOfInstances);System.out.println("No. of instances for st2 : "+ sv2.noOfInstances);StaticVariable sv3 =newStaticVariable();System.out.println("No. of instances for sv1 : "+ sv1.noOfInstances);System.out.println("No. of instances for sv2 : "+ sv2.noOfInstances);System.out.println("No. of instances for sv3 : "+ sv3.noOfInstances);}}
Output dari program diberikan di bawah ini:
Seperti yang dapat kita lihat dalam contoh ini setiap objek memiliki salinan variabel kelasnya sendiri.
C:\java>java StaticVariableNo. of instances for sv1 :1No. of instances for sv1 :2No. of instances for st2 :2No. of instances for sv1 :3No. of instances for sv2 :3No. of instances for sv3 :3
Dari tes yang saya buat, variabel final statis tidak sama dengan variabel final (non-statis)! Variabel final (non-statis) dapat berbeda dari objek ke objek !!! Tapi itu hanya jika inisialisasi dibuat di dalam konstruktor! (Jika tidak diinisialisasi dari konstruktor maka itu hanya buang-buang memori karena ia menciptakan variabel akhir untuk setiap objek yang dibuat yang tidak dapat diubah.)
Sebagai contoh:
class A
{finalint f;staticfinalint sf =5;
A(int num){this.f = num;}void show(){System.out.printf("About Object: %s\n Final: %d\n Static Final: %d\n\n",this.toString(),this.f, sf);}publicstaticvoid main(String[] args){
A ob1 =new A(14);
ob1.show();
A ob2 =new A(21);
ob2.show();}}
Apa yang muncul di layar adalah:
Tentang Objek: A @ addbf1 Final: 14 Final Statis: 5
Tentang Objek: A @ 530daa Final: 21 Statis Final: 5
Selanjutnya untuk jawaban Jon jika Anda menggunakan final statis itu akan berperilaku sebagai semacam "definisi". Setelah Anda mengkompilasi kelas yang menggunakannya, itu akan berada dalam file .class yang dikompilasi. Periksa utas saya di sini .
Untuk tujuan utama Anda: Jika Anda tidak menggunakan NUMBER secara berbeda dalam instance kelas yang berbeda, saya akan menyarankan untuk menggunakan final dan statis.
(Anda hanya perlu mengingat untuk tidak menyalin file kelas yang dikompilasi tanpa mempertimbangkan kemungkinan masalah seperti yang dijelaskan dalam studi kasus saya. Sebagian besar kasus ini tidak terjadi, jangan khawatir :))
Untuk menunjukkan kepada Anda cara menggunakan nilai yang berbeda dalam kasus, periksa kode ini:
package test;publicclassTest{finallong OBJECT_ID =newRandom().nextLong();finalstaticlong CLASSS_ID =newRandom().nextLong();publicstaticvoid main(String[] args){Test[] test =newTest[5];for(int i =0; i < test.length; i++){
test[i]=newTest();System.out.println("Class id: "+test[i].CLASSS_ID);//<- Always the same valueSystem.out.println("Object id: "+test[i].OBJECT_ID);//<- Always different}}}
Kuncinya adalah bahwa variabel dan fungsi dapat mengembalikan nilai yang berbeda. Oleh karena itu variabel akhir dapat ditugaskan dengan nilai yang berbeda.
Bisakah Anda jelaskan mana yang lebih baik dan mengapa?
Daniel
2
Contoh sederhana lainnya untuk memahami penggunaan variabel statis, final statis, final. Komentar kode memiliki penjelasan yang tepat.
publicclassCity{// base price that is always same for all objects[For all cities].privatestaticdouble iphone_base_price =10000;// this is total price = iphone_base_price+iphone_diff;privatedouble iphone_citi_price;// extra price added to iphone_base_price. It is constant per city. Every// city has its own difference defined,privatefinaldouble iphone_diff;privateString cityName ="";// static final will be accessible everywhere within the class but cant be// changed once initialized.privatestaticfinalString countryName ="India";publicCity(String cityName,double iphone_diff){super();this.iphone_diff = iphone_diff;
iphone_citi_price = iphone_base_price + iphone_diff;this.cityName = cityName;}/**
* get phone price
*
* @return
*/privatedouble getPrice(){return iphone_citi_price;}/**
* Get city name
*
* @return
*/privateString getCityName(){return cityName;}publicstaticvoid main(String[] args){// 300 is theCity newyork =newCity("Newyork",300);System.out.println(newyork.getPrice()+" "+ newyork.getCityName());City california =newCity("California",800);System.out.println(california.getPrice()+" "+ california.getCityName());// We cant write below statement as a final variable can not be// reassigned// california.iphone_diff=1000; //************************// base price is defined for a class and not per instances.// For any number of object creation, static variable's value would be the same// for all instances until and unless changed.// Also it is accessible anywhere inside a class.
iphone_base_price =9000;City delhi =newCity("delhi",400);System.out.println(delhi.getPrice()+" "+ delhi.getCityName());City moscow =newCity("delhi",500);System.out.println(moscow.getPrice()+" "+ moscow.getCityName());// Here countryName is accessible as it is static but we can not change it as it is final as well. //Something are meant to be accessible with no permission to modify it. //Try un-commenting below statementsSystem.out.println(countryName);// countryName="INDIA";// System.out.println(countryName);}}
Tidak ada banyak perbedaan karena keduanya adalah konstanta. Untuk sebagian besar objek data kelas, statis akan berarti sesuatu yang terkait dengan kelas itu sendiri, hanya ada satu salinan tidak peduli berapa banyak objek yang dibuat dengan yang baru.
Karena ini adalah sebuah konstanta, ia mungkin sebenarnya tidak disimpan di kelas atau dalam sebuah instance, tetapi kompiler masih tidak akan membiarkan Anda mengakses objek instance dari metode statis, bahkan jika ia tahu apa yang akan terjadi. Keberadaan API refleksi mungkin juga memerlukan beberapa pekerjaan yang tidak berguna jika Anda tidak membuatnya statis.
Karena variabel dalam kelas dinyatakan sebagai final DAN diinisialisasi dalam perintah yang sama, sama sekali tidak ada alasan untuk tidak menyatakannya sebagai statis, karena itu akan memiliki nilai yang sama tidak peduli instance. Jadi, semua instance dapat berbagi alamat memori yang sama untuk suatu nilai, sehingga menghemat waktu pemrosesan dengan menghilangkan kebutuhan untuk membuat variabel baru untuk setiap instance dan menghemat memori dengan berbagi 1 alamat umum.
private static final akan dianggap sebagai konstanta dan konstanta hanya dapat diakses di dalam kelas ini. Karena, kata kunci statis disertakan, nilainya akan konstan untuk semua objek kelas.
nilai variabel akhir pribadi akan seperti konstanta per objek.
Anda dapat merujuk java.lang.String atau mencari contoh di bawah ini.
Yang statis adalah anggota yang sama pada semua instance kelas dan kelas itu sendiri.
Non-statis adalah satu untuk setiap instance (objek), jadi dalam kasus Anda yang tepat itu adalah pemborosan memori jika Anda tidak menempatkan statis.
Jika Anda menandai variabel ini statis maka seperti yang Anda tahu, Anda akan memerlukan metode statis untuk mengakses kembali nilai-nilai ini, ini akan berguna jika Anda sudah berpikir untuk menggunakan variabel-variabel ini hanya dalam metode statis. Jika demikian maka ini akan menjadi yang terbaik.
Namun Anda dapat menjadikan variabel sekarang sebagai publik karena tidak ada yang dapat memodifikasinya seperti "System.out", itu lagi tergantung pada niat Anda dan apa yang ingin Anda capai.
Metode statis tidak akan diperlukan untuk mengakses variabel statis - Saya pikir Anda berpikir untuk "mengakses variabel instan dari metode statis" (tidak diizinkan).
ataulm
0
Katakanlah jika kelas tidak akan memiliki lebih dari satu instance, yang mana yang membutuhkan lebih banyak memori:
ID int akhir statis pribadi = 250; atau ID akhir pribadi = 250;
Saya mengerti bahwa statis akan merujuk ke tipe kelas dengan hanya satu salinan di memori dan non statis akan berada di lokasi memori baru untuk setiap variabel instance. Namun secara internal jika kita hanya membandingkan 1 instance dari kelas yang sama (yaitu lebih dari 1 instance tidak akan dibuat), lalu adakah overhead dalam hal ruang yang digunakan oleh 1 variabel final statis?
Tolong jangan hanya mengulang, jawaban apa yang sudah dibahas.
pengguna tidak dikenal
0
Variabel statis milik kelas (yang berarti semua objek berbagi variabel itu). Variabel non statis adalah milik setiap objek.
publicclassExperimentFinal{privatefinalint a;privatestaticfinalint b =999;publicExperimentFinal(int a){super();this.a = a;}publicint getA(){return a;}publicint getB(){return b;}publicvoid print(int a,int b){System.out.println("final int: "+ a +" \nstatic final int: "+ b);}publicstaticvoid main(String[] args){ExperimentFinal test =newExperimentFinal(9);
test.print(test.getA(), test.getB());}}
Seperti yang Anda lihat contoh di atas, untuk "final int" kita dapat menetapkan variabel kita untuk setiap instance (objek) kelas, namun untuk "static final int", kita harus menetapkan variabel di kelas (variabel statis milik kelas tersebut ).
Final: Setelah variabel final telah ditetapkan, selalu berisi nilai yang sama. dimanapun variabelnya statis atau tidak statis: itu hanya akan menjadi satu variabel untuk semua instance yang diinisialisasi satu kali dalam Memori
publicclassLengthDemo{publicstaticvoid main(String[] args){Rectangle box =newRectangle();System.out.println("Sending the value 10.0 "+"to the setLength method.");
box.setLength(10.0);System.out.println("Done.");}}
Kata kunci "Static" membuat properti variabel kelas daripada contoh individu kelas. Akan ada satu salinan dari variabel yang dibagikan di antara semua instance dari kelas itu. Setiap perubahan dalam keadaan variabel statis akan tercermin di semua instance. Tambahkan final ke statis dan kami mendapatkan variabel yang telah diinisialisasi sekali dan untuk semua pada waktu pemuatan kelas dan tidak dapat diubah nanti oleh instance kelas apa pun. Variabel akhir statis perlu diinisialisasi pada waktu deklarasi jika kita memiliki kesalahan waktu kompilasi. Sejauh menyangkut bidang instance pribadi, ini mengacu pada properti / keadaan objek / instance kelas. Setiap instance / objek dari kelas akan memiliki salinan variabel instance sendiri. Ketika variabel instan dinyatakan final, itu berarti kita tidak dapat mengubah nilainya untuk contoh ini. Untuk ini kita perlu menginisialisasi variabel akhir baik di deklarasi atau di konstruktor. Jika tidak dilakukan di salah satu dari mereka, kompilasi kesalahan waktu akan ditampilkan. Setelah diinisialisasi, jika Anda mencoba untuk menetapkan kembali nilai Anda akan mendapatkan kesalahan waktu kompilasi. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Untuk ini kita perlu menginisialisasi variabel akhir baik di deklarasi atau di konstruktor. Jika tidak dilakukan di salah satu dari mereka, kompilasi kesalahan waktu akan ditampilkan. Setelah diinisialisasi, jika Anda mencoba untuk menetapkan kembali nilai Anda akan mendapatkan kesalahan waktu kompilasi. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Untuk ini kita perlu menginisialisasi variabel akhir baik di deklarasi atau di konstruktor. Jika tidak dilakukan di salah satu dari mereka, kompilasi kesalahan waktu akan ditampilkan. Setelah diinisialisasi, jika Anda mencoba untuk menetapkan kembali nilai Anda akan mendapatkan kesalahan waktu kompilasi. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Jika tidak dilakukan di salah satu dari mereka, kompilasi kesalahan waktu akan muncul. Setelah diinisialisasi, jika Anda mencoba untuk menetapkan kembali nilai Anda akan mendapatkan kesalahan waktu kompilasi. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Jika tidak dilakukan di salah satu dari mereka, kompilasi kesalahan waktu akan muncul. Setelah diinisialisasi, jika Anda mencoba untuk menetapkan kembali nilai Anda akan mendapatkan kesalahan waktu kompilasi. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek.
final static
berarti variabel ini adalah konstanta dan hanya terkait dengan kelas itu sendiri, yaitu "satu variabel konstan per kelas" sementara itufinal
berarti "satu variabel konstan per instance". Akibatnya, Anda tidak bisa meletakkanfinal static
variabel dalam konstruktor kelas karena konstruktor melibatkan dalam instance baru . (Anda dapat mencobanya sendiri dan akan mendapatkan kesalahan)final static
variabel dalam konstruktor, satu-satunya cara adalah dengan menggunakan penginisialisasi statis :)Jawaban:
Secara umum,
static
berarti "terkait dengan jenis itu sendiri, bukan contoh dari jenis itu."Itu berarti Anda dapat mereferensikan variabel statis tanpa pernah membuat instance dari tipe, dan kode apa pun yang merujuk ke variabel merujuk ke data yang sama persis. Bandingkan ini dengan variabel instan: dalam hal ini, ada satu versi independen dari variabel per instance kelas. Jadi misalnya:
mencetak 10:
y.instanceVariable
danx.instanceVariable
terpisah, karenax
dany
merujuk ke objek yang berbeda.Anda dapat merujuk anggota statis melalui referensi, meskipun itu ide yang buruk untuk melakukannya. Jika kami melakukannya:
maka itu akan mencetak 20 - hanya ada satu variabel, bukan satu per contoh. Akan lebih jelas untuk menulis ini sebagai:
Itu membuat perilaku jauh lebih jelas. IDE modern biasanya akan menyarankan mengubah daftar kedua menjadi yang ketiga.
Tidak ada alasan untuk memiliki deklarasi inline menginisialisasi nilai seperti berikut, karena setiap instance akan memiliki sendiri
NUMBER
tetapi selalu dengan nilai yang sama (tidak dapat diubah dan diinisialisasi dengan literal). Ini sama dengan hanya memiliki satufinal static
variabel untuk semua instance.Karena itu jika tidak dapat diubah, tidak ada gunanya memiliki satu salinan per instance.
Tapi, masuk akal jika diinisialisasi dalam konstruktor seperti ini:
Sekarang, untuk setiap instance
MyClass
, kita dapat memiliki nilai yang berbeda tetapi tidak berubahnumber
.sumber
private final
lebih dariprivate static final
untuk memeras / merebut kembali sedikit memori dari kelas? Katakanlah untukcalculator
perangkat dengan ram terbatas tetapi banyak sumber daya CPU.Untuk final , dapat diberikan nilai yang berbeda saat runtime saat diinisialisasi. Sebagai contoh
Dengan demikian setiap instance memiliki nilai bidang yang berbeda a .
Untuk final statis , semua instance memiliki nilai yang sama, dan tidak dapat diubah setelah diinisialisasi pertama kali.
sumber
Sebuah
static
variabel tetap dalam memori untuk seumur hidup aplikasi, dan diinisialisasi saat loading kelas. Non-static
variabel diinisialisasi setiap kali Anda membangunnew
objek. Secara umum lebih baik digunakan:Mengapa? Ini mengurangi jejak memori per instance. Mungkin juga menguntungkan untuk hit cache. Dan itu masuk akal:
static
harus digunakan untuk hal-hal yang dibagikan di semua instance (alias objek) dari jenis tertentu (aliasclass
).sumber
private final int
akan dihapus dari memori ketika instance akan GC'ed sedangkanprivate static final int
akan tetap dalam memori sepanjang umur aplikasi itu. Apa yang Anda sarankan dalam skenario di atas?statis berarti "terkait dengan kelas"; tanpanya, variabel dihubungkan dengan setiap instance kelas. Jika statis, itu berarti Anda hanya memiliki satu di memori; jika tidak, Anda akan memiliki satu untuk setiap instance yang Anda buat. statis berarti variabel akan tetap berada dalam memori selama kelas dimuat; tanpanya, variabel dapat di-gc ketika instance-nya.
sumber
Membaca jawaban yang saya temukan tidak ada tes nyata yang benar-benar langsung ke intinya. Ini 2 sen saya:
Hasil untuk objek pertama:
Hasil untuk objek ke-2:
Kesimpulan:
Seperti yang saya pikir java membuat perbedaan antara tipe primitif dan lainnya. Tipe primitif di Jawa selalu "di-cache", sama untuk string literal (bukan objek String baru), jadi tidak ada perbedaan antara anggota statis dan non-statis.
Namun ada duplikasi memori untuk anggota non-statis jika mereka bukan turunan dari tipe primitif.
Mengubah nilai valueStatic ke 10 bahkan akan melangkah lebih jauh karena Java akan memberikan alamat yang sama ke dua variabel int.
sumber
ObjectUtils.identityToString(Object)
. (Selain itu, Java tidak memiliki referensi lewat referensi). Tes yang sangat berguna adalah mengalokasikan dua objek dan mengubah nilaipublic final int FOO = 10
variabel menggunakan refleksi Java dengan cara paksa. Kemudian periksa apakah objek lain juga telah mengubah nilainya.Sementara jawaban lain tampaknya membuatnya cukup jelas bahwa pada umumnya tidak ada alasan untuk menggunakan konstanta non-statis, saya tidak dapat menemukan orang yang menunjukkan bahwa ada kemungkinan untuk memiliki berbagai instance dengan nilai yang berbeda pada variabel konstan mereka.
Perhatikan contoh berikut:
Membuat tiga contoh dari TestClass akan mencetak nilai acak yang sama tiga kali, karena hanya satu nilai yang dihasilkan dan disimpan ke dalam konstanta statis.
Namun, ketika mencoba contoh berikut sebagai gantinya:
Membuat tiga instance dari TestClass sekarang akan mencetak tiga nilai acak yang berbeda, karena setiap instance memiliki nilai konstan yang dihasilkan secara acak.
Saya tidak dapat memikirkan situasi di mana akan sangat berguna untuk memiliki nilai konstan yang berbeda pada contoh yang berbeda, tetapi saya harap ini membantu menunjukkan bahwa ada perbedaan yang jelas antara final statis dan non-statis.
sumber
Seperti yang sudah dikatakan Jon, variabel statis, juga disebut sebagai variabel kelas, adalah variabel yang ada di seluruh instance kelas.
Saya menemukan contohnya di sini :
Output dari program diberikan di bawah ini:
Seperti yang dapat kita lihat dalam contoh ini setiap objek memiliki salinan variabel kelasnya sendiri.
sumber
Dari tes yang saya buat, variabel final statis tidak sama dengan variabel final (non-statis)! Variabel final (non-statis) dapat berbeda dari objek ke objek !!! Tapi itu hanya jika inisialisasi dibuat di dalam konstruktor! (Jika tidak diinisialisasi dari konstruktor maka itu hanya buang-buang memori karena ia menciptakan variabel akhir untuk setiap objek yang dibuat yang tidak dapat diubah.)
Sebagai contoh:
Apa yang muncul di layar adalah:
Tentang Objek: A @ addbf1 Final: 14 Final Statis: 5
Tentang Objek: A @ 530daa Final: 21 Statis Final: 5
Mahasiswa IT tahun pertama yang anonim, Yunani
sumber
Selanjutnya untuk jawaban Jon jika Anda menggunakan final statis itu akan berperilaku sebagai semacam "definisi". Setelah Anda mengkompilasi kelas yang menggunakannya, itu akan berada dalam file .class yang dikompilasi. Periksa utas saya di sini .
Untuk tujuan utama Anda: Jika Anda tidak menggunakan NUMBER secara berbeda dalam instance kelas yang berbeda, saya akan menyarankan untuk menggunakan final dan statis. (Anda hanya perlu mengingat untuk tidak menyalin file kelas yang dikompilasi tanpa mempertimbangkan kemungkinan masalah seperti yang dijelaskan dalam studi kasus saya. Sebagian besar kasus ini tidak terjadi, jangan khawatir :))
Untuk menunjukkan kepada Anda cara menggunakan nilai yang berbeda dalam kasus, periksa kode ini:
sumber
Ini dua sen saya:
Contoh:
Kuncinya adalah bahwa variabel dan fungsi dapat mengembalikan nilai yang berbeda. Oleh karena itu variabel akhir dapat ditugaskan dengan nilai yang berbeda.
sumber
Contoh sederhana lainnya untuk memahami penggunaan variabel statis, final statis, final. Komentar kode memiliki penjelasan yang tepat.
sumber
sangat sedikit, dan statis
Tidak ada banyak perbedaan karena keduanya adalah konstanta. Untuk sebagian besar objek data kelas, statis akan berarti sesuatu yang terkait dengan kelas itu sendiri, hanya ada satu salinan tidak peduli berapa banyak objek yang dibuat dengan yang baru.
Karena ini adalah sebuah konstanta, ia mungkin sebenarnya tidak disimpan di kelas atau dalam sebuah instance, tetapi kompiler masih tidak akan membiarkan Anda mengakses objek instance dari metode statis, bahkan jika ia tahu apa yang akan terjadi. Keberadaan API refleksi mungkin juga memerlukan beberapa pekerjaan yang tidak berguna jika Anda tidak membuatnya statis.
sumber
Karena variabel dalam kelas dinyatakan sebagai final DAN diinisialisasi dalam perintah yang sama, sama sekali tidak ada alasan untuk tidak menyatakannya sebagai statis, karena itu akan memiliki nilai yang sama tidak peduli instance. Jadi, semua instance dapat berbagi alamat memori yang sama untuk suatu nilai, sehingga menghemat waktu pemrosesan dengan menghilangkan kebutuhan untuk membuat variabel baru untuk setiap instance dan menghemat memori dengan berbagi 1 alamat umum.
sumber
private static final akan dianggap sebagai konstanta dan konstanta hanya dapat diakses di dalam kelas ini. Karena, kata kunci statis disertakan, nilainya akan konstan untuk semua objek kelas.
nilai variabel akhir pribadi akan seperti konstanta per objek.
Anda dapat merujuk java.lang.String atau mencari contoh di bawah ini.
//Keluaran:
sumber
Yang statis adalah anggota yang sama pada semua instance kelas dan kelas itu sendiri.
Non-statis adalah satu untuk setiap instance (objek), jadi dalam kasus Anda yang tepat itu adalah pemborosan memori jika Anda tidak menempatkan statis.
sumber
Jika Anda menandai variabel ini statis maka seperti yang Anda tahu, Anda akan memerlukan metode statis untuk mengakses kembali nilai-nilai ini, ini akan berguna jika Anda sudah berpikir untuk menggunakan variabel-variabel ini hanya dalam metode statis. Jika demikian maka ini akan menjadi yang terbaik.
Namun Anda dapat menjadikan variabel sekarang sebagai publik karena tidak ada yang dapat memodifikasinya seperti "System.out", itu lagi tergantung pada niat Anda dan apa yang ingin Anda capai.
sumber
Katakanlah jika kelas tidak akan memiliki lebih dari satu instance, yang mana yang membutuhkan lebih banyak memori:
ID int akhir statis pribadi = 250; atau ID akhir pribadi = 250;
Saya mengerti bahwa statis akan merujuk ke tipe kelas dengan hanya satu salinan di memori dan non statis akan berada di lokasi memori baru untuk setiap variabel instance. Namun secara internal jika kita hanya membandingkan 1 instance dari kelas yang sama (yaitu lebih dari 1 instance tidak akan dibuat), lalu adakah overhead dalam hal ruang yang digunakan oleh 1 variabel final statis?
sumber
Variabel statis milik kelas (yang berarti semua objek berbagi variabel itu). Variabel non statis adalah milik setiap objek.
Seperti yang Anda lihat contoh di atas, untuk "final int" kita dapat menetapkan variabel kita untuk setiap instance (objek) kelas, namun untuk "static final int", kita harus menetapkan variabel di kelas (variabel statis milik kelas tersebut ).
sumber
Jika Anda menggunakan statis, nilai variabel akan sama di seluruh instance Anda, jika diubah dalam satu contoh, yang lain juga akan berubah.
sumber
Final: Setelah variabel final telah ditetapkan, selalu berisi nilai yang sama. dimanapun variabelnya statis atau tidak statis: itu hanya akan menjadi satu variabel untuk semua instance yang diinisialisasi satu kali dalam Memori
sumber
Ini mungkin bisa membantu
sumber
Kata kunci "Static" membuat properti variabel kelas daripada contoh individu kelas. Akan ada satu salinan dari variabel yang dibagikan di antara semua instance dari kelas itu. Setiap perubahan dalam keadaan variabel statis akan tercermin di semua instance. Tambahkan final ke statis dan kami mendapatkan variabel yang telah diinisialisasi sekali dan untuk semua pada waktu pemuatan kelas dan tidak dapat diubah nanti oleh instance kelas apa pun. Variabel akhir statis perlu diinisialisasi pada waktu deklarasi jika kita memiliki kesalahan waktu kompilasi. Sejauh menyangkut bidang instance pribadi, ini mengacu pada properti / keadaan objek / instance kelas. Setiap instance / objek dari kelas akan memiliki salinan variabel instance sendiri. Ketika variabel instan dinyatakan final, itu berarti kita tidak dapat mengubah nilainya untuk contoh ini. Untuk ini kita perlu menginisialisasi variabel akhir baik di deklarasi atau di konstruktor. Jika tidak dilakukan di salah satu dari mereka, kompilasi kesalahan waktu akan ditampilkan. Setelah diinisialisasi, jika Anda mencoba untuk menetapkan kembali nilai Anda akan mendapatkan kesalahan waktu kompilasi. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Untuk ini kita perlu menginisialisasi variabel akhir baik di deklarasi atau di konstruktor. Jika tidak dilakukan di salah satu dari mereka, kompilasi kesalahan waktu akan ditampilkan. Setelah diinisialisasi, jika Anda mencoba untuk menetapkan kembali nilai Anda akan mendapatkan kesalahan waktu kompilasi. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Untuk ini kita perlu menginisialisasi variabel akhir baik di deklarasi atau di konstruktor. Jika tidak dilakukan di salah satu dari mereka, kompilasi kesalahan waktu akan ditampilkan. Setelah diinisialisasi, jika Anda mencoba untuk menetapkan kembali nilai Anda akan mendapatkan kesalahan waktu kompilasi. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Jika tidak dilakukan di salah satu dari mereka, kompilasi kesalahan waktu akan muncul. Setelah diinisialisasi, jika Anda mencoba untuk menetapkan kembali nilai Anda akan mendapatkan kesalahan waktu kompilasi. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Jika tidak dilakukan di salah satu dari mereka, kompilasi kesalahan waktu akan muncul. Setelah diinisialisasi, jika Anda mencoba untuk menetapkan kembali nilai Anda akan mendapatkan kesalahan waktu kompilasi. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Gunakan variabel final statis di mana data akan dibagikan di semua instance kelas dan Anda ingin agar data hanya dibaca. Gunakan variabel final contoh jika Anda ingin merepresentasikan beberapa data yang dimiliki oleh setiap instance individu dari kelas tetapi sekali saja disimpan tidak dapat diubah. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek. Penggunaan kata kunci statis dan instan tergantung pada kebutuhan desain Anda dan apa yang direpresentasikan oleh data tersebut di domain. Jika data digunakan di seluruh instance kelas maka tidak perlu salinan individu / referensi memori untuk setiap objek.
sumber