Действуют ли конечные (постоянные) экземпляры (нестатические) переменные как классовые (статические) переменные? - PullRequest
2 голосов
/ 14 марта 2012

В следующем примере переменная b объявлена ​​final, но не static. Это означает, что это постоянная переменная экземпляра. Однако, поскольку он постоянен, ни один из объектов Passenger не может изменить его значение. Так не лучше ли объявить его static и сделать его переменной класса, чтобы во всех экземплярах объектов была только одна копия?

class Passenger {
    int a;
    final int b = 0;

    void drive() {
        System.out.println("I'm driving!");
    }
}

Ответы [ 6 ]

10 голосов
/ 14 марта 2012

Цель final, но не static переменных - иметь константу для всего объекта. Должен быть инициализирован в конструкторе:

class Passenger {
    final int b;

    Passenger(int b) {
        this.b = b;
    }
}

Если вы всегда присваиваете постоянное литеральное значение (0) переменной final, это не имеет особого смысла. Использование static является предпочтительным, так как у вас есть только одна копия b:

static final int b = 0;

Кстати, я не думаю, что иметь модификатор доступа по умолчанию было вашим намерением.

1 голос
/ 14 марта 2012

Если у вас есть несколько экземпляров класса Passenger, я бы сделал его статичным. Несмотря на то, что это дает мало пользы, когда речь идет о переменной int, это может сэкономить немного памяти, если у вас есть сложные объекты. Это связано с тем, что статическая переменная принадлежит классу, а не экземпляру, поэтому пространство памяти для нее будет зарезервировано только один раз, и на него будет ссылаться сам объект класса, а не экземпляры. Конечно, вы должны знать, что b в качестве статической переменной означает, что изменения, внесенные в эту переменную, будут отражены во всех классах, которые обращаются к этой переменной, но, поскольку вы сделали это final, это не будет дело.

Также обратите внимание, что с помощью написанного вами кода классы в том же пакете, что и Passenger, смогут читать значение b, получая к нему доступ через Passenger.b (если он статический).

1 голос
/ 14 марта 2012

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

0 голосов
/ 25 апреля 2015

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

0 голосов
/ 14 марта 2012
Примитив

A final аналогичен примитиву static final (за исключением более эффективного)

A final ссылка на неизменный объект аналогична ссылке static final того же самого.

A final ссылка на изменяемый объект НЕ совпадает с static final ссылкой того же.

final int i = 0;
// same as
static final int = 0;

final String hi = "Hello";
// same as
static final String hi = "Hello";

final List<String> list = new ArrayList<String>();
// is NOT the same as
static final List<String> list = new ArrayList<String>();

Единственный раз, когда последний пример совпадает, это когда у вас естьсинглтон.Синглтоны довольно часто пишутся с путаницей статических и нестатических полей и методов, поскольку различие не очевидно.: |

0 голосов
/ 14 марта 2012

В java атрибут static в основном означает: , связанный с самим типом, а не с экземпляром типа .

Другими словами, вы можете ссылаться на статическую переменную, не создавая экземпляры этого типа ... В то время как в случае просто использования final вам нужно создать экземпляр класса.

Итак, да, чтобы ответить на ваш вопрос, я бы сказал, что вы правы. :)

...