2015-02-06 6 views
0

Я изо всех сил пытаюсь понять, что я считаю фундаментальным вопросом на Java. Ниже приведен ответ, что строка 3 опирается на исключение класса. Я вижу, что изначально a1 указывал на массив объекта A. Но в строке 1 нет набора get, указывающего на массив объекта b? И поэтому, если a1 указывал на a, должен ли он теперь также не указывать на b?Ссылки и литье

Объяснение от Enthuware: -

Программа будет бросать java.lang.ClassCastException на линии, обозначенной 3 при запуске.

Линия // 1 будет разрешена во время компиляции, поскольку назначение выполняется из ссылки подкласса на ссылку суперкласса. Листинг в строке // 2 необходим, потому что ссылка на суперкласс применяется к ссылочной переменной подкласса. И это работает во время выполнения, потому что объект, на который ссылается a, фактически представляет собой массив B. Теперь приведение в строке // 3 говорит компилятору не беспокоиться, что я хороший программист, и я знаю, что я а объект, на который ссылается ссылка суперкласса (a1), будет фактически иметь класс B во время выполнения. Таким образом, ошибка времени компиляции отсутствует. Но во время выполнения, это не удается, потому что сам объект не является массивом B, но это массив А.

public static void main(String args[]) { 

    A[] a, a1; 
    B[] b; 
    a = new A[10]; 
    a1 = a; 
    b = new B[20]; 
    a = b;   //line 1 
    b = (B[]) a; //line 2 
    b = (B[]) a1; //line 3 

    } 

} 

class A { 
} 

class B extends A {} 
+0

http://stackoverflow.com/questions/ 1750106/how-can-i-use-pointers-in-java – chancea

ответ

0

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

В вашем примере a и a1 ссылаются на тот же массив. Если вы изменяете ссылочный объект, массив A, это то же самое, если вы используете a или a1, потому что они ссылаются на один и тот же объект.

A[] a, a1; 
a = new A[10]; 
a1 = a; 
/* You can use a or a1 to modify the object with the same results. */ 
a[0] = new A(); /* Equivalent to a1[0] = new A() */ 

Если вы изменяете переменную для ссылки на другой объект, другая ссылка остается неизменной.

A[] a, a1; 
a = new A[10]; 
a1 = a; 
a = new A[15]; /* a1 still references the first array and a the new one */ 

Нечто похожее происходит, когда вы используете ссылку на объект как параметр функции.

Чтобы сделать пример, учитывая, чем метод:

public static void uselessMethod(A[] a) { 
    /* a is a local variable that makes reference to the object, 
     modify the reference only has effect inside this method, 
     but modify the array has effects outside the method */ 
    a = null; 
} 

При вызове метода выше, ваша ссылка не изменится:

A[] a = new A[10]; 
uselessMethod(a); 
System.out.println(a.length); /* This will print 10 */ 
1

И поэтому, если a1 указывал на должно теперь также не указывают на б?

No.

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

+0

Спасибо за ваш ответ. Вы оба были полезны, но я думаю, что объяснение Дэвида SN объясняется тем, о чем я не мог понять. – user4702831

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