Apa gunanya variabel statis pribadi di Jawa?

156

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.varNameatau sebagaiClassInstance.varName dari kelas lain.

Apakah mendeklarasikan variabel sebagai statis memberikannya properti khusus lainnya?

Vaibhav Jani
sumber
5
Nama variabel Java tidak boleh mengandung tanda hubung (-).
Martijn Courteaux

Jawaban:

127

Tentu saja dapat diakses sebagai ClassName.var_name, tetapi hanya dari dalam kelas di mana ia didefinisikan - itu karena itu didefinisikan sebagai private.

public staticatau private staticvariabel sering digunakan untuk konstanta. Misalnya, banyak orang tidak suka konstanta "kode keras" dalam kode mereka; mereka suka membuat public staticatau private staticvariabel dengan nama yang bermakna dan menggunakannya dalam kode mereka, yang seharusnya membuat kode lebih mudah dibaca. (Anda juga harus membuat konstanta seperti itu final).

Sebagai contoh:

public class Example {
    private final static String JDBC_URL = "jdbc:mysql://localhost/shopdb";
    private final static String JDBC_USERNAME = "username";
    private final static String JDBC_PASSWORD = "password";

    public static void main(String[] args) {
        Connection conn = DriverManager.getConnection(JDBC_URL,
                                         JDBC_USERNAME, JDBC_PASSWORD);

        // ...
    }
}

Apakah Anda membuatnya publicatau privatetergantung pada apakah Anda ingin variabel terlihat di luar kelas atau tidak.

Jesper
sumber
6
Apa yang diperlukan untuk mengakses ClassName.var_nam? Di mana saya dapat mengaksesnya langsung: di var_namdalam kelas
Vaibhav Jani
12
Tidak perlu mengaksesnya melalui nama kelas, tetapi beberapa orang berpikir itu adalah gaya yang baik, untuk membedakannya dari variabel non-statis.
Jesper
5
apa yang diperlukan untuk mengaksesnya menggunakan variabel statis, Kita dapat menulis "private final String JDBC_PASSWORD =" password ";" alih-alih menggunakan variabel statis untuk string kata sandi ini.
chaitanya
48
@ Chaitanya Ini konstan. Mengapa Anda ingin memiliki salinan variabel untuk setiap instance kelas dengan membuatnya tidak statis?
Jesper
16
statis adalah variabel level kelas, yang umum dan hanya ada satu salinan untuk semua instance kelas itu. Aturan ini berlaku apakah itu pribadi atau publik. pribadi hanya mengatakan saya tidak ingin dunia luar merusak nilai variabel saya (untuk statika non-final). Jika statis adalah final maka tidak ada salahnya menjadikannya sebagai publik, karena tidak ada yang dapat mengubah nilainya.
user1923551
94

Variabel statis memiliki nilai tunggal untuk semua instance kelas.

Jika Anda membuat sesuatu seperti:

public class Person
{
    private static int numberOfEyes;
    private String name;
}

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.

TofuBeer
sumber
3
Ini tidak berlaku untuk variabel statis pribadi kecuali Anda juga menulis metode accessor untuk variabel pribadi karena mereka tidak dapat diakses dari luar kelas.
Ganesh Krishnan
2
Tidak benar @ GaneshKrishnan, instance kelas mana pun memiliki akses ke kedua variabel. Tentu saja Anda dapat berharap bahwa penulis kelas tidak akan melakukan sesuatu yang konyol. Juga, dengan refleksi dan JNI, semua taruhan dibatalkan.
TofuBeer
46

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).

Jon Skeet
sumber
Bisakah Anda menjelaskan sedikit lebih banyak tentang perbedaan private static dan private bukan variabel static access dalam satu kelas?
Dharmendra
1
@ Dharmendra: Tidak jelas bagi saya apa maksud Anda. Bagian pribadi tidak relevan - apa sebenarnya yang membingungkan Anda tentang perbedaan antara variabel statis dan variabel instan?
Jon Skeet
Apa perbedaan dalam aksesibilitas ketika kita menggunakan variabel statis dan non-statis dalam satu kelas di mana mereka dideklarasikan?
Dharmendra
2
@YogGuru: Saya tidak melihat relevansi pertanyaan. Jadikan pribadi jika Anda ingin menjadi pribadi, dan statis jika Anda ingin menjadi statis. Mereka ortogonal.
Jon Skeet
1
@ryvantage: Tidak, tidak sama sekali. Metode statis dapat mengaksesnya tanpa masalah.
Jon Skeet
11

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:

Class test {
   public static String name = "AA";
   private static String age;

   public static void setAge(String yourAge) {
       //here if the age variable is not static you will get an error that you cannot access non static variables from static procedures so you have to make it static and private to not be accessed from other classes
       age = yourAge;
   }
}
Farid Farhat
sumber
3
Saya pikir saya paling suka jawaban ini. +1. Satu-satunya waktu yang masuk akal untuk menggunakan statis dalam variabel pribadi adalah jika metode statis mengaksesnya.
Mukus
Tanpa memberi kelas nama yang tepat, Anda tidak dapat benar-benar mengatakan apakah ini kasus penggunaan yang valid. Seperti, jika kelas dipanggil 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).
DanMan
Saya setuju @Mukus. Ini mungkin satu-satunya jawaban nyata untuk pertanyaan ini. Saya pikir OP sudah mengerti statis tetapi orang-orang tampaknya ingin menjelaskannya lagi. Dia bertanya tentang skenario tertentu. Kemampuan untuk mengakses variabel dalam metode statis adalah fungsi yang ditambahkan 'privat statis'. Saya hanya ingin juga menambahkan bahwa itu memungkinkan CLASSES statis bersarang akses ke variabel juga.
Pinkerton
1
Bagaimana dengan memori? Dengan statis, Anda hanya akan membuat satu salinan untuk kelas alih-alih salinan untuk setiap instance. Dan jelas dengan konstanta, Anda hanya perlu satu salinan untuk kelas. Apakah ini menghemat memori?
Pinkerton
1
Saya mencarinya. Jawaban untuk pertanyaan saya sebelumnya adalah: ya, itu menghemat memori
Pinkerton
8

