Я участвую в процессе обучения Java, и я не понимаю разницы между объектными переменными и переменной класса. Все, что я знаю, это то, что для того, чтобы это была переменная класса, вы должны сначала объявить ее статическим утверждением. Спасибо!
Переменные объекта vs Переменные класса в Java
Ответ 1
В Java (и в ООП вообще) объекты имеют два вида полей (переменную).
Переменные экземпляра (или объектная переменная) - это поля, относящиеся к определенному экземпляру объекта.
Статические переменные (или переменная класса) являются общими для всех экземпляров одного и того же класса.
Вот пример:
public class Foobar{
static int counter = 0 ; //static variable..all instances of Foobar will share the same counter
public int id; //instance variable. Each instance has its own id
public Foobar(){
this.id = counter++;
}
}
использование:
Foobar obj1 = new Foobar();
Foobar obj2 = new Foobar();
System.out.println("obj1 id : " + obj1.id + " obj2.id "= obj2.id + " id count " + Foobar.counter);
Ответ 2
Объектная переменная зависит от конкретного экземпляра класса, тогда как переменная класса доступна глобально через сам класс. Это может быть немного нечетким, вот несколько примеров:
class Muffin {
private static final int calories = 9320;
public String flavor;
public Muffin( String flavor ){
this.flavor = flavor;
}
}
В этом классе calories
является переменной класса. В любом другом фрагменте кода вы можете получить количество калорий в любом виде булочки, вызвав Muffin.calories
. В этом случае ключевое слово final
также используется для того, чтобы количество калорий было постоянным.
В том же классе мы имеем объектную переменную flavor
. Это зависит от экземпляра класса и устанавливается в конструкторе.
Muffin myMuffin = new Muffin( "blueberry" );
Итак, теперь вы можете получить доступ к этому конкретному аромату булочки, вызвав myMuffin.flavor
. Обратите внимание, как нам нужно создать экземпляр объекта Muffin
, прежде чем мы сможем получить доступ к его flavor
.
Изменение переменных static (class)
Приведенный выше пример немного растянут, так как разные типы кексов будут иметь разные количества калорий. Они полезны для констант, но здесь случай, когда изменяется значение статической переменной:
class Muffin {
private static int next_id = 1;
public int id;
public String flavor;
public Muffin( String flavor ){
this.flavor = flavor;
id = next_id++;
}
}
Во втором примере нам нужно иметь уникальный идентификационный номер для каждого создаваемого буфера, поэтому мы можем иметь статическую переменную, которая увеличивается каждый раз при создании экземпляра Muffin
. Ключевое слово static
позволяет сохранить значение next_id
через каждый вызов конструктора, поэтому id
будет отличаться и будет увеличиваться для каждого нового буфера.
Ответ 3
Разница между статической переменной или переменной класса и переменной экземпляра или переменной объекта довольно проста. Каждый объект, который вы создаете, имеет свою собственную копию своих собственных переменных экземпляра. Если в классе есть статическая переменная, то для всех объектов существует только одна копия этой статической переменной. Например
public class JellyBean{
// instance variables every jellyBean object will have its own
// variable for color
String color;
// static variable only one copy of this variable exists for
// all jellyBean objects.
static int totalNumberOfJellyBeans;
}//end class
Если вы создали 2 объекта jellybean, у вас будет две переменные для цвета, потому что у каждого jellybean есть своя переменная для цвета. И 1 переменная для totalNumberOfJellyBeans, потому что оба объекта jellyBean используют эту одну переменную класса.
Ответ 4
Скажем, у вас есть план автомобиля под названием ToyotaYaris
, в котором у вас может быть переменная с именем maxSpeed
. Все автомобили, изготовленные с этим планом (его экземпляры), будут иметь одинаковую максимальную скорость, поэтому переменная должна принадлежать чертежу, а не отдельным автомобилям. Если maxSpeed
изменится в плане, так это изменится во всех автомобилях, которые он производит.
Однако на каждом автомобиле вам может понадобиться другая переменная с именем speed
. Эта переменная не может принадлежать чертежу, потому что каждый автомобиль может ездить на разных скоростях независимо друг от друга, поэтому вам нужно, чтобы эта переменная принадлежала каждому конкретному экземпляру ToyotaYaris
.
Таким образом:
class ToyotaYaris {
static int maxSpeed;
int speed;
}
Ответ 5
Объектная переменная или член экземпляра принадлежит к определенному экземпляру класса. То есть каждый экземпляр имеет свою собственную копию этой части данных. Переменная класса или статический член разделяется каждым экземпляром класса. То есть есть только одна копия этой части данных независимо от количества экземпляров класса.