覆寫是一個重要的概念,學好覆寫,後面的多態就好理解了。
1.方法的覆寫:當子類定義了與父類完全一樣的方法(方法名稱,參數類型及個數,返回值類型)時,這樣的操作就稱爲方法的覆寫
class A{
public void print(){
System.out.println("*******************A********************");
}
}
class B extends A{
public void print(){
System.out.println("@@@@@@@@@@@@A@@@@@@@@@@@@");//發生覆寫,編譯執行,以此爲輸出
}
}
public class TestJava{
public static void main(String args[]){
B b = new B();
b.print()
}
}
//輸出@@@@@@@@@@A@@@@@@@@@@@@@@@@@@@@
程序中使用了B類進行對象的實例化操作,並且在B類中已經明確的覆寫了方法,所以覆寫的一定是覆寫過的方法,主要
是看new這個符號實例化的對象覆寫的方法。
2.方法覆寫裏面super,this關鍵字的使用
super.方法()的使用主要是爲了避免子類調用自己覆寫的構造函數從而造成死循環。
this.方法():會先查找本類中有沒有此方法,如果沒有,直接使用繼承的父類的方法
super.方法(): 不查找本類的方法,直接使用父類的此方法。
3. 覆寫本身也是有嚴格要求的:被覆寫的方法不能擁有比父類更嚴格的訪問控制權限。
(從參數個數和種類,方法名,返回值類型,都要求和原方法一致,才屬於覆寫。)
private<default(friend)<public
如果父類的被覆寫方法採用了public權限聲明,那麼子類只能用public權限聲明,如果父類使用了default權限聲明,那子類可以使用default,public權限聲明,父類使用private,子類覆寫此方法可以採用private,default,public權限聲明。
例子一
class A{
public void fun(){
this.print();
}
public void print(){
System.out.println("**********A*********");
}
}
class B extends A{
public void print(){
System.out.println("@@@@@@@@@@A@@@@@@@@@");
}
}
public class TestJava{
public static void main(String args[]){
B b = new B();
b.fun();// 輸出爲被覆寫的print();@@@@@@@@@@A@@@@@@@@@
}
}
例子二
class A{
public void fun(){
this.print();
}
private void print(){
System.out.println("**********A*********");
}
}
class B extends A{
public void print(){
System.out.println("@@@@@@@@@@A@@@@@@@@@");
}
}
public class TestJava{
public static void main(String args[]){
B b = new B();
b.fun();// 此時輸出又爲**********A*********
}
}
//此時輸出又爲**********A*********,此時子類沒有對父類的print()方法進行覆寫,子類沒有辦法對//父類聲明爲private的方法進行覆寫。
在實際中對於方法的定義,95%都是使用public定義。
4:請解釋Overloading和Override的區別?在進行overloading的時候能否改變返回值類型。
No | 區別 | 方法重載 | 方法覆寫 |
1 | 單詞 | Overloading | Override |
2 | 範圍 | 發生在一個類之中 | 發生在繼承關係類中 |
3 | 權限 | 沒有權限要求 | 被覆寫的方法不能擁有比父類更嚴格的訪問控制權限,實際中就用public |
4 | 定義 | 方法名相同,參數的類型及個數不同 | 方法名,返回值,參數類型,參數個數,都相同 |
5. 請解釋this與super的區別
No | 區別 | this | super |
1 | 概念 | 表示調用本類屬性 this.屬性,調用本類方法this.方法,this() | 調用父類屬性 |
2 | 構造要求 | 調用構造方法是必須放在構造方法的首行,所以this(),super()不可能同時出現,但是子類永遠回去調用父類中的構造方法 | 同左 |
3 | 特殊要求 | 表示當前對象 | --- |
6.總結
所有類屬性都必須要使用private權限,子類是沒法訪問的,所以覆寫也沒有意義。
方法覆寫的調用特點:看實例化是哪個子類的對象(new出現在那裏),觀察調用的方法是否已經被該子類覆寫,如果覆寫則調用被覆寫的方法,如果沒有覆寫則調用父類的方法