Объявление объекта как 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();  

Недействительно, потому что вы пытаетесь изменить ссылку.