Jaki jest pożytek z prywatnej zmiennej statycznej w Javie?

156

Jeśli zmienna jest zadeklarowana jako public static varName;, mogę uzyskać do niej dostęp z dowolnego miejsca, jako ClassName.varName. Mam również świadomość, że statyczne elementy członkowskie są współużytkowane przez wszystkie wystąpienia klasy i nie są ponownie przydzielane w każdej instancji.

Czy deklarowanie zmiennej private static varName;różni się od deklarowania zmiennej private varName;?

W obu przypadkach nie można uzyskać do niego dostępu jako ClassName.varNamelub ClassInstance.varNamez żadnej innej klasy.

Czy zadeklarowanie zmiennej jako statycznej nadaje jej inne specjalne właściwości?

Vaibhav Jani
źródło
5
Nazwy zmiennych Java nie mogą zawierać myślników (-).
Martijn Courteaux

Odpowiedzi:

127

Oczywiście można uzyskać do niego dostęp jako ClassName.var_name, ale tylko z wnętrza klasy, w której jest zdefiniowany - to dlatego, że jest zdefiniowany jako private.

public staticlub private staticzmienne są często używane jako stałe. Na przykład, wiele osób nie lubi „na stałe zakodować” stałych w swoim kodzie; lubią tworzyć zmienną public staticlub private statico znaczącej nazwie i używać jej w swoim kodzie, co powinno uczynić kod bardziej czytelnym. (Powinieneś także zrobić takie stałe final).

Na przykład:

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

        // ...
    }
}

Czy to zrobisz, publicczy privatezależy od tego, czy chcesz, aby zmienne były widoczne poza klasą, czy nie.

Jesper
źródło
6
Co jest potrzebne, aby uzyskać dostęp jako ClassName.var_nam? Gdzie mogę uzyskać do niego bezpośredni dostęp: var_namw klasie
Vaibhav Jani,
12
Nie jest konieczny dostęp do niej poprzez nazwę klasy, ale niektórzy uważają, że to dobry styl, aby odróżnić ją od zmiennej niestatycznej.
Jesper
5
co jest konieczne, aby uzyskać do niego dostęp za pomocą zmiennej statycznej, możemy napisać "private final String JDBC_PASSWORD =" hasło ";" zamiast używać zmiennej statycznej dla tego ciągu hasła.
chaitanya,
48
@chaitanya To stała. Dlaczego miałbyś chcieć mieć kopię zmiennej dla każdej instancji klasy, czyniąc ją niestatyczną?
Jesper
16
static to zmienna na poziomie klasy, która jest wspólna i istnieje tylko jedna kopia dla wszystkich instancji tej klasy. Zasada ma zastosowanie niezależnie od tego, czy jest to prywatna, czy publiczna. private po prostu mówi, że nie chcę, aby świat zewnętrzny zepsuł moją wartość zmiennej (dla nieostatecznych statystyk). Jeśli statystyka jest ostateczna, nie ma nic złego w upublicznieniu jej, ponieważ nikt nie może zmienić jej wartości.
user1923551
94

Zmienne statyczne mają jedną wartość dla wszystkich instancji klasy.

Gdybyś miał zrobić coś takiego:

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

a potem chciałeś zmienić swoje imię, to dobrze, moje imię pozostaje takie samo. Gdybyś jednak chciał to zmienić, aby mieć 17 oczu, to każdy na świecie również miałby 17 oczu.

TofuBeer
źródło
3
Nie dotyczy to prywatnych zmiennych statycznych, chyba że napiszesz również metody dostępu dla zmiennej prywatnej, ponieważ nie można uzyskać do nich dostępu spoza klasy.
Ganesh Krishnan,
2
Nieprawda @GaneshKrishnan, każda instancja klasy ma dostęp do obu zmiennych. Oczywiście można się spodziewać, że autor zajęć nie zrobi czegoś głupiego. Ponadto, z refleksją i JNI, wszystkie zakłady są wyłączone.
TofuBeer
46

Prywatne zmienne statyczne są użyteczne w taki sam sposób, jak prywatne zmienne instancji są użyteczne: przechowują stan, do którego można uzyskać dostęp tylko przez kod w tej samej klasie. Dostępność (prywatna / publiczna / itp.) I instancja / statyczny charakter zmiennej to pojęcia całkowicie ortogonalne.

Unikałbym myślenia o zmiennych statycznych jako o wspólnych dla „wszystkich instancji” klasy - to sugeruje, że musi istnieć przynajmniej jedna instancja, aby stan był obecny. Nie - zmienna statyczna jest skojarzona z samym typem zamiast z jakimikolwiek wystąpieniami typu.

