Na czym polega użycie prywatnej zmiennej statycznej w Javie?

Jeśli zmienna jest zadeklarowana jako public static varName;, wtedy mogę uzyskać do niej dostęp z dowolnego miejsca jako ClassName.varName. Jestem również świadomy, że statyczne członkowie są współdzielone przez wszystkie instancje klasy i nie są ponownie przydzielane w każdej instancji.

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

W obu przypadkach nie można uzyskać dostępu jako ClassName.varName lub jako ClassInstance.varName z żadnej innej klasy.

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

Author: blacktide, 2011-09-02

19 answers

Oczywiście może być dostępny jako ClassName.var_name, ale tylko z wewnątrz klasy, w której jest zdefiniowany - to dlatego, że jest private.

public static lub private static zmienne są często używane dla stałych. Na przykład, wiele osób nie lubi" twardego kodu " stałych w swoim kodzie; lubią tworzyć zmienną public static lub private static o znaczącej nazwie i używać jej w swoim kodzie, co powinno uczynić kod bardziej czytelnym. (Powinieneś również tworzyć takie stałe final).

Dla 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 zrobisz to public czy private zależy od tego, czy chcesz, aby zmienne były widoczne poza klasą, czy nie.

 98
Author: Jesper,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-02 06:33:00

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

Gdybyś miał zrobić coś w stylu:

public class Person
{
    private static int numberOfEyes;
    private String name;
}
A potem chciałeś zmienić swoje imię, w porządku, moje imię pozostaje takie samo. Jeśli jednak chcesz to zmienić tak, że masz 17 oczu, to wszyscy na świecie również mają 17 oczu.
 88
Author: TofuBeer,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-02 06:27:56

Prywatne zmienne statyczne są użyteczne w taki sam sposób, jak prywatne zmienne instancji: przechowują stan, do którego dostęp ma tylko kod w tej samej klasie. Dostępność (private/public/etc) oraz instancja/statyczny charakter zmiennej są pojęciami całkowicie ortogonalnymi.

Unikałbym myślenia, że zmienne statyczne są współdzielone między "wszystkimi instancjami" klasy - co sugeruje, że musi być co najmniej jedna instancja, Aby stan był obecny. Nie. - zmienna statyczna jest powiązana z samym typem zamiast jakichkolwiek instancji typu.

Więc za każdym razem, gdy chcesz mieć jakiś stan, który jest powiązany z typem, a nie z konkretną instancją, i chcesz zachować ten stan jako prywatny (być może zezwalając na kontrolowany dostęp przez właściwości, na przykład), ma sens posiadanie prywatnej statycznej zmiennej.

Na marginesie, zdecydowanie polecam, aby Tylko typ zmiennych, które upubliczniasz (lub nawet non-private) są stałymi - statycznymi zmiennymi końcowymi typów niezmiennych. Wszystko inne powinno być prywatne ze względu na oddzielenie API od implementacji (między innymi).

 42
Author: Jon Skeet,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-02 16:06:05

Cóż, private static zmienne mogą być używane do współdzielenia danych pomiędzy instancjami tej klasy. Chociaż masz rację, nie możemy uzyskać dostępu do zmiennych private static za pomocą konstrukcji takich jak ClassName.member lub ClassInstance.member, ale element będzie zawsze widoczny z metod danej klasy lub instancji tej klasy. Tak więc w efekcie instancje tej klasy zawsze będą mogły odwoływać się do member.

 8
Author: Swaranga Sarma,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-02 06:30:14

Well you are right public static variables are used without making an instance of the class but private static variables are not. Główna różnica między nimi i gdzie używam prywatnych zmiennych statycznych jest wtedy, gdy trzeba użyć zmiennej w funkcji statycznej. Dla funkcji statycznych możesz używać tylko zmiennych statycznych, więc uczynisz je prywatnymi, aby nie uzyskać do nich dostępu z innych klas. To jedyny przypadek, w którym używam private static.

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;
   }
}
 7
Author: Farid Farhat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-02 06:45:50

Jaki jest użytek z prywatnej statycznej zmiennej klasy?

