2012-06-29 2 views
13

Может кто-то уточнить значение приведенного ниже кода.Объявление объекта как окончательного в 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()); 
    } 
} 

Объект А объявлен окончательным, но может изменить значение переменной экземпляра этого объекта, а также retrive обновленное значение. Итак, каково значение объявления объекта как окончательного. Мне известно о объявлении примитивного типа данных как окончательного, что делает эту переменную постоянной.

ответ

31

ob не сможет связаться с другим объектом: final keyword.

Нельзя переназначить его. Но вы можете изменить его внутренности (он изменен, если он был изначально). Так это работает:

final A ob = new A(); 
    ob.setI(6) 

, но это не делает:

final A ob = new A(); 
    ob = new A(); 
+0

Так в основном это запрещает назначать новый экземпляр объекта? Как насчет других вещей, таких как say: 'Image img = loadImage (" img.png ");'. вы могли бы тогда: 'img = loadImage (" image.png ");'? или это будет незаконным? –

+0

@ LinkTheProgrammer, как вы думаете? – NimChimpsky

1

В Java, в отличие от C++, все объекты являются указателями, поэтому final объект может быть изменен, он просто может» t point any new, то есть вы не можете поместить его в левую часть оператора присваивания.

3

Если объект final, вы можете вызвать любые методы, которые выполняют внутренние изменения, как обычно, но вы не можете переназначить ссылку, чтобы указать на другой объект. Попытайтесь это сделать:

и обратите внимание, что код не скомпилируется.

Подумайте об этом как о постоянной ссылке.

3

Это означает следующее не представляется возможным:

final A ob = new A(); 
ob = new A(); // This is not possible 

Переменная ob будет также относиться к экземпляру класса A, который был первым присвоенной ему. В этом случае ключевое слово final. Это означает, что вы можете изменять атрибуты ob, потому что это обычный объект, как любой другой экземпляр A.

2

Ну, в случае объекта значение ссылки является адресом для объектов. Таким образом, значение ob будет адресом для объекта, созданного new A();, который будет окончательным, и вы не сможете изменить его значение. это означает, что вы не можете назначить новый объект этой ссылке.

Вы не можете написать этот путь.

final A ob = new A(); 

ob= new A(); // not allowed 
1

В java не будет постоянных (конечных) объектов. Объекты создаются в области памяти кучи. и мы можем изменить объект в любое время.
В java есть только постоянные (окончательные) ссылки: - означает, что вы не можете изменить ссылку и переадресовать ее любому другому объекту, поскольку она является постоянной и через окончательную ссылку ссылается только на один объект, который назначенный во время объявления.

Поэтому:

final A objectA = new A(); 
objectA.setI(6); 

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

Но:

final A objectA = new A(); 
    objectA = new A(); 

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

10

Если вы укажете какую-либо конечную переменную, это означает, что вы не хотите, чтобы значение, которое оно содержит в памяти, изменилось. В случае примитивных типов это значение, представляемое переменными, является фактическими значениями. В случае типов объектов значения в памяти являются ссылками на объект, а не на фактические объекты.

Например, у вас есть:

final int x = 7; 
final Object y = new Object(); 

Вы можете думать о данных, которые представлены в памяти таким образом:

+----------+----------+ 
| block | value | 
+----------+----------+ 
| 1001 | 7  | 
| 1002 | 2110 | 
+----------+----------+ 

Ради обсуждения, давайте оставим в деталях о том, как Java фактически управляет памятью (потому что я тоже мало знаю об этом). Таким образом, в приведенном выше примере блок 1001 представлен переменной x и 1002 на y. Оба являются конечными переменными, что означает, что значения, которые они представляют, не могут быть изменены. В случае x это 7, что является фактическим значением, но в случае y 2110 является просто ссылкой на другое место памяти. Оба не могут измениться, но причина, по которой примитивные переменные типа становятся константами, состоит в том, что они представляют фактические значения. Но на самом деле вы можете сказать то же самое и для переменных типа объекта, что только константы, которые они представляют, являются ссылками. Таким образом, ключевое слово окончательно в этом отношении довольно последовательное.

Таким образом, с конечными переменными, если они являются примитивными типами, они будут постоянно представлять любые определенные значения, которые вы им задали. Если они являются объектами/ссылочными типами, они будут постоянно указывать на любой объект, на который вы указываете (независимо от изменчивости объектов).

Смежные вопросы