1. 程式人生 > 程式設計 >Java繼承方法重寫實現原理及解析

Java繼承方法重寫實現原理及解析

這篇文章主要介紹了Java繼承方法重寫實現原理及解析,文中通過示例程式碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下

在Java繼承中,子類可以獲得父類所有的結構,也可以增加與父類不同的屬性和方法。但是,有一種情況,一個相同的方法,子類的行為並不像父類那樣,這時,就需要重寫父類的方法,下面是重寫的程式碼實現:

程式碼體現

package com.my.pac12;

/**
 * @author Summerday
 * @date 2019/12/11 21:26
 */

public class Person {
  public void say(){
    System.out.println("say something..");
  }
  public static void see(){
    System.out.println("see something..");
  }
  public int returnNumber(int number){
    return number;
  }
  private void run(){
    System.out.println("running ..");
  }
  public Person returnPerson(){
    return this;
  }
}
class student extends Person{
  //方法名相同,形參列表相同
  public void say(){
    System.out.println("student say something..");
  }
  //返回型別為父類或父類的子類
  public Person returnPerson(){
    System.out.println("子類返回型別可以是父類返回型別或者是其子類型別");
    return this;
  }
  //並不是重寫,只是重新定義了新方法
  public void run(){
    System.out.println("student is running..");
  }
  //不是重寫,而是發生在父類與子類之間的過載
  public int returnNuber(int number,int otherNumber){
    return number+otherNumber;
  }
  public static void main(String[] args) {
    student s = new student();
    s.say();
    student.see();
    s.see();
    s.run();
    //涉及向上轉型
    Person sn = s.returnPerson();
    //呼叫的是父類的方法
    System.out.println(s.returnNumber(5));
    //呼叫子類過載父類的方法
    System.out.println(s.returnNuber(5,5));

  }
}

概念

子類包含與父類同名,同參數列表的現象就是方法重寫(Override),也叫方法覆蓋。

注意事項

"兩同兩小一大"

方法名相同,形參列表相同。

子類方法返回值型別小於等於父類方法返回值型別。

//父類
public int returnNumber(int number){
  return number;
}
/*基本型別:子類返回值型別小於等於父類返回值型別,下面的語句不允許*/
//子類
public long returnNumber(int number)
//父類
public void say(){
  System.out.println("say something..");
}
/*void型別只能由同樣void型別的方法重寫*/
//子類
public void say(){
  System.out.println("student say something..");
}
//父類
public Person returnPerson(){
  return this;
}
/*引用型別:子類返回值型別需要與父類相同或者是父類的子類*/
//子類
public Person returnPerson(){
  System.out.println("子類返回型別可以是父類返回型別或者是其子類型別");
  return this;
}

子類方法宣告丟擲的異常類小於等於父類丟擲的異常類。(這個部分之後再進行補充)

子類方法的訪問許可權大於等於父類方法的訪問許可權。

//父類
public void say(){
  System.out.println("say something..");
}
/*子類方法的訪問許可權大於等於父類方法的訪問許可權,下面的語句不允許*/
//子類
private(protected or 預設) void say()

其他注意點

兩者必須同為類方法或者同為例項方法。(實際上類方法無法被重寫,只是單純被隱藏起來,關於static關鍵字之後再總結)

//父類
public static void see(){
  System.out.println("see something..");
}
/*兩者必須同為類方法(static修飾)或者同為例項方法,下面的語句不允許*/
//子類
public void see()

父類被private修飾,子類無法重寫父類。

//父類
private void run(){
  System.out.println("running ..");
}
/*子類無法重寫方法,下面的語句是假象,其實是重新定義了一個新方法*/
//子類
public void run(){
  System.out.println("student is running..");
}

重寫與過載

過載主要(對!是主要)發生在同一個類的多個同名方法之間,且引數列表不同。
為什麼說是主要呢,因為過載有可能在子類與父類之間發生,如下:

//父類
public int returnNumber(int number){
  return number;
}
/*發生在父類與子類之間的過載*/
//子類
public int returnNuber(int number,int otherNumber){
  return number+otherNumber;
}

重寫是發生在父類與子類同名方法之間,且引數列表相同。

@Override註解

@Override註解對方法重寫起到輔助作用,並不會對程式碼本身產生影響。

標註該註解,向人表明下面的方法將要重寫父類的某些方法。

標註該註解,向機器表明下面部分將要重寫,讓機器幫忙檢查錯誤。如果不是重寫,那麼就會產生讓人不舒服的提示,如圖所示。

上圖也驗證了三種不是方法重寫的例子:

  • static修飾的父類方法。
  • private修飾的父類方法。
  • 子類過載而非重寫父類方法。

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支援我們。