Java面向?qū)ο?繼承

一、繼承的實(shí)現(xiàn)

  • 繼承的基本概念: 擴(kuò)展父類的功能
  • Java中使用extends關(guān)鍵字完成繼承:class 子類 extends 父類 { }
代碼
class PersonB{
    private int age;
    private String name;
    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    
//  public void tell() {
//      System.out.println("姓名:"+getName()+"  年齡:"+getAge());
//  }
    
}
class StudentB extends PersonB{
//  private int age;
//  private String name;
    private int score;
//  public int getAge() {
//      return age;
//  }
//  public void setAge(int age) {
//      this.age = age;
//  }
//  public String getName() {
//      return name;
//  }
//  public void setName(String name) {
//      this.name = name;
//  }
    public int getScore() {
        return score;
    }
    public void setScore(int score) {
        this.score = score;
    }
    
    public void say() {
//      System.out.println("成績:"+getScore());
        System.out.println("姓名:"+getName()+"  年齡:"+getAge()+"   成績:"+getScore());
    }
}
public class Demo15 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        
        StudentB sB = new StudentB();
        sB.setAge(20);
        sB.setName("張小");
        sB.setScore(100);
//      sB.tell();
        sB.say();
    }
}
結(jié)果:
姓名:張小  年齡:20   成績:100

二、繼承的限制

  • 在Java中只允許單繼承。
  • 子類不能直接訪問父類的私有成員。
代碼
class PeopleB{
    private int age;

    public int getAge() {
        return age;
    }
    public void setAge(int age) {
        this.age = age;
    }
}
class Worker extends PeopleB{
    public void tell() {
        System.out.println(getAge());
    }
}
//class PetWorker extends Worker{
//  public void tell() {
//      System.out.println(age);
//  }
//}
public class Demo16 {
    public static void main(String[] args) {
        Worker w = new Worker();
        w.setAge(100);
        w.tell();
    }
}
結(jié)果:
100

三、子類對(duì)象實(shí)例化過程

在子類對(duì)象實(shí)例化之前,必須先調(diào)用父類中的構(gòu)造方法,之后調(diào)用子類構(gòu)造方法。

過程.jpg
代碼
class Father{
    public Father(){
        System.out.println("父類的構(gòu)造方法");
    }
}
class Son extends Father{
    public Son(){
        System.out.println("子類的構(gòu)造方法");
    }
}
public class Demo17 {
    public static void main(String[] args) {
        Son s = new Son();
    }
}
結(jié)果:
父類的構(gòu)造方法
子類的構(gòu)造方法

四、方法重寫與super關(guān)鍵字

  • 在繼承中,也存在著重寫的概念,其實(shí)就是子類定義了和父類同名的方法。
  • 定義:方法名稱相同,返回值類型相同,參數(shù)也相同。
  • 重寫限制:被子類重寫的方法不能擁有比父類方法更加嚴(yán)格的訪問權(quán)限。
  • 訪問權(quán)限:private < default < public
  • super關(guān)鍵字:強(qiáng)行調(diào)用父類的方法的執(zhí)行。
  • super不一定在重寫中使用,也可以表示那些方法是從父類中繼承而來的。
代碼
class A{
    public void tell() {//可以在整個(gè)工程下都可以訪問
        System.out.println("我是tell方法");
    }
    private void say1(){ //私有的,只有在當(dāng)前類中訪問
        
    }
    void print(){ //default 可以在同一包下進(jìn)行訪問
        
    }
}
class B extends A{
    public void tell() {
        super.tell();
        System.out.println("我重寫了tell方法");
    }
}
public class Demo18 {
    public static void main(String[] args) {
        // TODO Auto-generated method stub
        B b = new B();
        b.tell();
    }
}
結(jié)果:
我是tell方法
我重寫了tell方法

五、重寫與重載的區(qū)別

區(qū)別點(diǎn) 重載 重寫
單詞 Overloading Overriding
定義 方法名相同,參數(shù)的類型或個(gè)數(shù)不同 方法名、參數(shù)的類型、返回值類型全部相同
權(quán)限 對(duì)權(quán)限沒有要求 被重寫的方法不能擁有比父類更加嚴(yán)格的權(quán)限
范圍 發(fā)生在一個(gè)類中 發(fā)生在繼承中
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時(shí)請(qǐng)結(jié)合常識(shí)與多方信息審慎甄別。
平臺(tái)聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺(tái),僅提供信息存儲(chǔ)服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容