Каковы различия между переменными класса и переменными экземпляра в Java? [закрыто]

16

Я очень плохо знаком с Java и хочу понять разницу между переменными класса и переменными экземпляра.

Например:

class Bicycle { 
    static int cadence = 0; 
    int speed = 0; 
    int gear = 1; 
}

Чем переменные экземпляра и переменные класса отличаются друг от друга? Какие переменные здесь являются переменными класса, а какие переменными экземпляра? Как это влияет на сферу?

Скайлар Адамс
источник
1
Вы, кажется, начали читать Учебные руководства Java ™: Понимание Членов Класса, которое объясняет это, но не полностью поняло это.

Ответы:

35

Они оба являются переменными- членами , что означает, что оба связаны с классом. Теперь, конечно, есть различия между ними:

Переменные экземпляра:

Эти переменные принадлежат экземпляру класса , то есть объекта. И каждый экземпляр этого класса (объекта) имеет свою собственную копию этой переменной. Изменения, внесенные в переменную, не отражаются в других экземплярах этого класса.

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

Аббас
источник
Почему C # пример для вопроса Java?
Василий Старынкевич,
Мои мысли точно. Я знаю только Java-программирование, а не C #, так что вы не очень помогли
Скайлар Адамс
1
@BasileStarynkevitch Я в основном разработчик на C #, и поскольку этот принцип важен для обоих и так же хорош, как и тот же, я быстро привел пример на C #, конечно, неправильно. :) Поменял мой пример на Java.
Аббас
2
@SkylarAdams Извините, я ошибочно предположил, что любой, кто знает Java, знает C #. Я изменил пример на Java, надеюсь, это поможет.
Аббас
9
Для такого рода вопросов, я думаю, что это не имеет значения, будь то с использованием Java или C #,
Томас Джанк
6

Это объясняется здесь (с примером Bicycleкласса с переменными класса numberOfBicyclesи переменными экземпляра cadence, speed, gear& id):

Иногда вы хотите иметь переменные, которые являются общими для всех объектов. Это достигается с помощью staticмодификатора. Поля, которые имеют staticмодификатор в своем объявлении, называются статическими полями или переменными класса. Они связаны с классом, а не с любым объектом. Каждый экземпляр класса совместно использует переменную класса, которая находится в одном фиксированном месте в памяти. Любой объект может изменить значение переменной класса, но с переменными класса также можно манипулировать, не создавая экземпляр класса.

Переменная класса (объявленная static) является местоположением, общим для всех экземпляров.

В примере numberOfBicyclesэто переменная класса (так как она объявлена static). Существует только одна такая переменная (т.е. местоположение), общая для всех экземпляров и для класса. Поэтому, если вы измените numberOfBicyclesодин метод, другие методы увидят новое значение (даже для разных Bicycleобъектов).

В отличие от gear& idявляются переменными экземпляра (потому что их объявление не имеет staticмодификатора). У каждого Bicycleобъекта есть свой. Если вы изменяете gearдля некоторого Bicycle a , и если b - другой экземпляр, изменение a.gearне влияет наb.gear

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

См. Также Вики-страницы переменных объекта (информатика) и экземпляра .

Василий Старынкевич
источник
4

Переменная экземпляра:

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

    Class InstanceDemo {
    
         // this instance variable is visible for any child class.
           public String name = "Testing";
    
         // count variable is visible in Demo class only.
           private int count = 2;
    }

Метод для доступа к переменной экземпляра:

InstanceDemo demo = new InstanceDemo ();

System.out.println("Access Instance variable: " + demo.count + " , "+demo.name );

Выход: 2, Тестирование

Переменная класса:

  • Переменная класса принадлежит классу.
  • Переменная класса создается путем добавления ключевого слова «static» перед переменной.
  • Также называется статической переменной.
  • И наиболее важная переменная класса поддерживает одно общее значение для всех экземпляров класса, даже если не существует объекта экземпляра класса.

        Class ClassDemo {
    
         // count variable is Same for all instance of this class
           public static int count = 2;
    }

Метод доступа к переменной класса:

System.out.println("Access Class variable: " + ClassDemo.count );
//class variable is directly refer with class name

Выход: 2

Краткая разница между переменной класса и переменной экземпляра:

  • Переменные экземпляра имеют отдельные значения для каждого экземпляра класса. Переменные класса поддерживают одно общее значение для всех экземпляров класса, даже если не существует объекта экземпляра этого класса.
  • Вы бы использовали ключевое слово static для изменения переменной экземпляра в переменную класса.
  • Переменные экземпляра и класса объявляются на уровне класса, а не в методах.
Garg-х
источник
3

Разница между class variablesи instanceпеременными, это просто вопрос who knows what?.

An instance variableизвестен только (= привязан ) к этому конкретному экземпляру - отсюда и имя.

  public class Person {
       private String firstName;
       private String lastName;
  [...]
  }

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

С class variableдругой стороны, как следует из названия, он известен каждому члену класса; или технически: это известно / связано на уровне класса . Типичный пример - счетчик количества созданных вами объектов - хотя это очень проблемный пример; но это не имеет значения на этой ранней стадии.

  public class Person {
       private String firstName;
       private String lastName;
  [...]
       static int numberOfPersons = 0
  }

numberOfPersonsобъявляется, staticчто является ключевым словом для distingush между class variablesи instance variabes. Переменная объявляется как и другие в определении класса. Но staticключевое слово сигнализирует, что оно другое.

  • firstName, lastNameЯвляются переменными экземпляра и привязывается к этому примеру бетона

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

ТЛ; др

Место, где определены переменные, - это определение класса.

Переменные класса известны в / привязаны к уровню класса, то есть каждый конкретный экземпляр имеет доступ к нему. Чтобы определить переменную класса, вы используете ключевое слово static.

Переменные экземпляра известны только на уровне экземпляра. Вы определяете их без staticключевого слова.

Дальнейшая документация для Java здесь

Томас Джанк
источник