Jika suatu variabel dinyatakan sebagai public static varName;
, maka saya dapat mengaksesnya dari mana saja sebagai ClassName.varName
. Saya juga sadar bahwa anggota statis dibagikan oleh semua instance kelas dan tidak dialokasikan kembali di setiap instance.
Apakah mendeklarasikan variabel private static varName;
berbeda dengan mendeklarasikan variabelprivate varName;
?
Dalam kedua kasus itu tidak dapat diakses sebagai ClassName.varName
atau sebagaiClassInstance.varName
dari kelas lain.
Apakah mendeklarasikan variabel sebagai statis memberikannya properti khusus lainnya?
Jawaban:
Tentu saja dapat diakses sebagai
ClassName.var_name
, tetapi hanya dari dalam kelas di mana ia didefinisikan - itu karena itu didefinisikan sebagaiprivate
.public static
atauprivate static
variabel sering digunakan untuk konstanta. Misalnya, banyak orang tidak suka konstanta "kode keras" dalam kode mereka; mereka suka membuatpublic static
atauprivate static
variabel dengan nama yang bermakna dan menggunakannya dalam kode mereka, yang seharusnya membuat kode lebih mudah dibaca. (Anda juga harus membuat konstanta seperti itufinal
).Sebagai contoh:
Apakah Anda membuatnya
public
atauprivate
tergantung pada apakah Anda ingin variabel terlihat di luar kelas atau tidak.sumber
ClassName.var_nam
? Di mana saya dapat mengaksesnya langsung: divar_nam
dalam kelasVariabel statis memiliki nilai tunggal untuk semua instance kelas.
Jika Anda membuat sesuatu seperti:
dan kemudian Anda ingin mengubah nama Anda, tidak apa-apa, nama saya tetap sama. Namun, jika Anda ingin mengubahnya sehingga Anda memiliki 17 mata maka semua orang di dunia juga akan memiliki 17 mata.
sumber
Variabel privat statis berguna dengan cara yang sama dengan variabel instance pribadi berguna: variabel tersebut menyimpan status yang hanya diakses oleh kode dalam kelas yang sama. Aksesibilitas (pribadi / publik / dll) dan sifat instance / statis dari variabel sepenuhnya konsep ortogonal.
Saya akan menghindari memikirkan variabel statis sebagai dibagi antara "semua instance" dari kelas - yang menunjukkan harus ada setidaknya satu contoh untuk negara hadir. Tidak - variabel statis terkait dengan jenis itu sendiri bukan saja contoh dari jenis.
Jadi, setiap kali Anda menginginkan keadaan yang dikaitkan dengan jenis daripada kejadian tertentu, dan Anda ingin merahasiakan keadaan itu (mungkin memungkinkan akses terkontrol melalui properti, misalnya) masuk akal untuk memiliki variabel statis pribadi.
Sebagai tambahan, saya akan sangat menyarankan bahwa satu - satunya jenis variabel yang Anda buat publik (atau bahkan non-pribadi) adalah konstanta - variabel akhir statis dari tipe yang tidak dapat diubah. Segala sesuatu yang lain harus bersifat pribadi untuk memisahkan API dan implementasi (antara lain).
sumber
Yah Anda benar variabel statis publik digunakan tanpa membuat instance dari kelas tetapi variabel statis pribadi tidak. Perbedaan utama antara mereka dan di mana saya menggunakan variabel statis pribadi adalah ketika Anda perlu menggunakan variabel dalam fungsi statis. Untuk fungsi statis, Anda hanya dapat menggunakan variabel statis, sehingga Anda membuatnya pribadi untuk tidak mengaksesnya dari kelas lain. Itu adalah satu-satunya kasus saya menggunakan private static untuk.
Berikut ini sebuah contoh:
sumber
Person
, maka itu mungkin akan menjadi bug, karena Anda tidak dapat memiliki beberapa orang dengan usia yang berbeda (jika itu adalah use case yang dimaksudkan).Nah,
private static
variabel dapat digunakan untuk berbagi data di seluruh instance kelas itu. Meskipun Anda benar bahwa kami tidak dapat mengaksesprivate static
variabel menggunakan konstruk sepertiClassName.member
atauClassInstance.member
tetapi anggota akan selalu terlihat dari metode kelas itu atau contoh dari kelas itu. Jadi pada dasarnya instance dari kelas itu akan selalu dapat merujuk ke anggota.sumber
Apa gunanya variabel kelas privat statis?
Katakanlah Anda memiliki kelas buku perpustakaan. Setiap kali Anda membuat Buku baru, Anda ingin memberikannya id unik. Salah satu caranya adalah dengan mulai dari 0 dan menambah nomor id. Tapi, bagaimana semua buku lain tahu nomor id yang terakhir dibuat? Sederhana, simpan sebagai variabel statis. Apakah pelanggan perlu tahu bahwa nomor id internal aktual untuk setiap buku? Tidak. Informasi itu rahasia.
Ini adalah contoh yang dibuat-buat, tapi saya yakin Anda dapat dengan mudah memikirkan kasus-kasus di mana Anda ingin semua instance kelas memiliki akses ke informasi umum yang harus dirahasiakan dari orang lain. Atau bahkan jika Anda tidak bisa, itu adalah praktik pemrograman yang baik untuk membuat hal-hal se-privat mungkin. Bagaimana jika Anda secara tidak sengaja membuat bidang numBooks itu publik, meskipun pengguna Buku tidak seharusnya melakukan apa pun dengannya. Kemudian seseorang dapat mengubah jumlah Buku tanpa membuat Buku baru.
Sangat licik!
sumber
Ya, keduanya berbeda. Dan yang pertama disebut
class variable
karena memiliki nilai tunggal untuk ituclass
sedangkan yang lain disebutinstance variable
karena dapat memiliki nilai yang berbeda untuk yang berbedainstances(Objects)
. Yang pertama dibuat hanya satu kali dalam jvm dan yang lain dibuat sekali per instance yaitu jika Anda memiliki 10 instance maka Anda akan memiliki 10 berbedaprivate varName;
dalam jvm.Ya, variabel statis mendapatkan beberapa properti yang berbeda dari variabel instance normal. Saya sudah menyebutkan beberapa dan mari kita lihat beberapa di sini:
class variables
(variabel instan yang dinyatakan sebagai statis) dapat diakses langsung dengan menggunakan nama kelas sepertiClassName.varName
. Dan objek apa pun dari kelas itu dapat mengakses dan mengubah nilainya, tidak seperti variabel instan diakses hanya oleh objeknya masing-masing. Variabel kelas dapat digunakan dalam metode statis.Logikanya,
private static variable
tidak ada bedanyapublic static variable
dengan yang pertama memberi Anda lebih banyak kontrol. IMO, Anda benar-benar dapat menggantipublic static variable
denganprivate static variable
dengan bantuanpublic static
getter dan setter metode.Satu area yang banyak digunakan
private static variable
adalah dalam penerapanSingleton
pola sederhana di mana Anda hanya akan memiliki satu instance dari kelas itu di seluruh dunia. Di sinistatic
pengidentifikasi memainkan peran penting untuk membuat satu instance dapat diakses oleh dunia luar (Tentu saja metode pengambil statis publik juga memainkan peran utama).sumber
Kata kunci pribadi akan digunakan untuk akses variabel dalam kelas dan menjaga statis dalam arti kita dapat mengakses variabel dalam metode statis juga, tetapi variabel referensi tidak dapat mengakses dalam metode statis.
sumber
Perspektif lain:
sumber
Ketika dalam metode statis Anda menggunakan variabel, variabel harus statis juga sebagai contoh:
sumber
Variabel statis adalah variabel-variabel yang umum untuk semua instance kelas..Jika satu instance mengubahnya, maka nilai variabel statis akan diperbarui untuk semua instance lainnya
sumber
Bagi sebagian orang ini lebih masuk akal jika mereka melihatnya dalam beberapa bahasa yang berbeda jadi saya menulis contoh di Jawa, dan PHP di halaman saya di mana saya menjelaskan beberapa pengubah ini. Anda mungkin salah memikirkan hal ini.
Anda harus melihat contoh saya jika itu tidak masuk akal di bawah ini. Buka di sini http://www.siteconsortium.com/h/D0000D.php
Namun intinya adalah bahwa itu persis seperti apa yang dikatakannya. Ini adalah variabel anggota statis yang bersifat pribadi. Misalnya jika Anda ingin membuat objek Singleton mengapa Anda ingin membuat variabel SingletonExample.instance publik. Jika Anda melakukannya seseorang yang menggunakan kelas dapat dengan mudah menimpa nilainya.
Hanya itu saja.
sumber
Jika Anda menggunakan variabel statis pribadi di kelas Anda, kelas-kelas Inner Statis di kelas Anda dapat mencapai variabel Anda. Ini sangat baik untuk keamanan konteks.
sumber
Jika suatu variabel didefinisikan sebagai public static, ia dapat diakses melalui nama kelasnya dari kelas apa pun.
Biasanya fungsi didefinisikan sebagai public static yang dapat diakses hanya dengan memanggil nama kelas pelaksana.
Contoh yang sangat bagus adalah
sleep()
metode di kelas ThreadJika variabel didefinisikan sebagai privat statis, ia hanya dapat diakses di dalam kelas itu sehingga tidak perlu nama kelas atau Anda masih dapat menggunakan nama kelas (terserah Anda). Perbedaan antara private var_name dan private static var_name adalah bahwa variabel statis pribadi hanya dapat diakses dengan metode statis kelas sementara variabel pribadi dapat diakses oleh metode apa pun dari kelas itu (kecuali metode statis)
Contoh yang sangat bagus adalah ketika mendefinisikan koneksi database atau konstanta yang memerlukan mendeklarasikan variabel sebagai private static.
Contoh umum lainnya adalah
sumber
Saya baru mengenal Java, tetapi satu cara saya menggunakan variabel statis, seperti yang saya asumsikan banyak orang lakukan, adalah dengan menghitung jumlah instance kelas. misalnya:
Maka Anda dapat sysout:
Anda juga bisa mendapatkan akses ke numCompanies dari setiap instance kelas (yang saya tidak sepenuhnya mengerti), tetapi itu tidak akan berada dalam "cara statis". Saya tidak tahu apakah ini praktik terbaik atau tidak, tetapi masuk akal bagi saya.
sumber
*) Jika suatu variabel dinyatakan sebagai pribadi maka tidak terlihat di luar kelas. Ini disebut sebagai datahiding.
*) Jika suatu variabel dinyatakan sebagai statis maka nilai variabel tersebut sama untuk semua instance dan kita tidak perlu membuat objek untuk memanggil variabel itu. Kita dapat memanggil variabel itu hanya dengan
classname.variablename;
sumber
variabel statis pribadi akan dibagikan dalam subkelas juga. Jika Anda berubah dalam satu subkelas dan subkelas lainnya akan mendapatkan nilai yang diubah, dalam hal ini, mungkin tidak seperti yang Anda harapkan.
sumber
ThreadLocal
variabel biasanya diimplementasikan sebagaiprivate static
. Dengan cara ini, mereka tidak terikat ke kelas dan setiap utas memiliki referensi sendiri ke objek "ThreadLocal" sendiri.sumber
Dalam contoh berikut,
eye
diubah oleh PersonB, sementaraleg
tetap sama. Ini karena variabel pribadi membuat salinan dirinya ke metode, sehingga nilai aslinya tetap sama; sementara nilai statis pribadi hanya memiliki satu salinan untuk semua metode untuk dibagikan, jadi mengedit nilainya akan mengubah nilai aslinya.}
sumber