Więc za każdym razem, gdy chcesz mieć jakiś stan, który jest powiązany z typem, a nie z jakąś konkretną instancją, i chcesz zachować ten stan jako prywatny (na przykład umożliwiając kontrolowany dostęp za pośrednictwem właściwości), sensowne jest posiadanie prywatnej zmiennej statycznej.

Na marginesie, zdecydowanie zalecałbym, aby jedynym typem zmiennych, które upubliczniasz (lub nawet nieprywatnymi), były stałe - statyczne zmienne końcowe niezmiennych typów. Wszystko inne powinno być prywatne ze względu na oddzielenie API i implementację (między innymi).

Jon Skeet
źródło
Czy możesz wyjaśnić trochę więcej na temat różnicy między prywatnymi statycznymi a prywatnymi a nie statycznymi dostępem do zmiennych w jednej klasie?
Dharmendra
1
@Dharmendra: Nie jest dla mnie jasne, co masz na myśli. Część prywatna nie ma znaczenia - co dokładnie myli Cię w różnicy między zmiennymi statycznymi a zmiennymi instancji?
Jon Skeet
Jaka jest różnica w dostępności, gdy używamy zmiennej statycznej i niestatycznej w ramach jednej klasy, w której są zadeklarowane?
Dharmendra
2
@YogGuru: Nie widzę znaczenia tego pytania. Ustaw go jako prywatny, jeśli chcesz, aby był prywatny, lub statyczny, jeśli chcesz, aby był statyczny. Są ortogonalne.
Jon Skeet
1
@ryvantage: Nie, wcale. Metoda statyczna mogłaby uzyskać do niego dostęp bez żadnych problemów.
Jon Skeet,
11

Cóż, masz rację, publiczne zmienne statyczne są używane bez tworzenia instancji klasy, ale prywatne zmienne statyczne nie. Główna różnica między nimi a miejscem, w którym używam prywatnych zmiennych statycznych, polega na tym, że trzeba użyć zmiennej w funkcji statycznej. W przypadku funkcji statycznych możesz używać tylko zmiennych statycznych, więc ustawiasz je jako prywatne, aby nie miały do ​​nich dostępu z innych klas. To jedyny przypadek, w którym używam prywatnego statycznego.

Oto przykład:

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
źródło
3
Myślę, że najbardziej podoba mi się ta odpowiedź. +1. Jedynym przypadkiem, w którym warto użyć statycznej zmiennej prywatnej, jest sytuacja, w której metoda statyczna miałaby uzyskać do niej dostęp.
Mukus
Bez nadania klasie właściwej nazwy, tak naprawdę nie można powiedzieć, czy jest to prawidłowy przypadek użycia. Na przykład, gdyby klasa została wywołana Person, prawdopodobnie byłby to błąd, ponieważ nie można mieć wielu osób w różnym wieku (jeśli byłby to zamierzony przypadek użycia).
DanMan
Zgadzam się @Mukus. To może być jedyna prawdziwa odpowiedź na to pytanie. Myślę, że OP już rozumie statyczność, ale wydaje się, że ludzie chcą to ponownie wyjaśnić. Pyta o konkretny scenariusz. Możliwość dostępu do zmiennych w metodach statycznych to funkcja dodana przez „private static”. Chcę tylko dodać, że umożliwia to zagnieżdżonym statycznym KLASOM również dostęp do zmiennych.
Pinkerton
1
A co z pamięcią? W przypadku statycznego utworzyłbyś tylko jedną kopię dla klasy zamiast jednej kopii dla każdej instancji. Oczywiście ze stałą potrzebowałbyś tylko jednej kopii na zajęcia. Czy to oszczędza pamięć?
Pinkerton,
1
Sprawdziłem to. Odpowiedź na moje poprzednie pytanie brzmi: tak, to oszczędza pamięć
Pinkerton
8

Cóż, private staticzmienne mogą służyć do udostępniania danych między instancjami tej klasy. Chociaż masz rację, nie możemy uzyskać dostępu do private staticzmiennych za pomocą konstrukcji takich jak ClassName.memberlub, ClassInstance.memberale element członkowski będzie zawsze widoczny z metod tej klasy lub instancji tej klasy. W efekcie instancje tej klasy zawsze będą mogły odwoływać się do elementu członkowskiego.

Swaranga Sarma
źródło
6

Jaki jest pożytek z prywatnej zmiennej klasy statycznej?

Załóżmy, że masz książkę w bibliotece Class. Za każdym razem, gdy tworzysz nową książkę, chcesz przypisać jej unikalny identyfikator. Jednym ze sposobów jest po prostu rozpoczęcie od 0 i zwiększenie numeru identyfikacyjnego. Ale skąd wszystkie inne książki znają ostatnio utworzony numer identyfikacyjny? Proste, zapisz to jako zmienną statyczną. Czy klienci muszą wiedzieć, że rzeczywisty wewnętrzny numer identyfikacyjny dotyczy każdej książki? Nie. Ta informacja jest prywatna.

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

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

