Father father=new Son() 父類引用指向子類對象實現多態(動態綁定)
"編譯看左運行看右"
public class Father {
public void doing() {
talking();
}
public void talking() {
System.out.println("father is talking!");
}
}
public class Son extends Father {
@Override
public void talking() {
System.out.println("Son is talking!");
}
public static void main(String[] args) {
Father father = new Son();
father.doing();
//輸出結果爲 Son is talking!
}
}
編譯看左運行看右(但是成員變量除外,父類引用指向子類對象時)
class Fu {
int value=100;
}
class Zi extends Fu{
int value=999;
}
public class Demo04 {
public static void main(String[] args) {
Fu fu=new Zi();
System.out.println(fu.value);
//輸出結果爲100成員變量無法實現多態,但成員方法可以
}
}
向上轉型絕對安全,向下轉型有可能會拋出ClassCastException異常
class Useful {
public void f() {
}
public void g() {
}
}
class MoreUseful extends Useful {
@Override
public void f() {
}
@Override
public void g() {
}
public void u() {
}
public void v() {
}
public void w() {
}
}
public class RTTI_Test {
public static void main(String[] args) {
Useful[] usefuls={
new Useful(),
new MoreUseful(),
};
usefuls[0].f();
usefuls[1].f();
((MoreUseful)usefuls[0]).v(); //向下轉型錯誤,拋出ClassCastException異常
((MoreUseful)usefuls[1]).v();
}
}
父類構造方法儘量避免使用public修飾的方法.
可使用final或private修飾的方法,因爲父類構造器調用被重寫的方法後,可能子類方法中的子類成員變量還未被初始化.