Які відмінності між змінними класу та змінними екземплярів у 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 #, тому вам не дуже допомогли
Skylar Adams

1
@BasileStarynkevitch Я в основному розробник C #, і оскільки принцип розраховує на те і інше, і такий же хороший, як і той самий, я швидко представив приклад C #, мене, звичайно, не так. :) Змінив мій приклад на Java.
Абас

2
@SkylarAdams Вибачте, я дуже помилково припустив, що кожен, хто знає Java, знає C #. Я змінив приклад на Java, сподіваюся, що це допомагає.
Аббас

9
З цього питання я вважаю, що це не має значення, використовуючи Java чи C #,
Thomas Junk

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, Тестування

Змінна категорія:

  • Класова змінна належить до класу.
  • змінна класу створюється додаванням ключового слова "статичне" перед змінною.
  • Також називається статичною змінною.
  • І найважливіша змінна категорія підтримує єдине спільне значення для всіх примірників класу, навіть якщо не існує жодного екземпляра об'єкта класу.

        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

Коротка різниця між змінною класу та змінною інстанції:

  • Змінні екземпляри мають окремі значення для кожного примірника класу. Змінні класу підтримують єдине спільне значення для всіх примірників класу, навіть якщо не існує жодного об'єкта цього примірника цього класу.
  • Ви б використали статичне ключове слово, щоб змінити змінну екземпляра на змінну класу.
  • Змінні екземпляра та класу оголошуються на рівні класу, а не в межах методів.

3

Різниця між class variablesі instanceзмінними - це просто питанняwho knows what? .

Відомий 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яке є ключовим словом для розгортання між class variablesі instance variabes. Змінна оголошується, як і інші, у межах визначення класу. Але staticключове слово сигналізує, що воно різне.

  • firstName, lastNameє змінними екземпляра і пов'язані з цим конкретним екземпляром

  • numberOfPersons прив’язаний до класу, щоб кожен екземпляр міг отримати доступ до цієї змінної.

тл; д-р

Місце, де визначаються змінні, - це визначення класу.

Змінні класу відомі на / прив'язуються до рівня класу, тобто кожен конкретний екземпляр має доступ до нього. Для визначення змінної класу ви використовуєте ключове слово static.

Змінні екземплярів відомі лише на рівні примірника. Ви визначаєте їх без staticключового слова.

Подальша документація для Java тут

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.