To wymyślony przykład, ale jestem pewien, że możesz łatwo wymyślić przypadki, w których chcesz, aby wszystkie instancje klas miały dostęp do wspólnych informacji, które powinny być poufne dla wszystkich innych. A nawet jeśli nie możesz, dobrą praktyką programistyczną jest uczynienie rzeczy tak prywatnymi, jak to tylko możliwe. Co by się stało, gdybyś przypadkowo upublicznił to pole numBooks, mimo że użytkownicy Book nie powinni nic z nim robić. Wtedy ktoś mógłby zmienić liczbę książek bez tworzenia nowej książki.

Bardzo podstępne!

iheanyi
źródło
6

Czy deklarowanie zmiennej private static varName;różni się od deklarowania zmiennej private varName;?

Tak, oba są różne. Pierwsza jest nazywana, class variableponieważ ma jedną wartość dla tego, classpodczas gdy druga jest nazywana, instance variableponieważ może mieć różne wartości dla różnych instances(Objects). Pierwsza jest tworzona tylko raz w jvm, a druga jest tworzona raz na instancję, tzn. Jeśli masz 10 instancji, będziesz mieć 10 różnych private varName;w jvm.

Czy zadeklarowanie zmiennej jako staticnadaje jej inne specjalne właściwości?

Tak, zmienne statyczne mają inne właściwości niż zwykłe zmienne instancji. Wspomniałem już o kilku i zobaczmy kilka tutaj: class variables(zmienne instancji, które są zadeklarowane jako statyczne) można uzyskać bezpośrednio za pomocą nazwy klasy, takiej jak ClassName.varName. Każdy obiekt tej klasy może uzyskiwać dostęp i modyfikować swoją wartość, w przeciwieństwie do zmiennych instancji, do których dostęp mają tylko odpowiednie obiekty. Zmienne klas mogą być używane w metodach statycznych.

Jakie jest zastosowanie a private static variablew Javie?

Logicznie rzecz biorąc, private static variablenie różni się od tego public static variable, że pierwszy daje większą kontrolę. IMO można dosłownie zastąpić public static variableza private static variablepomocą metod public staticpobierających i ustawiających.

Jednym z szeroko używanych obszarów private static variablejest implementacja prostego Singletonwzorca, w którym będziesz mieć tylko jedną instancję tej klasy na całym świecie. Tutaj staticidentyfikator odgrywa kluczową rolę, aby to pojedynczy przypadek jest przystosowany światem zewnętrznym (metody Oczywiście publicznej pochłaniacza statycznych odgrywa również główną rolę).

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

    private Singleton(){}

    public static Singleton getInstance(){
        return Singleton.singletonInstance;
    }
}
avr
źródło
4

Prywatne słowo kluczowe będzie używane do dostępu do zmiennej w klasie i zachowania statyczności w tym sensie, że możemy uzyskać dostęp do zmiennej również w metodzie statycznej, ale zmienna referencyjna nie ma dostępu w metodzie statycznej.

Raam
źródło
3

Inna perspektywa:

  1. Klasa i jej instancja to dwie różne rzeczy w czasie wykonywania. Informacje o zajęciach są „udostępniane” przez wszystkie instancje tej klasy.
  2. Niestatyczne zmienne klasy należą do instancji, a zmienna statyczna należy do klasy.
  3. Tak jak zmienne instancji mogą być prywatne lub publiczne, zmienne statyczne mogą być również prywatne lub publiczne.
Santosh
źródło
1

Gdy w metodzie statycznej używasz zmiennej, na przykład zmienna musi być statyczna:

private static int a=0;  
public static void testMethod() {  
        a=1;  
}
Neifen
źródło
3
No chyba, że ​​twoja metoda ma oczywiście odniesienie do instancji klasy.
Jon Skeet
1

Zmienne statyczne to te zmienne, które są wspólne dla wszystkich instancji klasy .. jeśli jedna instancja ją zmieni .. wtedy wartość zmiennej statycznej zostanie zaktualizowana dla wszystkich innych instancji

Nagesh Tripathi
źródło
1

Dla niektórych ludzi ma to większy sens, jeśli widzą to w kilku różnych językach, więc napisałem przykład w Javie i PHP na mojej stronie, gdzie wyjaśniam niektóre z tych modyfikatorów. Być może myślisz o tym niepoprawnie.

Powinieneś spojrzeć na moje przykłady, jeśli nie ma to sensu poniżej. Przejdź tutaj http://www.siteconsortium.com/h/D0000D.php

