在下面的代碼中,子類擴展了它的超類,並覆蓋了它的方法,使用它來調用子類中唯一的另一個方法,該方法使用子類的變量。將子類保存爲超類型並在Java中使用其方法
程序然後將子類的實例存儲到類型爲Superclass的變量,然後調用其方法。然後運行,就好像它是Subclass類型一樣,調用子類的唯一方法和變量。但是,直接訪問它們是不可能的。
class Superclass {
void go() {
System.out.println(0);
}
}
class Subclass extends Superclass {
int i = 1;
@Override
void go() {
run();
}
void run() {
System.out.println(i);
}
}
public class JavaApplication {
public static void main(String[] args) {
Superclass instance = new Subclass();
instance.go(); // outputs 1; it must have called run() and accessed i
instance.run(); // causes compile-time error
System.out.println(instance.i);// causes compile-time error
}
}
一旦Subclass實例保存爲類型Superclass,它仍然可以訪問所有Subclass字段和方法。那麼爲什麼我不能直接訪問它們呢?
類型由於引用類型是超類,也沒有保證所引用對象有這種方法。 – Veluria
確實。只因爲你知道他們在那裏,並不意味着電腦可以保證他們會。你想做的事情叫做[downcasting](http://en.wikipedia.org/wiki/Downcasting),一般來說這是一件糟糕的壞事,可能意味着你的設計需要仔細考慮。在某些情況下,它是不可避免的,但這些是少之又少(尤其是適當的泛型) – aruisdante
[可以在超類對象上調用子類的方法嗎?](http://stackoverflow.com/問題/ 898909/is-it-it-it-it-call-subclasses-methods-on-a-superclass-object) –