Объявление объекта как final в java
Может кто-то уточнить значение приведенного ниже кода.
class A
{
int i = 10;
public void setI(int b)
{
i = b;
}
public int getI()
{
return i;
}
}
class Test
{
public static void main(String args[]) throws Throwable
{
final A ob = new A();
ob.setI(10);
System.out.println(ob.getI());
}
}
Объект A объявляется окончательным, но я могу изменить значение этой переменной экземпляра объекта, а также извлечь обновленное значение. Итак, каково значение объявления объекта как окончательного.
Я знаю о объявлении примитивного типа данных как final, что делает эту переменную постоянной.
Ответы
Ответ 1
ob не сможет ссылаться на любой другой объект: ключевое слово final.
Он не может быть переназначен. Но вы можете изменить его внутренности (он изменен, если он был изначально).
Итак, это работает:
final A ob = new A();
ob.setI(6)
но это не так:
final A ob = new A();
ob = new A();
Ответ 2
Если вы укажете какую-либо конечную переменную, это означает, что вы не хотите, чтобы значение, которое оно содержит в памяти, изменилось. В случае примитивных типов это значение, представляемое переменными, является фактическими значениями. В случае типов объектов значения в памяти являются ссылками на объект, а не на фактические объекты.
Например, у вас есть:
final int x = 7;
final Object y = new Object();
Вы можете представить данные, представленные в памяти таким образом:
+----------+----------+
| block | value |
+----------+----------+
| 1001 | 7 |
| 1002 | 2110 |
+----------+----------+
В целях обсуждения давайте не будем подробно описывать, как Java фактически управляет памятью (потому что я тоже мало знаю об этом). Таким образом, в приведенном выше примере блок 1001 представлен переменной x и 1002 на y. Оба являются конечными переменными, что означает, что значения, которые они представляют, не могут быть изменены. В случае x это 7, которое является фактическим значением, но в случае y 2110 является просто ссылкой на другое место памяти. Оба не могут измениться, но причина, по которой примитивные переменные типа становятся константами, состоит в том, что они представляют собой фактические значения. Но на самом деле вы можете сказать то же самое и для переменных типа объекта, что только константы, которые они представляют, являются ссылками. Таким образом, окончательное ключевое слово в значительной степени соответствует этому вопросу.
Итак, с конечными переменными, если они являются примитивными типами, они будут постоянно представлять любые определенные значения, которые вы им задали. Если они являются объектами/ссылочными типами, они будут постоянно указывать на любой объект, на который вы указываете (независимо от изменчивости объектов).
Ответ 3
Если объект final
, вы можете вызвать любые методы, которые выполняют внутренние изменения, как обычно, но вы не можете переназначить ссылку, чтобы указать на другой объект. Попробуйте сделать это:
final A ob = new A();
ob = new A();
и обратите внимание, что код не будет компилироваться.
Подумайте об этом как о постоянной ссылке.
Ответ 4
Это означает, что следующее невозможно:
final A ob = new A();
ob = new A(); // This is not possible
Переменная ob
также будет ссылаться на экземпляр класса A
, который был сначала назначен ему. То, что в данном случае означает ключевое слово final
. Это означает, что вы можете изменять атрибуты ob
, потому что это обычный объект, как любой другой экземпляр A
.
Ответ 5
Ну, в случае объекта значение ссылки - это адрес для объектов. Таким образом, значение ob будет адресовано объекту, созданному new A();
, который будет окончательным, и вы не сможете изменить его значение. это означает, что вы не можете назначить новый объект этой ссылке.
Вы не можете писать так.
final A ob = new A();
ob= new A(); // not allowed
Ответ 6
В java, в отличие от С++, все объекты являются указателями, поэтому объект final
может быть изменен, он просто не может указать ничего нового, то есть вы не можете поместить его в левую часть оператор присваивания.
Ответ 7
В java не будет никаких постоянных (конечных) объектов. Объекты создаются в области памяти кучи. и мы можем изменить объект в любое время.
В java есть только постоянные (окончательные) ссылки: - означает, что вы не можете изменять ссылку и переназначать ее на любой другой объект, потому что она является постоянной и через окончательную ссылку ссылается только на один объект, который назначается во время декларация.
Следовательно:
final A objectA = new A();
objectA.setI(6);
Действителен, потому что мы изменяем только содержимое объекта, а не ссылку.
Но:
final A objectA = new A();
objectA = new A();
Недействительно, потому что вы пытаетесь изменить ссылку.