1. 程式人生 > >Java千百問_05面向對象(008)_java中覆蓋是什麽

Java千百問_05面向對象(008)_java中覆蓋是什麽

返回 類變量 默認 public -m view ati 面向對象 text

點擊進入_很多其它_Java千百問

1、什麽是覆蓋

在java中,覆蓋是針對繼承才有的概念,某一個子類須要某些方法或屬性,但又不想使用父類中的同名的方法或屬性,就須要使用覆蓋
直白的來說,就是在子類中編寫與父類同名同參數同返回值的方法,或同名同類型的屬性。子類對象調用該方法/屬性時。運行的是子類的方法。而不會運行父類的方法(除非在方法第一行寫super();會先運行父類方法。再繼續運行子類代碼。

了解類的構造函數看這裏:類、對象究竟有什麽秘密
了解很多其它繼承看這裏:java類的繼承有什麽意義

2、構造函數怎樣覆蓋

了解類的構造函數看這裏:類、對象究竟有什麽秘密
當子類繼承一個父類時,構造子類時須要調用父類的構造函數,存在三種情況

  1. 父類無構造函數或者一個無參數構造函數時。子類若無構造函數或者有無參數構造函數。子類構造函數中不須要顯式調用父類的構造函數,系統會自己主動在調用子類構造函數前調用父類的構造函數。
  2. 父類僅僅有有參數構造函數時

    子類在構造方法中必須要顯示調用父類的構造函數,否則編譯出錯。

  3. 父類既有無參數構造函數,也有有參構造函數

    子類能夠不在構造方法中調用父類的構造函數,這時使用的是父類的無參數構造函數。

3、方法怎樣覆蓋

  1. 子類覆蓋父類的方法,必須有相同的參數返回類型
  2. 子類覆蓋父類的方法,在jdk1.5後。參數、返回類型能夠是父類方法返回類的子類
  3. 子類覆蓋父類的方法,能夠改動方法的修飾符。但僅僅能把方法的作用域放大。而不能把public改動為private。


    了解很多其它java修飾符看這裏:public、privite、protected有什麽差別

  4. 子類方法能夠訪問父類的protected屬性。但不能夠訪問默認的屬性

  5. 子類的靜態方法。與父類同名靜態方法互不影響。因為靜態方法使用類名調用,使用子類類名調用子類的方法。使用父類類名調用父類的方法。

  6. 多態時,當子類覆蓋了父類的方法,使用子類覆蓋的方法。


    了解什麽是多態:[java的多態性都有什麽表現][6]
    [6]:

4、屬性怎樣覆蓋

  1. 當子類覆蓋父類的實例變量時。父類方法使用的是父類的實例變量,子類方法使用的是子類的實例變量。

  2. 子類或父類使用實例變量時,都相當於在前面加了一個this指針
    (this.)。

了解很多其它java變量看這裏:局部變量、類變量、實例變量有什麽差別

5、實例

class SuperClass { 
    private int number; 


    public SuperClass() { 
        this.number = 0; 
    } 


    public SuperClass(int number) { 
        this.number = number; 
    } 


    public int getNumber() { 
        number++; 
        return number; 
    } 
} 

class SubClass1 extends SuperClass { 
    public SubClass1(int number) { 
        super(number); 
    } 

} 

class SubClass2 extends SuperClass { 
    private int number; 


    public SubClass2(int number) { 
        super(number); 
    } 

} 

public class SubClass extends SuperClass { 

    private int number; 


    public SubClass(int number) { 
        super(number); 
    } 


    public int getNumber() { 
        number++; 
        return number; 
    } 


    public static void main(String[] args) { 
        SuperClass s = new SubClass(20); 
        SuperClass s1 = new SubClass1(20); 
        SuperClass s2 = new SubClass2(20); 
        System.out.println(s.getNumber()); 
        System.out.println(s1.getNumber()); 
        System.out.println(s2.getNumber()); 
        //結論一:多態時,當子類覆蓋了父類的方法。使用子類覆蓋的方法 
        //結論二:當子類覆蓋父類的實例變量時,父類方法使用的是父類的 實例變量。子類方法使用的是子類的實例變量
    } 

} 

輸出結果:
1
21
21

Java千百問_05面向對象(008)_java中覆蓋是什麽