Powiedzmy, że masz zajęcia z książki w bibliotece. Za każdym razem, gdy tworzysz nową książkę, chcesz przypisać jej unikalny identyfikator. Jednym ze sposobów jest po prostu zacząć od 0 i zwiększyć numer id. Ale skąd wszystkie inne książki znają ostatnio utworzony numer identyfikacyjny? Proste, zapisz go jako zmienną statyczną. Czy klienci muszą wiedzieć, że rzeczywisty wewnętrzny numer identyfikacyjny jest dla 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 jest wymyślone przykład, ale jestem pewien, że możesz łatwo myśleć o przypadkach, w których chcesz, aby wszystkie instancje klas miały dostęp do wspólnych informacji, które powinny być przechowywane w tajemnicy przed wszystkimi innymi. A nawet jeśli nie możesz, dobrą praktyką programistyczną jest robienie rzeczy tak prywatnymi, jak to tylko możliwe. Co jeśli przypadkowo upubliczniłaś to pole numBooks, mimo że użytkownicy książek nie mieli nic z tym zrobić? Wtedy ktoś mógłby zmienić liczbę książek bez tworzenia nowej książki.

Bardzo podstępne!
 5
Author: iheanyi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-09 20:55:02

Deklaruje zmienną jako private static varName; dowolną inną od deklarowanie zmiennej private varName;?

Tak, oba są inne. I pierwszy nazywa się class variable, ponieważ posiada pojedynczą wartość dla tego class, podczas gdy drugi nazywa się instance variable, ponieważ może posiadać inną wartość dla innego instances(Objects). Pierwsza z nich jest tworzona tylko raz w jvm, a druga jest tworzona raz na instancję, tzn. jeśli masz 10 instancji, to będziesz miał 10 różnych private varName; w jvm.

Czy zadeklarowanie zmiennej jako static daje jej inne specjalne nieruchomości?

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

Jaki jest użytek private static variable w Javie?

Logicznie rzecz biorąc, private static variable nie różni się od public static variable raczej pierwszy daje Ci większą kontrolę. IMO, możesz dosłownie zastąpić public static variable przez private static variable za pomocą metod getter i setter.

Jednym z powszechnie używanych obszarów {[11] } jest implementacja prostego wzorca Singleton, w którym będziesz miał tylko jedną instancję tej klasy na całym świecie. Tutaj static identyfikator odgrywa kluczową rolę rola, aby pojedyncza instancja była dostępna dla świata zewnętrznego (oczywiście główną rolę odgrywa również publiczna statyczna metoda getter).

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

    private Singleton(){}

    public static Singleton getInstance(){
        return Singleton.singletonInstance;
    }
}
 5
Author: avr,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-06-21 07:04:00

Inna perspektywa:

  1. klasa i jej instancja to dwie różne rzeczy w czasie wykonywania. Informacje o klasie są "współdzielone" przez wszystkie instancje tej klasy.
  2. niestatyczne zmienne klasy należą do instancji, a statyczna do klasy.
  3. podobnie jak zmienne instancji mogą być prywatne lub publiczne, zmienne statyczne mogą być również prywatne lub publiczne.
 2
Author: Santosh,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-02 06:41:43

Private keyword użyje dla zmiennej access wewnątrz klasy i zachowanie statyczne w tym sensie, że możemy uzyskać dostęp do zmiennej w metodzie statycznej, ale zmienna odniesienia nie może uzyskać dostępu w metodzie statycznej.

 2
Author: Raam,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-21 10:42:06

Gdy w metodzie statycznej używasz zmiennej, zmienna musi być również statyczna jako przykład:

private static int a=0;  
public static void testMethod() {  
        a=1;  
}
 1
Author: Neifen,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2011-09-02 08:15:51

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

 1
Author: Nagesh Tripathi,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2013-11-23 04:42:04

Dla niektórych 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. Może źle o tym myślisz.

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

Najważniejsze jest to, że jest to dokładnie to, co mówi, że jest. Jest statyczną zmienną członkowską, która jest szeregowy. Na przykład, jeśli chcesz utworzyć obiekt Singleton, dlaczego chcesz utworzyć przykład Singletone.instancyjna zmienna public. Jeśli to zrobisz, osoba, która używała klasy, mogłaby łatwo nadpisać wartość.

