Когда я буду использовать переменную класса в Java против переменной экземпляра?

Вот общий класс, который я определил, я хотел бы знать, когда я создаю более конкретные классы, например, класс CAR, когда я буду использовать переменную класса? Мое личное понимание переменной класса состоит в том, что одна копия переменной класса, которая была объявлена ​​в классе, будет объявлена ​​с использованием ключевого слова static, и что каждый объект, который был создан из класса, будет содержать одну копию класса переменная.

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

Таким образом, переменная экземпляра полезна для определения свойств класса / типа данных, например, дом будет иметь местоположение, но теперь, когда я буду использовать переменную класса в объекте дома? или другими словами, как правильно использовать объект класса при проектировании класса?

public class InstanceVaribale {
public int id; //Instance Variable: each object of this class will have a seperate copy of this variable that will exist during the life cycle of the object.
static int count = 0; //Class Variable: each object of this class will contain a single copy of this variable which has the same value unless mutated during the lifecycle of the objects.

InstanceVaribale() {
    count++;

}
public static void main(String[] args) {

    InstanceVaribale A = new InstanceVaribale();
    System.out.println(A.count);
    InstanceVaribale B = new InstanceVaribale();
    System.out.println(B.count);
    System.out.println(A.id);
    System.out.println(A.count);
    System.out.println(B.id);
    System.out.println(B.count);    
    InstanceVaribale C = new InstanceVaribale();
    System.out.println(C.count);
}
}

4 ответа

Решение

Мое личное понимание переменной класса состоит в том, что одна копия переменной класса, которая была объявлена ​​в классе, будет объявлена ​​с использованием ключевого слова static, и что каждый объект, который был создан из класса, будет содержать одну копию класса переменная.

Нет, дело не в том, что "каждый объект будет содержать одну копию". Статическая переменная связана с типом, а не с каждым экземпляром типа. У экземпляров вообще нет переменной.

Существует ровно одна переменная (при условии, что вы загружаете ее только из одного загрузчика классов), однако существует множество экземпляров типа. Нет экземпляров? Еще одна переменная. Миллион экземпляров? Еще одна переменная.

Статические переменные в основном полезны для констант или подобных им констант - таких как логгеры или "набор действительных цен" и т. Д. Вещи, которые не меняются в течение приложения. Они почти всегда должны быть final по моему опыту, и тип должен быть неизменным типом (как String). Там, где это возможно, используйте также неизменяемые коллекции для статических переменных - или убедитесь, что переменная является закрытой и что вы никогда не изменяете коллекцию в классе.

Вы должны избегать использования статических переменных для хранения глобального изменяющегося состояния. Это делает код намного сложнее для тестирования и рассуждений.

Статические переменные используются для хранения значений, которые являются общими для всех экземпляров класса.

Если это не так, это должна быть переменная экземпляра.

1. Каждый object of the class будет иметь собственную копию переменной экземпляра, его One per Object.

2. Но static variable будет общим для всех объектов класса, его One per Class.

3. Теперь я приведу 2 примера, где эти два будут иметь значение.

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

Рассмотрим Игровую Программу, тогда у каждого игрока будут разные Имя, Счета, Сила оружия, Достигнутая стадия и т. Д......

Статическая переменная:

Рассмотрим банковскую программу, где каждому клиенту будет присвоен идентификатор, который больше и уникален по сравнению с предыдущим, поэтому статическая переменная будет подходящей для этого.

Определения:

Переменные класса. Переменные класса, также известные как статические переменные, объявляются с ключевым словом static в классе, но вне метода, конструктора или блока.There would only be one copy of each class variable per class, regardless of how many objects are created from it.

Переменные экземпляра. Переменные экземпляра объявляются в классе, но вне метода.When space is allocated for an object in the heap, a slot for each instance variable value is created.

Локальные переменные. Локальные переменные объявляются в методах, конструкторах или блоках.Local variables are created when the method, constructor, or block is entered and the variable will be destroyed once it exits the method, constructor, or block.

Примеры:

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

      class ClassVar {
  static int count; //class level variable
  public static void main(String[] args) {

    ClassVar obj1 = new ClassVar();
    ClassVar obj2 = new ClassVar();
    obj1.count=5;
    obj2.count=5;
    
    obj1.count++; //change in object1's count

    System.out.println(obj1.count); // 6
    System.out.println(obj2.count); // 6
  }
}

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

      class InstanceVar {
  int count; //instance level variable
  public static void main(String[] args) {

    InstanceVar obj1 = new InstanceVar();
    InstanceVar obj2 = new InstanceVar();
    obj1.count=5;
    obj2.count=5;
    
    obj1.count++; //change in object1's count

    System.out.println(obj1.count); // 6
    System.out.println(obj2.count); // 5
  }
}

Как вы могли заметить, один и тот же код со словом меняет реализацию.Updating object1’s count changes object2’s count as well.

Комбинированный пример

      public class Car {
    // Class variable
    static int numCars = 0;
    
    // Instance variables
    String make;
    String model;
    int year;
    
    public Car(String make, String model, int year) {
        this.make = make;
        this.model = model;
        this.year = year;
        
        // Increment the number of cars each time a new Car object is created
        numCars++;
    }
    
    public void printCarInfo() {
        System.out.println("Make: " + make + " ,Model: " + model + " ,Year: " + year);
    }
    
    public static void printNumCars() {
        System.out.println("Number of cars: " + numCars);
    }
}

В этом примереnumCarsявляется переменной класса, поскольку она объявлена ​​с ключевым словом, что означает, что она используется всеми экземплярами класса. Мы используем его для отслеживания общего количества созданных объектов Car. Это значение будет увеличиваться каждый раз, когда создается новый экземпляр класса Car.

make,model, иyearявляются переменными экземпляра, поскольку они не объявлены какstatic, что означает, что они принадлежат каждому отдельному объекту Car. В них будет храниться информация о конкретном экземпляре автомобиля.

Теперь, если мы добавим основной метод для демонстрации

       public static void main(String[] args) {
    Car car1 = new Car("Toyota", "Camry", 2021);
    Car car2 = new Car("Honda", "Civic", 2022);
    Car car3 = new Car("Ford", "Mustang", 2023);

    car1.printCarInfo();
    car2.printCarInfo();
    car3.printCarInfo();

    Car.printNumCars();
}

Здесь мы создали три экземпляра автомобиля и распечатали их детали. Теперь значение numCars также будет равно 3, поскольку это переменная класса, которая будет использоваться всеми экземплярами класса Car. Окончательный результат будет выглядеть примерно так, как показано ниже.

      Make: Toyota ,Model: Camry ,Year: 2021
Make: Honda ,Model: Civic ,Year: 2022
Make: Ford ,Model: Mustang ,Year: 2023
Number of cars: 3
Другие вопросы по тегам