окончательный и статический в Java - PullRequest
25 голосов
/ 26 октября 2010

Я прочитал это предложение в книге, но я не понял его:

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

Кто-нибудь может мне это объяснить?

Ответы [ 4 ]

52 голосов
/ 26 октября 2010

Источник вашей путаницы может заключаться в том, что слово «статический» в английском языке и его значение в Java имеют слабую связь.

Переменная, определенная в классе Cat "обычным" способом, может называться переменной экземпляра.

class Cat {
   int weight;
}

Каждый раз, когда вы создаете новый объект типа Cat, вы создаете новую копию переменной 'weight'. Если вы создаете 10 объектов типа Cat, у каждого есть своя копия переменной weight.

«Статическая» переменная может рассматриваться как переменная уровня класса, в отличие от переменной экземпляра. Статическая переменная имеет только одну копию и принадлежит самому классу Cat, а не одной копии для каждого объекта типа Cat.

class Cat {
   static String speciesName;

   int weight;
}

Здесь, независимо от того, сколько объектов типа Cat мы создаем, существует только одна копия вида Name.

Если статическая переменная также 'final', то эта единственная копия переменной является единственной частью хранилища, которую нельзя изменить. Если бы переменная 'weight' была последней в приведенном выше примере, было бы 10 единиц хранения, которые нельзя было бы изменить - по одному для каждого объекта типа Cat, который мы создали.

26 голосов
/ 26 октября 2010
Переменная

A static является общей для всех экземпляров класса. Переменная final не может быть изменена после того, как она была установлена ​​в первый раз.

Таким образом, переменная static final в Java является общей для всех экземпляров класса и не может быть изменена после того, как была установлена ​​в первый раз.

class Car {

    static final int numberOfWheels = 4;
    Color color;

    public Car(Color color) {
        this.color = color;
    }
}

Car redCar = new Car(Red);
Car blueCar = new Car(Blue);

У каждого автомобиля теперь есть одно индивидуальное и переменное свойство color, и они имеют свойство numberOfWheels, которое нельзя изменить.

1 голос
/ 26 сентября 2015
  • Окончательный означает, что не может повторно присвоить значение какой-либо переменной
  • Статический означает, что только одна копия ссылки может быть в целом в классе всехметоды.
1 голос
/ 26 октября 2010

См. Раздел «Константы» для объяснения на этой странице:

http://download.oracle.com/javase/tutorial/java/javaOO/classvars.html

...