Я очень новичок в Java и хочу понять разницу между переменными класса и переменными экземпляра.
Например:
class Bicycle {
static int cadence = 0;
int speed = 0;
int gear = 1;
}
Чем переменные экземпляра и переменные класса отличаются друг от друга? Какие переменные здесь являются переменными класса, а какие - переменными экземпляра? Как это влияет на область видимости?
Они обе являются членами переменных, что означает, что они связаны с классом. Конечно, между ними есть различия:
Переменные экземпляра:
Эти переменные принадлежат экземпляру класса, то есть объекту. И каждый экземпляр этого класса (объекта) имеет свою собственную копию этой переменной. Изменения, внесенные в переменную, не отражаются в других экземплярах этого класса.
public class Product {
public int Barcode;
}
Классовые переменные:
Эти переменные также известны как статические переменные-члены, и существует только одна копия этой переменной, которая является общей для всех экземпляров данного класса. Если в эту переменную вносятся изменения, все остальные экземпляры увидят эффект изменений.
public class Product {
public static int Barcode;
}
Полный пример:
// INSTANCE VARIABLE
public class Main {
public static void main(String[] args) {
Product prod1 = new Product();
prod1.Barcode = 123456;
Product prod2 = new Product();
prod2.Barcode = 987654;
System.out.println(prod1.Barcode);
System.out.println(prod2.Barcode);
}
}
public class Product {
public int Barcode;
}
Вывод будет следующим:
123456
987654
Теперь измените переменную экземпляра на переменную класса, сделав ее статической:
//CLASS VARIABLE
public class Main {
public static void main(String[] args) {
Product prod1 = new Product();
prod1.setBarcode(123456);
Product prod2 = new Product();
prod2.setBarcode(987654);
System.out.println(prod1.getBarcode());
System.out.println(prod2.getBarcode());
}
}
public class Product {
public static int Barcode;
public int getBarcode() {
return Barcode;
}
public void setBarcode(int value){
Barcode = value;
}
}
Я использовал нестатические методы для получения и установки значения Barcode
, чтобы иметь возможность вызывать его из объекта, а не из класса. Результат будет следующим:
987654
987654
Это объясняется здесь (на примере класса Bicycle
с переменной класса numberOfBicycles
и переменными экземпляра cadence
, peed
, gear
& id
):
Иногда необходимо иметь переменные, общие для всех объектов. Это достигается с помощью модификатора
static
. Поля, в объявлении которых присутствует модификаторstatic
, называются статическими полями или переменными класса. Они связаны с классом, а не с каким-либо объектом. Каждый экземпляр класса имеет общую переменную класса, которая находится в одном фиксированном месте в памяти. Любой объект может изменить значение переменной класса, но переменными класса можно манипулировать и без создания экземпляра класса.
Переменная класса (объявленная как static
) - это место, общее для всех экземпляров.
В примере numberOfBicycles
является переменной класса (поскольку она объявлена статической
). Существует только одна такая переменная (т.е. расположение), общая для всех экземпляров и класса. Поэтому если вы измените numberOfBicycles
в одном методе, другие методы увидят новое значение (даже для разных объектов Bicycle
).
В отличие от этого gear
и amp;
idявляются переменными *экземпляра* (потому что их объявление не имеет модификатора
static). Каждый объект
Bicycleимеет свою собственную переменную. Если вы измените
gearдля некоторого
Bicycle*a*, и если *b* является другим экземпляром, изменение
a.gearне повлияет на
b.gear`.
Каждый объект Java - это отдельная область памяти с некоторыми метаданными (например, ссылкой на его класс) и собственными переменными экземпляра (возможно, унаследованными от суперкласса). Но переменные класса являются общими для класса и разделяются всеми экземплярами.
См. также вики-страницы Объект (информатика) & Переменная экземпляра.
Переменная экземпляра:
Переменные экземпляра объявляются в классе, но вне метода, конструктора или любого блока.
Переменная экземпляра принадлежит экземпляру класса или можно сказать, что что переменная экземпляра принадлежит объекту.
Переменная экземпляра имеет отдельное значение для каждого экземпляра класса. класса.
Класс InstanceDemo {
// эта переменная экземпляра видна для любого дочернего класса.
public String name = "Testing";
// переменная count видна только в классе Demo.
private int count = 2;
}
Метод доступа к переменной экземпляра:.
InstanceDemo demo = new InstanceDemo ();
System.out.println("Доступ к переменной экземпляра: " + demo.count + " , "+demo.name );
Вывод: 2, Тестирование
Классовая переменная:
Классовая переменная принадлежит классу.
Переменная класса создается путем добавления ключевого слова "static" перед переменная.
Также переменная называется статической.
И самое главное, переменная класса сохраняет одно общее значение для всех экземпляров класса, даже если ни один объект класса не существует. не существует.
Класс ClassDemo {
// переменная count одинакова для всех экземпляров этого класса
public static int count = 2;
}
Метод доступа к переменной класса:.
System.out.println("Доступ к переменной класса: " + ClassDemo.count ); //классовая переменная напрямую связана с именем класса
Вывод: 2
Краткое различие между переменной класса и переменной экземпляра: