Каковы различия между переменными класса и переменными экземпляра в 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 для изменения переменной экземпляра в переменную класса.
  • Переменные экземпляра и класса объявляются на уровне класса, а не в методах.

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 здесь

Используя наш сайт, вы подтверждаете, что прочитали и поняли нашу Политику в отношении файлов cookie и Политику конфиденциальности.
Licensed under cc by-sa 3.0 with attribution required.