В чем разница между экземпляром и переменной класса (статической) в Java

Название этого вопроса на самом деле является предыдущим экзаменационным вопросом, и я ищу разъяснения/ответ на него.

Обратите внимание, что я изучаю Java и знакомлюсь с ее синтаксисом.

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

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

Я на правильном пути здесь?

Кроме того, что именно делает «статический»? Является ли экземпляр класса статическим только в том случае, если он находится в основном экземпляре класса?

Большое спасибо.


person PrimalScientist    schedule 18.03.2013    source источник
comment
Вы почти правы. Однако переменные класса могут изменяться.   -  person Code-Apprentice    schedule 19.03.2013
comment
Вы во многом правы. (Статическая переменная может быть видоизмененной, если не окончательной.) Конкретный термин static является своего рода традицией, которой в этом контексте слегка злоупотребляют.   -  person Hot Licks    schedule 19.03.2013
comment
stackoverflow .com/questions/413898/   -  person Code-Apprentice    schedule 19.03.2013
comment
(Нет главного экземпляра класса — все экземпляры равны (даже если некоторые из них иногда более равны, чем другие).)   -  person Hot Licks    schedule 19.03.2013
comment
Это отличная обратная связь и ответы. Я начинаю, хотя и медленно прихожу в себя!! Спасибо всем.   -  person PrimalScientist    schedule 19.03.2013
comment
Могу я спросить, почему этот вопрос был понижен, пожалуйста? Вопрос кажется прямым, и ответы были в порядке, я думаю?   -  person PrimalScientist    schedule 19.03.2013


Ответы (3)


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

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

Вот полезный пример:

Переменная экземпляра — одна для каждого объекта: каждый объект имеет собственную копию своей переменной экземпляра.

public class Test{

   int x = 5;

 }

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

Оба t1 и t2 будут иметь свою собственную копию x.

Статическая переменная — одна на класс: каждый объект этого класса использует одну и ту же статическую переменную.

public class Test{

   public static int x = 5;

 }

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

И t1, и t2 будут иметь один и тот же x.

person Ajay S    schedule 18.03.2013
comment
Спасибо за ваш отзыв. Это помогает мне понять, так как это может быть довольно запутанным!! Спасибо!! - person PrimalScientist; 19.03.2013
comment
Это отличный пример. Помогает понять ответ. Огромное спасибо. - person PrimalScientist; 19.03.2013
comment
Спасибо всем за вашу помощь здесь. Это действительно ценится. - person PrimalScientist; 19.03.2013
comment
Статические переменные не загружаются во время компиляции. Они загружаются во время загрузки и инициализируются во время инициализации класса. - person user207421; 19.03.2013

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

public class Foo
{
    public int instanceVariable;
    public static int staticVariable;
}

Foo instance1 = new Foo();
Foo instance2 = new Foo();
instance1.staticVariable = 1;
instance1.instanceVariable = 2;
instance2.instanceVariable = 3;

instance1.staticVariable == 1 // true
instance2.staticVariable == 1 // true

instance1.instanceVariable == 2 //true
instance2.instanceVariable == 3 //true
person Robert Harvey    schedule 18.03.2013
comment
Замечательно. Спасибо за разъяснение. - person PrimalScientist; 19.03.2013
comment
Я получаю это сейчас. Это круто. Спасибо за это, очень полезно. - person PrimalScientist; 19.03.2013
comment
Этот ответ лучше, чем первый :) - person Manjeet; 18.05.2016
comment
Отличное объяснение, вы решили мою месячную путаницу. волшебные 2,25 строки для объяснения. - person jax; 20.02.2017

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

person Pragnani    schedule 18.03.2013
comment
Большое спасибо за ваш отзыв там. Сейчас начинаю получать. - person PrimalScientist; 19.03.2013