Najważniejsze jest jednak to, że jest dokładnie tym, o czym mówi. Jest to statyczna zmienna składowa, która jest prywatna. Na przykład, jeśli chcesz utworzyć obiekt Singleton, dlaczego miałbyś chcieć ustawić zmienną SingletonExample.instance jako publiczną. Jeśli zrobiłeś, osoba korzystająca z klasy mogłaby łatwo nadpisać wartość.

To wszystko, czym jest.

    public class SingletonExample {
      prywatna statyczna instancja SingletonExample = null;
      prywatna statyczna wartość int = 0;
      private SingletonExample () {
        ++ this.value;
      }
      public static SingletonExample getInstance () {
        if (instancja! = null)
        zwracana instancja;
        synchronized (SingletonExample.class) {
        instance = new SingletonExample ();
        zwracana instancja;
        }
      }
      public void printValue () {
        System.out.print (this.value);
      }

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

JTHouseCat
źródło
1

Jeśli używasz prywatnych zmiennych statycznych w swojej klasie, statyczne wewnętrzne klasy w Twojej klasie mogą dotrzeć do Twoich zmiennych. Jest to bardzo dobre dla bezpieczeństwa kontekstu.

Erdal76t
źródło
0

Jeśli zmienna jest zdefiniowana jako public static, można uzyskać do niej dostęp poprzez nazwę klasy z dowolnej klasy.

Zwykle funkcje są definiowane jako public static, do których można uzyskać dostęp, po prostu wywołując nazwę klasy implementującej.

Bardzo dobrym tego przykładem jest sleep()metoda z klasy Thread

Thread.sleep(2500);

Jeśli zmienna jest zdefiniowana jako prywatna statyczna, dostęp do niej można uzyskać tylko w ramach tej klasy, więc nazwa klasy nie jest potrzebna lub nadal możesz używać nazwy klasy (do Ciebie). Różnica między prywatną nazwą zmiennej a prywatną statyczną nazwa_zmiennej polega na tym, że do prywatnych zmiennych statycznych można uzyskać dostęp tylko za pomocą statycznych metod klasy, natomiast do zmiennych prywatnych można uzyskać dostęp za pomocą dowolnej metody tej klasy (z wyjątkiem metod statycznych)

Bardzo dobrym przykładem jest definiowanie połączeń z bazą danych lub stałych, które wymagają zadeklarowania zmiennej jako prywatnej statycznej.

Innym typowym przykładem jest

private static int numberOfCars=10;

public static int returnNumber(){

return numberOfCars;

}
ron_ron
źródło
0

Jestem nowy w Javie, ale jednym ze sposobów, w jaki używam zmiennych statycznych, jak zakładam, jest wiele osób, jest liczenie liczby wystąpień klasy. na przykład:

public Class Company {
    private static int numCompanies;

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

Następnie możesz sysout:

Company.getNumCompanies();

Możesz także uzyskać dostęp do numCompanies z każdej instancji klasy (czego nie do końca rozumiem), ale nie będzie to „statyczne”. Nie mam pojęcia, czy to najlepsza praktyka, czy nie, ale dla mnie ma to sens.

pyetti
źródło
0

*) Jeśli zmienna jest zadeklarowana jako prywatna, to nie jest widoczna poza klasą. Nazywa się to ukrywaniem danych.

*) Jeśli zmienna jest zadeklarowana jako statyczna, wówczas wartość zmiennej jest taka sama dla wszystkich instancji i nie ma potrzeby tworzenia obiektu do wywołania tej zmiennej. Możemy wywołać tę zmienną po prostu

classname.variablename;

Deepak Bala
źródło
0

prywatna zmienna statyczna będzie również udostępniana w podklasie. Jeśli zmieniłeś jedną podklasę, a druga podklasa otrzyma zmienioną wartość, w takim przypadku może nie być to, czego oczekujesz.

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
źródło
0

ThreadLocalzmienne są zwykle implementowane jako private static. W ten sposób nie są one związane z klasą, a każdy wątek ma swoje własne odniesienie do własnego obiektu „ThreadLocal”.

Mehmet Erdemsoy
źródło
3
Nie rozumiem tej odpowiedzi. Co masz na myśli?
H.Rabiee,
-1

W poniższym przykładzie eyejest zmieniana przez PersonB, ale legpozostaje taka sama. Dzieje się tak, ponieważ zmienna prywatna tworzy kopię siebie do metody, tak że jej oryginalna wartość pozostaje taka sama; podczas gdy prywatna wartość statyczna ma tylko jedną kopię dla wszystkich metod do udostępnienia, więc edycja jej wartości spowoduje zmianę jej oryginalnej wartości.

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
źródło