溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊(cè)×
其他方式登錄
點(diǎn)擊 登錄注冊(cè) 即表示同意《億速云用戶服務(wù)條款》

Java繼承是什么及使用方法

發(fā)布時(shí)間:2020-07-10 14:46:08 來源:億速云 閱讀:197 作者:Leah 欄目:編程語言

這篇文章將為大家詳細(xì)講解有關(guān)Java繼承是什么及使用方法,文章內(nèi)容質(zhì)量較高,因此小編分享給大家做個(gè)參考,希望大家閱讀完這篇文章后對(duì)相關(guān)知識(shí)有一定的了解。

繼承

為什么要使用繼承

首先我們先看一下這兩個(gè)類:

public class Teacher {
    private int teachingAge;
    private String name;
    private int age;
    
    public void teach() {
        
    }
    public void seyHi() {
        System.out.println("我是:"+this.name);
    }
}
public class Student {
    private int studentNo;
    private String name;
    private int age;
    
    public void learn() {
        
    }
    public void seyHi() {
        System.out.println("我是:"+this.name);
    }
}

Student 類和 Teacher 類中有一些相同的屬性和方法,這些都屬于重復(fù)代碼,當(dāng)一個(gè)程序中有大量的類時(shí),就會(huì)產(chǎn)生大量的重復(fù)代碼。這些重復(fù)的代碼能不能抽取出來然后供其他類使用以簡化呢,那就是使用繼承。

使用繼承優(yōu)化之后:

創(chuàng)建 inherit 包

父類:(公共代碼類)

package inherit;

public class People {
    private String name;
    private int age;
    
    public void sayHi() {
        System.out.println("我是:"+this.name);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
}

子類:Student.java

package inherit;

public class Student extends People{
    private int studentNo;
    public void learn() {
        System.out.println("學(xué)習(xí)課程");
    }
    public int getStudentNo() {
        return studentNo;
    }
    public void setStudentNo(int studentNo) {
        this.studentNo = studentNo;
    }
}

子類:Teacher.java

package inherit;

public class Teacher extends People{
    private int teachingAge;
    
    public void teach() {
        System.out.println("教授課程");
    }
    
    public int getTeachingAge() {
        return teachingAge;
    }

    public void setTeachingAge(int teachingAge) {
        this.teachingAge = teachingAge;
    }
    
}

測試類:

package inherit;

public class TestInherit {
    public static void main(String[] args) {
        //創(chuàng)建Student對(duì)象
        Student stu=new Student();
        stu.setName("張三");//父類中繼承過來的方法
        stu.learn();//子類中特有的方法
        stu.sayHi();
        //創(chuàng)建Teacher對(duì)象
        Teacher teacher=new Teacher();
        teacher.setName("湯尼");
        teacher.setTeachingAge(2);//子類中特有的方法
        teacher.sayHi();
    }
}

觀察上面示例代碼我們發(fā)現(xiàn):

1.子類的公共代碼都可以放在父類中

2.子類可以有自己獨(dú)有的方法和屬性

3.子類一旦繼承父類就會(huì)擁有父類的屬性和方法

4.將公共代碼放入父類,更方便統(tǒng)一修改代碼

繼承的語法

關(guān)鍵字:extends

1.編寫父類

public class 父類{
    //公共的屬性和方法
}

2.編寫子類,繼承父類

public class 子類 extends 父類{
    //子類特有的屬性和方法
}

子類只能繼承一個(gè)父類

子類訪問父類成員

子類要想訪問父類的成員要使用 super 關(guān)鍵字,super 代表父類對(duì)象

訪問父類構(gòu)造方法:

super();//訪問無參構(gòu)造
super(參數(shù));//訪問有參構(gòu)造

訪問父類屬性:

super.name;

訪問父類方法:

super.print();

訪問父類構(gòu)造,必須在子類構(gòu)造方法中調(diào)用,必須是第一句

super 只能出現(xiàn)在子類的方法和構(gòu)造方法中

super 不能訪問父類的 private 成員

敲一敲:訪問父類成員

創(chuàng)建包 visitparent 后在報(bào)下創(chuàng)建如下類
父類

package visitparent;

public class Animal {
    private String name;
    private int legs;
    
    public Animal() {
        this.name="無名";
        this.legs=4;
    }
    public Animal(String name,int legs) {
        this.name=name;
        this.legs=legs;
    }
    
    public void eat(String food) {
        System.out.println(name+" 吃食物:"+food);
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getLegs() {
        return legs;
    }

    public void setLegs(int legs) {
        this.legs = legs;
    }
    
}

子類

package visitparent;

public class Cat extends Animal{
    private String hairColor;//毛發(fā)顏色
    private int age;
    
    public Cat () {
        super();//調(diào)用父類無參
    }
    public Cat(String name,int legs,String hairColor,int age) {
        super(name, legs);//這里調(diào)用相當(dāng)于重用父類構(gòu)造方法了
        this.hairColor=hairColor;
        this.age=age;
        //super(name, legs);//去掉注釋試試
        //this.name="無名";//去掉注釋試試
    }
    public void catchMouse() {
        System.out.println(super.getName()+":抓老鼠");
    }
    
    public void paly() {
        System.out.println(super.getName()+" 玩累了。");
        super.eat("小魚干");
    }

    public String getHairColor() {
        return hairColor;
    }

    public void setHairColor(String hairColor) {
        this.hairColor = hairColor;
    }