Nah, private staticvariabel dapat digunakan untuk berbagi data di seluruh instance kelas itu. Meskipun Anda benar bahwa kami tidak dapat mengakses private staticvariabel menggunakan konstruk seperti ClassName.memberatau ClassInstance.membertetapi 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.

Swaranga Sarma
sumber
6

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.

public class Book {
    private static int numBooks = 0;
    private int id;
    public String name;

    Book(String name) {
        id = numBooks++;
        this.name = name;
    }
}

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!

iheanyi
sumber
6

Apakah mendeklarasikan variabel private static varName;berbeda dengan mendeklarasikan variabel private varName;?

Ya, keduanya berbeda. Dan yang pertama disebut class variablekarena memiliki nilai tunggal untuk itu classsedangkan yang lain disebut instance variablekarena dapat memiliki nilai yang berbeda untuk yang berbeda instances(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 berbeda private varName;dalam jvm.

Apakah mendeklarasikan variabel sebagai staticmemberikannya properti khusus lainnya?

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 seperti ClassName.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.

Apa gunanya a private static variabledi Jawa?

Logikanya, private static variabletidak ada bedanya public static variabledengan yang pertama memberi Anda lebih banyak kontrol. IMO, Anda benar-benar dapat mengganti public static variabledengan private static variabledengan bantuan public staticgetter dan setter metode.

Satu area yang banyak digunakan private static variable adalah dalam penerapan Singletonpola sederhana di mana Anda hanya akan memiliki satu instance dari kelas itu di seluruh dunia. Di sini staticpengidentifikasi memainkan peran penting untuk membuat satu instance dapat diakses oleh dunia luar (Tentu saja metode pengambil statis publik juga memainkan peran utama).

public class Singleton {
    private static Singleton singletonInstance = new Singleton();

    private Singleton(){}

    public static Singleton getInstance(){
        return Singleton.singletonInstance;
    }
}
avr
sumber
4

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.

Raam
sumber
3

Perspektif lain:

  1. Kelas dan turunannya adalah dua hal yang berbeda saat runtime. Info kelas "dibagikan" oleh semua instance kelas itu.
  2. Variabel kelas non-statis milik instance dan variabel statis milik kelas.
  3. Seperti halnya variabel instan dapat menjadi privat atau publik, variabel statis juga bisa privat atau publik.
Santosh
sumber
1

Ketika dalam metode statis Anda menggunakan variabel, variabel harus statis juga sebagai contoh:

private static int a=0;  
public static void testMethod() {  
        a=1;  
}
Neifen
sumber
3
Nah, kecuali jika metode Anda diberikan referensi ke instance kelas tentu saja.
Jon Skeet
1

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

Nagesh Tripathi
sumber
1

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.

    kelas publik SingletonExample {
      instance statis SingletonExample pribadi = null;
      nilai int statis privat = 0;
      private SingletonExample () {
        ++ this.value;
      }
      publik SingletonExample getInstance () {
        if (instance! = null)
        kembali contoh;
        disinkronkan (SingletonExample.class) {
        instance = SingletonExample baru ();
        kembali contoh;
        }
      }
      publicvoid printValue () {
        System.out.print (this.value);
      }

      public static public void (String [] args) {
        SingletonExample instance = getInstance ();
        instance.printValue ();
        instance = getInstance ();
        instance.printValue ();
         }
    }

JTHouseCat
sumber
1

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.

Erdal76t
sumber
0

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 Thread

Thread.sleep(2500);

Jika 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

private static int numberOfCars=10;

public static int returnNumber(){

return numberOfCars;

}
ron_ron
sumber
0

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:

public Class Company {
    private static int numCompanies;

    public static int getNumCompanies(){
        return numCompanies;
    }
}

Maka Anda dapat sysout:

Company.getNumCompanies();

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.

pietti
sumber
0

*) 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;

Deepak Bala
sumber
0

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.

public class PrivateStatic {

private static int var = 10;
public void setVar(int newVal) {
    var = newVal;
}

public int getVar() {
    return var;
}

public static void main(String... args) {
    PrivateStatic p1 = new Sub1();
    System.out.println(PrivateStatic.var);
    p1.setVar(200);

    PrivateStatic p2 = new Sub2();
    System.out.println(p2.getVar());
}
}


class Sub1 extends PrivateStatic {

}

class Sub2 extends PrivateStatic {
}
Djiao
sumber
0

ThreadLocalvariabel biasanya diimplementasikan sebagai private static. Dengan cara ini, mereka tidak terikat ke kelas dan setiap utas memiliki referensi sendiri ke objek "ThreadLocal" sendiri.

Mehmet Erdemsoy
sumber
3
Saya tidak mengerti jawaban ini. Maksud kamu apa?
H.Rabiee
-1

Dalam contoh berikut, eyediubah oleh PersonB, sementara legtetap 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.

public class test {
private static int eye=2;
private int leg=3;

public test (int eyes, int legs){
    eye = eyes;
    leg=leg;
}

public test (){
}

public void print(){
    System.out.println(eye);
    System.out.println(leg);
}

public static void main(String[] args){
    test PersonA = new test();      
    test PersonB = new test(14,8);
    PersonA.print();    
}

}

> 14 3

Yiqin Dai
sumber