Статические переменные в Java

У меня есть такой сценарий

public class Test{

   static int a;
   int b;

   public static void main(String[] args){

      Test t1  = new Test();
      Test t2 = new Test();

   }
}

Какими будут переменные в объекте t1 и объекте t2?

Согласно моему пониманию, так как переменная a является статической переменной, она будет как в объекте 1, так и в объекте 2.

А также b Будет создана отдельная копия для обоих объектов.

Но когда я присваиваю значение переменной b т.е.int b=1) и назовите это как System.out.println(t1.b), System.out.println(t2.b)

Вместо того, чтобы получить ошибку, я получаю 1 в качестве вывода от обоих объектов.

Это почему?

6 ответов

Насколько я понимаю, поскольку переменная a является статической переменной, она будет как в объекте 1, так и в объекте 2.

Нет, это не в любом объекте. Он существует без ссылки на какой-либо конкретный случай вообще. Хотя Java позволяет ссылаться на него "через" ссылку, например, int x = t1.a; ты не должен этого делать. Вместо этого вы должны обратиться к нему через имя класса (test.a в вашем случае - хотя вы также должны начать следовать соглашениям об именах Java), чтобы прояснить, что это статично.

И б будет создана отдельная копия для обоих объектов.

Да.

Но когда я присваиваю значение переменной b т.е.int b=1) и назовите это как System.out.println(t1.b), System.out.println(t2.b) Вместо того, чтобы получить ошибку, я получаю 1 в качестве вывода от обоих объектов.

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

t1.b = 2;
t2.b = 3;
System.out.println(t1.b); // Prints 2
System.out.println(t2.b); // Prints 3

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

В случае твоего...

int b = 1; 

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

int b = 1; //initialized b to 1 for all obj of class Test
System.out.println(t1.b); // Prints 1
System.out.println(t2.b); // Prints 1

Нет, статическая переменная - это не переменная экземпляра, а переменная класса.

То есть каждый экземпляр этого класса использует одну и ту же ссылку на эти переменные.

Взгляните на Понимание членов класса

Здесь a является статической переменной, а b является экземпляром или нестатической переменной.

Для статической переменной для всех объектов создается только одна копия, а для переменной экземпляра - для каждого объекта. Здесь, когда b=1, для каждого объекта этого класса Test создается одна копия, и он может получить к ней доступ через имя своего объекта. Таким образом, вывод будет 1.

Конечно, это именно то, что он должен выводить. Если вы назначите сказать,

int b=1; 

это присвоение находится на уровне класса, что делает 1 значением по умолчанию для переменной b. Однако, если вы назначите так:

t1.b=1;

это назначит 1 только копии переменной b в объекте t1.

Попытайся.

переменные - это переменные класса. переменные хранятся в статической памяти.

переменные создаются для доступа внутрь main()метод. В static переменные могут быть доступны по имени их класса, если они присутствуют вне класса.

      class sv {
  static String name = "abc";
}

public class staticvariable {
  static int t;
  public static void main(String[] args) {
    System.out.println("static variable is - "+t);
    System.out.println(sv.name);
    t=100;
    System.out.println(t);
  }
}
Другие вопросы по тегам