Статические переменные в 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);
}
}