1. 程式人生 > >Java千百問_05面向物件(008)_java中覆蓋是什麼

Java千百問_05面向物件(008)_java中覆蓋是什麼

1、什麼是覆蓋

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

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.)。

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