To wszystko.

    public class SingletonExample {
      private static SingletonExample instance = null;
      private static int value = 0;
      private SingletonExample() {
        ++this.value;
      }
      public static SingletonExample getInstance() {
        if(instance!=null)
        return instance;
        synchronized(SingletonExample.class) {
        instance = new SingletonExample();
        return instance;
        }
      }
      public void printValue() {
        System.out.print( this.value );
      }

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

 1
Author: JTHouseCat,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-01-23 20:28:05

Jeśli używasz prywatnych statycznych zmiennych w klasie, statyczne wewnętrzne klasy w klasie mogą dotrzeć do Twoich zmiennych. Jest to idealne rozwiązanie dla bezpieczeństwa kontekstowego.

 1
Author: Erdal76t,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-01-12 09:54:27

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

Zwykle funkcje są definiowane jako publiczne statyczne, do których można uzyskać dostęp poprzez wywołanie nazwy klasy implementującej.

Bardzo dobrym tego przykładem jest Metoda sleep() w klasie Thread

Thread.sleep(2500);

Jeśli zmienna jest zdefiniowana jako prywatna statyczna, może być dostępna tylko w obrębie tej klasy, więc nie jest potrzebna nazwa klasy lub możesz nadal używać nazwy klasy (do ciebie). Różnica pomiędzy private var_name i private static var_name jest to, że do prywatnych zmiennych statycznych można uzyskać dostęp tylko za pomocą statycznych metod klasy, podczas gdy do prywatnych zmiennych można uzyskać dostęp za pomocą dowolnej metody tej klasy (z wyjątkiem metod statycznych)

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

Innym powszechnym przykładem jest

private static int numberOfCars=10;

public static int returnNumber(){

return numberOfCars;

}
 0
Author: ronak Hingar,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-02-10 04:12:08

Jestem nowy w Javie, ale jednym ze sposobów, w jaki używam zmiennych statycznych, jak zakładam Wiele osób, jest policzenie liczby instancji klasy. np.:

public Class Company {
    private static int numCompanies;

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

Wtedy możesz sysout:

Company.getNumCompanies();

Możesz również uzyskać dostęp do numCompanies z każdej instancji klasy( czego nie do końca rozumiem), ale nie będzie to w "statyczny sposób". Nie mam pojęcia, czy to jest najlepsza praktyka, czy nie, ale ma to dla mnie sens.

 0
Author: pyetti,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2014-04-10 01:12:54

*)jeżeli zmienna jest zadeklarowana jako prywatna, to nie jest widoczna poza klasą.to się nazywa datahiding.

*)jeśli zmienna jest zadeklarowana jako statyczna, to wartość zmiennej jest taka sama dla wszystkich instancji i nie musimy tworzyć obiektu, aby wywołać tę zmienną.możemy wywołać tę zmienną po prostu

Nazwa klasy.variablename;

 0
Author: Deepak Bala,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-09-22 09:10:17

Prywatna statyczna zmienna będzie również współdzielona w podklasie. Jeśli zmieniłeś w jednej podklasie, a druga podklasa otrzyma zmienioną wartość, w takim przypadku może to 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 {
}
 0
Author: djiao,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2015-10-14 15:04:50

Zmienne ThreadLocal są zazwyczaj implementowane jako prywatne statyczne. W ten sposób nie są one powiązane z klasą i każdy wątek ma własne odniesienie do własnego obiektu "threadLocal".

 0
Author: Mehmet Erdemsoy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-22 13:02:57

W poniższym przykładzie, {[1] } jest zmieniana przez PersonB, podczas gdy leg pozostaje taka sama. Dzieje się tak dlatego, że prywatna zmienna tworzy kopię samej siebie do metody, tak że jej pierwotna wartość pozostaje taka sama; podczas gdy prywatna statyczna wartość ma tylko jedną kopię dla wszystkich metod do współdzielenia, więc edycja jej wartości zmieni jej pierwotną wartość.

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

 -1
Author: Yiqin Dai,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-01-21 10:32:55