1. 重寫:子類對父類中某些方法進行重新定義,在調用這些方法時就會調用子類的方法。
2. 向上轉型
public class Wine {
public void fun1(){
System.out.println("Wine 的Fun.....");
fun2();
}
public void fun2(){
System.out.println("Wine 的Fun2...");
}
}
class JNC extends Wine{
/**
* @desc 子類重寫父類方法
* 父類中不存在該方法,向上轉型後,父類是不能引用該方法的
* @param a
* @return void
*/
public void fun1(String a){
System.out.println("JNC 的 Fun1...");
fun2();
}
/**
* 子類重寫父類方法
* 指向子類的父類引用調用fun2時,必定是調用該方法
*/
public void fun2(){
System.out.println("JNC 的Fun2...");
}
}
class Test {
public static void main(String[] args) {
Wine a = new JNC();
a.fun1();
}
}
//====================================================================
結果:Wine 的Fun.....
JNC 的Fun2...
分析:在這個程序中子類JNC重載了父類Wine的方法fun1(),重寫fun2(),而且重載後的fun1(String a)與 fun1()不是同一個方法,由於父類中沒有該方法,向上轉型後會丟失該方法,所以執行JNC的Wine類型引用是不能引用fun1(String a)方法。而子類JNC重寫了fun2() ,那麼指向JNC的Wine引用會調用JNC中fun2()方法。
public class Wine {
public void fun1(){
System.out.println("Wine 的Fun.....");
fun2();
}
public void fun2(){
System.out.println("Wine 的Fun2...");
}
}
class JNC extends Wine{
/**
* @desc 子類重寫父類方法
* 父類中不存在該方法,向上轉型後,父類是不能引用該方法的
* @param
* @return void
*/
public void fun1(){//改爲重寫,非重載
System.out.println("JNC 的 Fun1...");
fun2();
}
/**
* 子類重寫父類方法
* 指向子類的父類引用調用fun2時,必定是調用該方法
*/
public void fun2(){
System.out.println("JNC 的Fun2...");
}
}
class Test {
public static void main(String[] args) {
Wine a = new JNC();
a.fun1();
}
}
//===============================================================================
輸出:JNC 的 Fun1...
JNC 的Fun2...
總結:指向子類的父類引用由於向上轉型了,它只能訪問父類中擁有的方法和屬性,而對於子類中存在而父類中不存在的方法,該引用是不能使用的,儘管是重載該方法。若子類重寫了父類中的某些方法,在調用該些方法的時候,必定是使用子類中定義的這些方法(動態連接、動態調用)。(子類中有的,父類沒有,無法使用。子類有,父類有,使用子類中的方法)
牢牢記住一句話:無論向上向下轉型,編譯看左邊,運行看右邊。
意思就是:編譯時候左邊的對象有沒有該方法(不嚴謹),運行時候看new的對象是誰,就調用誰的方法
文章借鑑點擊跳轉