Итак, почему свойство класса не изменилось?
Поскольку объект не изменился, только тип ссылки на него. Кастинг вообще не влияет на сам объект.
В Java, в отличие от некоторых других языков (к счастью), тип ссылки в значительной степени не влияет на то, какую версию метода вы получите. Например, рассмотрим эти два класса (спасибо 2rs2ts!):
class Base {
public Base() {}
public void foo() {
System.out.println("I'm the base!");
}
}
class Child extends Base {
public Child() {}
public void foo() {
System.out.println("I'm the child!");
}
}
Этот код:
Child x = new Child();
Base y = (Base) x;
y.foo();
... выходы
I'm the child!
потому что даже несмотря на то, что тип y
Base
, объект, который мы вызываем foo
, является Child
, и поэтому вызывается Child#foo
. Здесь (снова любезно предоставлено 2rs2ts) пример на ideone для игры.
Тот факт, что мы получаем Child#foo
, несмотря на прохождение Base
ссылки, имеет решающее значение для полиморфизма.
Так уж случилось, что метод, который вы вызывали (getClass
), может только быть Object#getClass
, потому что это метод final
(подклассы не могут его переопределить). Но концепция имеет решающее значение, и я подумал, что это, вероятно, суть того, о чем вы спрашивали.
Главное, что делает тип ссылки - определяет, к каким аспектам объекта вам разрешен доступ. Например, предположим, что мы добавляем bar
к Child
:
class Child extends Base {
public Child() {}
public void foo() {
System.out.println("I'm the child!");
}
public void bar() {
System.out.println("I'm Child#bar");
}
}
Этот код не компилируется:
Child x = new Child();
Base y = (Base) x;
y.bar(); // <=== Compilation error
... потому что Base
не имеет bar
метода, и поэтому мы не можем получить доступ к bar
методу объекта через ссылку с типом Base
.
person
T.J. Crowder
schedule
18.03.2014