重寫的要求:
- 子類方法的形參串列和方法名必須和父類方法的形參串列和方法名一樣
- 子類方法的回傳型別必須是父類方法回傳型別或為其子型別,例如父類方法回傳型別為Object類,那么子類的回傳型別可以是Object,也可以是String
- 子類方法的訪問權限必須大于等于父類方法; (訪問權限:public>default>protected>private)
- 子類方法拋出的例外型別必須是父類拋出例外型別或為其子型別,
重寫和多載區別
| 多載(Overload) | 重寫(Override) | |
|---|---|---|
| 發生范圍 | 本類 | 父子類 |
| 形參串列 | 形參型別/個數/順序至少一個不同 | 父子類必須相同 |
| 回傳型別 | 沒有要求 | 子類方法的回傳型別必須是父類方法回傳型別或為其子型別 |
| 修飾符 | 無要求 | 子類方法的訪問權限必須大于等于父類方法 |
擴展
在呼叫一個方法時,先從本類中查找是否有對應的方法(this.func(this))
如果沒有再到父類中查找是否有對應的方法(super.func(this))
如果仍然沒有就要將引數型別轉成其父型別別之后再到本類中看是否有對應的方法(this.func(super))
如果仍然沒有就再到父類中查找是否有對應的方法(super.func(super))
優先級:從高到低
this.func(this)
super.func(this)
this.func(super)
super.func(super)
this和super有點模糊的可以去看一下這篇 this和super關鍵字
案例
class One{
public void test(One obj) {
System.out.println("呼叫了One的方法,引數型別是One");
}
public void test(Three obj){
System.out.println("呼叫了One的方法,引數型別是Three");
}
public void test(){
System.out.println("1111111");
}
public void show(){
System.out.println("One show");
}
}
class Two extends One{
@Override
public void test(One obj){System.out.println("呼叫了Two的方法,引數型別是One");}
// @Override
// public void test(Three obj){
// System.out.println("呼叫了Two的方法,引數型別是Three");
// }
@Override
public void show(){
System.out.println("Two show");
}
}
class Three extends Two {}
class Four extends Three {}
public static void main(String[] args) {
One one = new One();
Two two = new Two();
Three three = new Three();
Four four = new Four();
one.test(one);
// one是One類創造的物件,引數型別是One類,先從One類中找是否有test(One obj)方法,有所以直接呼叫
// 結果:呼叫了One的方法,引數型別是One
one.test(two);
// one是One類創造的物件,引數型別是Two類,先從One類中找是否有test(Two obj)方法,
// 沒有,所以到One類的父類Object中查看,Object也沒有test(Two obj)方法
// 所以對引數進行轉型,將Two類轉成其父類One,再到One類中找是否有test(One obj)方法,有所以直接呼叫
// 結果:呼叫了One的方法,引數型別是One
two.test(three);
// two是Two類創造的物件,引數型別是Three類,先從Two類找是否有test(Three obj)方法
// 沒有,所以到Two類的父類One中查看
// 找到One類中有test(Three obj)方法,直接呼叫
// 結果:呼叫了One的方法,引數型別是Three
two.test(four);
// two是Two類創造的物件,引數型別是Four類,先從Two類找是否有test(Four obj)方法
// 沒有,所以到Two類的父類One中查看
// One類中沒有test(Four obj)方法,所以到One類的父類Object中查看,Object也沒有test(Four obj)方法
// 所以對引數進行轉型,將Four類轉成其父類Three
// 再到Two類中找是否有test(Three obj)方法,沒有
// 再到Two類的父類One中看是否有test(Three obj)方法,有所以直接呼叫
// 結果:呼叫了One的方法,引數型別是Three
One one1 = new Two(); // 參考的是Two物件:父類One的參考指向子類的型別
//Two two1 = new One(); // 反過來不行,子類的參考不能指向父類
one1.test(one1);
// one1是Two類創造的物件,引數型別是Two類,先從Two類找是否有test(Two obj)方法
// 沒有,所以找Two類的父類One,看是否有test(Two obj)方法
// 還是沒有,所以到One類的父類Object中查看,Object也沒有test(Two obj)方法
// 所以將引數型別Two類轉為其父類One,再到本類(Two)查找是否有test(One obj)方法,有所以直接呼叫
// 結果:呼叫了Two的方法,引數型別是One
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/534086.html
標籤:Java
下一篇:運算子
