Я изо всех сил пытаюсь понять, что я считаю фундаментальным вопросом на 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 {}
http://stackoverflow.com/questions/ 1750106/how-can-i-use-pointers-in-java – chancea