Что такое использование частной статической переменной в Java?

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

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

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

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

19 ответов


конечно, его можно получить как ClassName.var_name, но только изнутри класса, в котором он определен-это потому, что он private.

public static или private static переменные часто используются для констант. Например, многим людям не нравятся константы "жесткого кода" в их коде; им нравится делать public static или private static переменная со значимым именем и используйте это в своем коде, что должно сделать код более читаемым. (Вы также должны сделать такие константы final).

например:

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

        // ...
    }
}

делаете ли вы это public или private зависит от того, насколько вы хотите, чтобы переменные были видны вне класса или нет.


статические переменные имеют одно значение для всех экземпляров класса.

Если вы должны были сделать что-то вроде:

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

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


частные статические переменные полезны так же, как полезны частные переменные экземпляра: они хранят состояние, к которому обращается только код в том же классе. Доступность (private/public/etc) и экземпляр/статический характер переменной являются полностью ортогональными понятиями.

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

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

в стороне, я бы настоятельно рекомендовал, чтобы только тип переменные, которые вы делаете открытыми (или даже не частными), являются константами-статическими конечными переменными неизменяемых типов. Все остальное должно быть частным ради разделения API и реализации (среди прочего).


Ну private static переменные могут использоваться для обмена данными между экземплярами этого класса. Хотя вы правы, что мы не можем получить доступ к private static переменные, использующие такие конструкции, как ClassName.member или ClassInstance.member но член всегда будет виден из методов этого класса или экземпляров этого класса. Таким образом, экземпляры этого класса всегда смогут ссылаться на member.


Ну, вы правы, открытые статические переменные используются без создания экземпляра класса, но частные статические переменные-нет. Основное различие между ними и где я использую частные статические переменные, когда вам нужно использовать переменную в статической функции. Для статических функций вы можете использовать только статические переменные, поэтому вы делаете их закрытыми, чтобы не обращаться к ним из других классов. Это единственный случай, для которого я использую private static.

здесь пример:

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

что такое использование частной статической переменной класса?

допустим, у вас есть класс библиотечной книги. Каждый раз, когда вы создаете новую книгу, вы хотите назначить ей уникальный идентификатор. Один из способов - просто начать с 0 и увеличить идентификационный номер. Но как все остальные книги знают последний созданный идентификационный номер? Просто сохраните его как статическую переменную. Должны ли клиенты знать, что фактический внутренний идентификационный номер для каждой книги? Нет. Эта информация является частной.

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

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

Это надуманный пример, но я уверен, что вы можете легко придумать случаи, когда вы хотите, чтобы все экземпляры класса имели доступ к общей информации, которая должна быть закрыта от всех остальных. Или даже если вы не можете, это хорошая практика программирования, чтобы сделать вещи как можно более частным. Что делать, если вы случайно сделали это поле numBooks общедоступным, хотя пользователи книг не должны были ничего с ним делать. Тогда кто-то может изменить количество книг, не создавая новую книгу.

очень подлый!


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

да, оба разные. И первый называется class variable потому что он содержит одно значение для этого class тогда как другой называется instance variable потому что он может содержать разное значение для разных instances(Objects). Первый создается только один раз в jvm, а другой-один раз на экземпляр i.e если у вас есть 10 экземпляров, то у вас будет 10 разных private varName; в JVM.

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

да, статические переменные получают некоторые другие свойства, чем обычные переменные экземпляра. Я уже упоминал несколько, и давайте посмотрим некоторые здесь:class variables (переменные экземпляра, которые объявлены как статические) могут быть доступны непосредственно с помощью имени класса, как ClassName.varName. И любой объект этого класса может получить доступ и изменить свое значение в отличие от переменных экземпляра доступны только соответствующие объекты. Переменные класса могут использоваться в статических методах.

какая польза от private static variable в Java?

логически private static variable ничем не отличается от public static variable скорее первый дает вам больше контроля. ИМО, вы можете буквально заменить public static variable by private static variable С помощью public static методы getter и setter.

одна широко используемая область private static variable находится в реализации simple Singleton шаблон где у вас будет только один экземпляр этого класса во всем мире. Вот!--8--> идентификатор играет решающую роль, чтобы сделать этот единственный экземпляр доступным для внешнего мира (конечно, публичный статический метод геттера также играет главную роль).

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

    private Singleton(){}

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

другой ракурс :

  1. класс и его экземпляр-это две разные вещи во время выполнения. Информация о классе "совместно используется" всеми экземплярами этого класса.
  2. нестатические переменные класса принадлежат экземплярам, а статическая переменная принадлежит классу.
  3. так же, как переменные экземпляра могут быть частными или общедоступными, статические переменные также могут быть частными или общедоступными.

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


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

private static int a=0;  
public static void testMethod() {  
        a=1;  
}

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


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

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

вот и все.


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


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


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

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

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

Thread.sleep(2500);

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

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

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

private static int numberOfCars=10;

public static int returnNumber(){

return numberOfCars;

}

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

public Class Company {
    private static int numCompanies;

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

тогда вы можете sysout:

Company.getNumCompanies();

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


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

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

classname.variablename;


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

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 {
}

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


В следующем примере, 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();    
}

}

> Четырнадцать 3