java 父類子類有同名方法時如何呼叫的實現
父類引用預設呼叫子類重寫的方法
如果父類的引用p指向了子類的例項,則通過這個引用p訪問同名方法時,呼叫的是子類重寫的方法。
父類引用p可以指向不同的子類,呼叫不同子類重寫的不同的同名方法,進而達到類間多型的效果。
但是,父類的引用只能訪問子類重寫的方法,父類中沒有的方法,父類的引用不能訪問。也就是說,通過父類的引用來呼叫子類的方法時,不能訪問到子類後來自己定義的方法。
子類引用預設呼叫自定義的方法
通過子類的引用訪問同名方法時,預設是重寫之後的同名方法。
子類通過super關鍵字來呼叫被隱藏的父類方法
如果還要訪問父類的同名方法,可以使用super關鍵字來顯示呼叫。
多型
多型存在的三個必要條件:要有繼承、要有重寫、父類變數引用子類物件。
重寫原則:兩同兩小一大
兩同:
方法名相同
形參列表要相同
兩小
丟擲的異常型別小於等於父類方法丟擲的異常型別,也就是要麼是原來的異常型別(相等),要麼是原來異常型別的子類(更小)
返回值型別要小於等於比父類的返回值型別,也就是要麼返回原來的返回值型別(相等),要麼是原來的返回值型別的子類(更小)
一大
子類重寫的方法的訪問許可權要大於等於父類方法的訪問許可權:
如果原來的訪問型別為public,則重寫的方法的訪問許可權只能是public。
在Java 8之前,Java介面的方法預設使用public abstract修飾,所以實現介面方法時,訪問許可權只能是public。
過載原則:兩同一不同
兩同
過載發生在同一個類中,
跟繼承沒有關係.
一不同
形參列表不同
如何判斷是過載還是重寫
看形參列表:
當方法名相同,形參也相同的時候,就是重寫,此時還需要滿足重寫的其他條件,不然就會出現錯誤。
當方法名相同,但是形參列表不同的時候,就是過載
覆蓋和過載的區別
對形參列表的要求不同
重寫要求形參列表要相同,
而過載要求形參列表不相同
對丟擲的異常的要求不同
重寫要求丟擲的異常更小或相等
過載對丟擲的異常沒有要求
對返回值型別的要求不同
重寫要求返回值型別更小或相等
過載對返回值型別沒有要求
對訪問許可權的要求不同
重寫要求訪問許可權要更大或相等,
而過載對訪問許可權沒有要求
發生的範圍不同
重寫發生子類繼承父類的時候
過載發生在同一個類中,和繼承沒有關係.
過載和重寫的相同點
方法名要相同
補充知識:java中子類繼承父類和實現介面有同名方法怎麼處理
以上這篇java 父類子類有同名方法時如何呼叫的實現就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。
public interface MyInterface { void test(); }
public class Father { public void test() { System.out.println("父類方法"); } }
public class Son extends Father implements MyInterface{}
子類直接繼承父類和實現介面不實現介面方法不報錯,說明這種情況下預設父類實現該方法
2.我們將父類中方法註釋掉,看看結果
public interface MyInterface { void test(); } public class Father { // public void test() { // System.out.println("父類方法"); // } }
很明顯,子類在繼承過程中出現了錯誤提示,需要實現介面中的方法
3.將父類中方法取消註釋,子類實現該方法,程式碼如下:
public interface MyInterface { void test(); } public class Father { public void test() { System.out.println("父類方法"); } }
可以看到,子類方法提示是重寫的父類方法。
至此,驗證完畢!
以上這篇java 父類子類有同名方法時如何呼叫的實現就是小編分享給大家的全部內容了,希望能給大家一個參考,也希望大家多多支援我們。