Какая польза от частной статической переменной в Java? - PullRequest
143 голосов
/ 02 сентября 2011

Если переменная объявлена ​​как public static varName;, то я могу получить к ней доступ из любого места как ClassName.varName. Мне также известно, что статические члены совместно используются всеми экземплярами класса и не перераспределяются в каждом экземпляре.

Объявление переменной как private static varName; отличается от объявления переменной private varName;?

В обоих случаях к нему нельзя получить доступ как ClassName.varName или как ClassInstance.varName из любого другого класса.

Придает ли объявление переменной статической другие специальные свойства?

Ответы [ 19 ]

1 голос
/ 02 сентября 2011

Когда в статическом методе вы используете переменную, переменная тоже должна быть статической как пример:

private static int a=0;  
public static void testMethod() {  
        a=1;  
}
1 голос
/ 31 декабря 2013

Для некоторых людей это имеет больше смысла, если они видят это на нескольких разных языках, поэтому я написал пример на Java и PHP на своей странице, где я объясняю некоторые из этих модификаторов.Возможно, вы думаете об этом неправильно.

Вы должны посмотреть на мои примеры, если они не имеют смысла ниже.Иди сюда http://www.siteconsortium.com/h/D0000D.php

Суть в том, что это в значительной степени именно то, что он говорит.Это статическая переменная-член, которая является закрытой.Например, если вы хотите создать объект Singleton, зачем делать общедоступной переменную SingletonExample.instance.Если вы сделали это, человек, который использовал этот класс, мог бы легко перезаписать значение.

Вот и все.


    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 голос
/ 12 января 2016

Если вы используете частные статические переменные в вашем классе, статические внутренние классы в вашем классе могут достигать ваших переменных. Это очень хорошо для безопасности контекста.

0 голосов
/ 22 июня 2017

Переменные ThreadLocal обычно реализуются как частные статические.Таким образом, они не привязаны к классу, и каждый поток имеет собственную ссылку на свой собственный объект "threadLocal".

0 голосов
/ 21 января 2017

В следующем примере eye изменяется PersonB, тогда как leg остается прежним.Это связано с тем, что закрытая переменная делает копию самого метода в методе, поэтому ее первоначальное значение остается прежним;в то время как приватное статическое значение имеет только одну копию для всех методов для совместного использования, поэтому редактирование его значения изменит его исходное значение.

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

0 голосов
/ 10 февраля 2014

Если переменная определена как открытая статическая, к ней можно получить доступ через имя ее класса из любого класса.

Обычно функции определяются как открытая статическая, доступ к которой можно получить, просто вызвав имя реализующего класса.

Очень хорошим примером этого является метод sleep() в классе Thread

Thread.sleep(2500);

Если переменная определена как приватная статическая, к ней можно получить доступ только внутри этого класса, поэтому имя класса не требуетсяили вы все еще можете использовать имя класса (до вас).Разница между приватным var_name и приватным статическим var_name заключается в том, что приватные статические переменные могут быть доступны только статическими методами класса, тогда как приватные переменные могут быть доступны любым методом этого класса (кроме статических методов)

Очень хорошоПримером этого является определение соединений с базой данных или констант, которые требуют объявления переменной как частной статической.

Другим распространенным примером является

private static int numberOfCars=10;

public static int returnNumber(){

return numberOfCars;

}
0 голосов
/ 14 октября 2015

закрытая статическая переменная также будет доступна в подклассе.Если вы изменились в одном подклассе, а другой подкласс получит измененное значение, в этом случае оно может отличаться от ожидаемого.

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 голосов
/ 22 сентября 2015

*) Если переменная объявлена ​​как закрытая, то она не видна за пределами класса. Это называется скрытием данных.

*) Если переменная объявлена ​​как статическая, то значение переменной одинаково для всех экземпляров, и нам не нужно создавать объект для вызова этой переменной. Мы можем вызвать эту переменную просто

classname.variablename;

0 голосов
/ 10 апреля 2014

Я новичок в Java, но один из способов использования статических переменных, как я полагаю, делают многие люди, - это подсчет количества экземпляров класса.Например:

public Class Company {
    private static int numCompanies;

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

Затем вы можете выполнить sysout:

Company.getNumCompanies();

Вы также можете получить доступ к numCompanies из каждого экземпляра класса (что я не совсем понимаю), но этоне будет в "статичном ключе".Я понятия не имею, является ли это наилучшей практикой или нет, но для меня это имеет смысл.

...