    public int getAge() {
        return age;
    }

    public void setAge(int age) {
        this.age = age;
    }
    
}

子類不能繼承父類的 private 成員

子類不能繼承不同包使用默認(rèn)訪問權(quán)限的成員(默認(rèn)訪問權(quán)限就是不寫訪問修飾符)

子類不能繼承父類的構(gòu)造方法

多重繼承的執(zhí)行流程

在創(chuàng)建子類的時(shí)候父類在做什么?

下面創(chuàng)建3個(gè)類觀察執(zhí)行流程,C類繼承B類,B類繼承A類。

A.java

public class A {
    public A() {
        System.out.println("A類的無參構(gòu)造函數(shù)執(zhí)行");
    }
}

B.java

public class B extends A{
    public B() {
        System.out.println("B類的無參構(gòu)造函數(shù)執(zhí)行");
    }
}

C.java

public class C extends B{
    public C() {
        System.out.println("C類的無參構(gòu)造函數(shù)執(zhí)行");
    }
}

TestRunFlow.java 測試類,展示運(yùn)行結(jié)果

public class TestRunFlow {
    public static void main(String[] args) {
        C c=new C();
    }
}

運(yùn)行結(jié)果為:

A類的無參構(gòu)造函數(shù)執(zhí)行
B類的無參構(gòu)造函數(shù)執(zhí)行
C類的無參構(gòu)造函數(shù)執(zhí)行

如果子類構(gòu)造方法通過 super 顯式調(diào)用父類相應(yīng)構(gòu)造方法,則不執(zhí)行父類無參構(gòu)造方法

子類構(gòu)造方法默認(rèn)會(huì)調(diào)用父類無參構(gòu)造方法

調(diào)用父類無參構(gòu)造方法,一直到執(zhí)行頂級(jí)父類Object類的的無參構(gòu)造方法為止

根據(jù)以上規(guī)則,判斷下面的代碼是否能編譯通過

父類

public class Pet {
    private String name;
    public Pet(String name) {
        this.name=name;
    }
}

子類

public class Dog extends Pet{
}

答案是不能,父類中只有有參構(gòu)造方法沒有無參構(gòu)造方法,子類中沒有任何代碼默認(rèn)有一個(gè)隱式無參構(gòu)造方法,子類無參構(gòu)造方法默認(rèn)調(diào)用父類無參構(gòu)造方法,然而父類中沒有,所有在子類中報(bào)錯(cuò)。

解決辦法:1.在父類中顯式添加無參構(gòu)造方法,2.在子類構(gòu)造方法中顯式調(diào)用父類有參構(gòu)造方法。

java 中的訪問修飾符

訪問修飾符 protected 能修飾屬性和方法,修飾后本類、子類、同包可以訪問。

訪問修飾符本類同包子類其他
private


默認(rèn)(friendly)

protected
public

方法重寫

在"繼承優(yōu)化后"的代碼中,Teacher 繼承了 People 類,(忘記代碼可以翻回去再看一遍) People 類中有個(gè)一個(gè)打招呼的方法 sayHi() 用于輸出人的名字,但是 Teacher 調(diào)用這個(gè)方法并不能打印出 Teacher 的屬性 teachingAge 的值,但是我們還想用這個(gè)方法實(shí)現(xiàn)這個(gè)功能,應(yīng)該怎么辦呢?

我們可以使用 方法重寫 解決這個(gè)問題,修改子類 Teacher 中的代碼,下面看一下使用方法重寫后的效果。

Teacher.java

package inherit;

public class Teacher extends People{
    //省略其他屬性
    
    @Override
    public void sayHi() {
        System.out.println("我是:"+super.getName()+" ,從事教育行業(yè) "+this.teachingAge+" 年了。");
    }

    //省略其他方法、getter、setter
}

在 Eclipse 中重寫某方法的快捷鍵是 Alt+Shift+S+V ,按完后選擇要重寫的方法

在 Idea 中重寫某方法的快捷鍵是 Ctrl+O ,按完后選擇要重寫的方法

@Override 注解的作用, 用來檢測是否符合重寫規(guī)則,不符合重寫規(guī)則將報(bào)錯(cuò),這個(gè)注解可以不寫

構(gòu)造方法不能重寫,因?yàn)闃?gòu)造方法不能被繼承

方法重寫的規(guī)則:

1.方法名相同

2.參數(shù)列表相同

3.返回值類型相同或者是其子類

4.訪問權(quán)限不能嚴(yán)于父類

final 關(guān)鍵字的使用

1.final 修飾變量后變?yōu)槌A?/p>

private static final long serialVersionUID = -6849794470754667710L;

2.final 修飾類后,該類不能被繼承

package java.lang;
public final class Math {
    //省略屬性和方法……
}

3.final 修飾方法后,該方法不能被重寫

public final void teach() {
        System.out.println("教授課程");
    }

4.final 修飾創(chuàng)建的對(duì)象后,該對(duì)像不能再次實(shí)例化(可以修改屬性)

final Teacher teacher=new Teacher();
teacher.setName("湯尼");
//teacher=new Teacher();//去掉注釋試試

String 類就是一個(gè)典型的被 final 修飾的類

關(guān)于Java繼承是什么及使用方法就分享到這里了,希望以上內(nèi)容可以對(duì)大家有一定的幫助,可以學(xué)到更多知識(shí)。如果覺得文章不錯(cuò),可以把它分享出去讓更多的人看到。

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請(qǐng)聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI