首頁 >Java >java教程 >Java繼承是什麼? Java繼承如何使用?

Java繼承是什麼? Java繼承如何使用?

青灯夜游
青灯夜游轉載
2018-10-20 18:01:003973瀏覽

這篇文章帶給大家的內容是介紹Java繼承是什麼? Java繼承如何使用? ,教導新手學會使用繼承,並理解繼承的概念。掌握存取修飾符、掌握 final 關鍵字的用法。有一定的參考價值,有需要的朋友可以參考一下,希望對你們有幫助。

繼承

為什麼要使用繼承

首先我們先看一下這兩個類別:

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 類別中有一些相同的屬性和方法,這些都屬於重複程式碼,當一個程式中有大量的類別時,就會產生大量的重複程式碼。這些重複的程式碼能不能抽取然後供其他類別使用以簡化呢,那就是使用繼承

使用繼承最佳化之後:

建立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("学习课程");
    }
    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) {
        //创建Student对象
        Student stu=new Student();
        stu.setName("张三");//父类中继承过来的方法
        stu.learn();//子类中特有的方法
        stu.sayHi();
        //创建Teacher对象
        Teacher teacher=new Teacher();
        teacher.setName("汤尼");
        teacher.setTeachingAge(2);//子类中特有的方法
        teacher.sayHi();
    }
}

觀察上面範例程式碼我們發現:

1.子類別的公共程式碼都可以放在父類別中

2.子類別可以有自己獨有的方法和屬性

3.子類別一旦繼承父類別就會擁有父類別的屬性和方法

#4.將公用程式碼放入父類,更方便統一修改程式碼

繼承的語法

#關鍵字:extends

1.寫父類

public class 父类{
    //公共的属性和方法
}

2.寫子類,繼承父類

public class 子类 extends 父类{
    //子类特有的属性和方法
}

子類只能繼承一個父類

子類存取父類別成員

子類別要想存取父類別的成員要使用super 關鍵字,super 代表父類別物件

存取父類別建構方法:

super();//访问无参构造
super(参数);//访问有参构造

存取父類別屬性:

super.name;

存取父類別方法:

super.print();

存取父類別構造,必須在子類別建構方法中調用,必須是第一句

super 只能出現在子類別的方法和建構方法中

super 不能存取父類別的private 成員

敲一敲:訪問父類別成員

建立套件visitparent 後在封包下建立如下類別
父類別

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;//毛发颜色
    private int age;
    
    public Cat () {
        super();//调用父类无参
    }
    public Cat(String name,int legs,String hairColor,int age) {
        super(name, legs);//这里调用相当于重用父类构造方法了
        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 成員

#子類別不能繼承不同套件使用預設存取權限的成員(預設存取權限就是不寫存取修飾符)

子類別不能繼承父類別的建構方法

#多重繼承的執行流程

在建立子類別的時候父類在做什麼?

下面建立3個類別觀察執行流程,C類繼承B類,B類繼承A類。

A.java

public class A {
    public A() {
        System.out.println("A类的无参构造函数执行");
    }
}

B.java

public class B extends A{
    public B() {
        System.out.println("B类的无参构造函数执行");
    }
}

C.java

public class C extends B{
    public C() {
        System.out.println("C类的无参构造函数执行");
    }
}

TestRunFlow.java 測試類,顯示執行結果

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

運行結果為:

A類別的無參考建構函式執行
B類別的無參考建構子執行
C類別的無參考建構子執行

#如果子類別建構方法透過super 明確呼叫父類別對應建構方法,則不執行父類別無參構方法

子類別建構方法預設會呼叫父類別無參照構造方法

呼叫父類無參構造方法,一直到執行頂級父類Object類的的無參構造方法為止

根據上述規則,判斷下面的程式碼是否能編譯透過

父類別

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

子類別

public class Dog extends Pet{
}

答案是不能,父類別中只有有參構造方法沒有無參構造方法,子類別中沒有任何程式碼預設有一個隱式無參構造方法,子類別無參構造方法預設呼叫父類無參構造方法,然而父類中沒有,所有在子類中報錯。

解決方法:1.在父類別中明確新增無參構造方法,2.在子類別建構方法中明確呼叫父類別有參構造方法。

java 中的存取修飾符

存取修飾符 protected 能修飾屬性與方法,修飾後本類別、子類別、同套件可以存取。

##√√√#√public√√√#√
存取修飾符 本類別 #相同套件 子類別 #其他
private


預設(friendly) #√

protected
#########√###########

方法重写

在"继承优化后"的代码中,Teacher 继承了 People 类,(忘记代码可以翻回去再看一遍) People 类中有个一个打招呼的方法 sayHi() 用于输出人的名字,但是 Teacher 调用这个方法并不能打印出 Teacher 的属性 teachingAge 的值,但是我们还想用这个方法实现这个功能,应该怎么办呢?

我们可以使用 方法重写 解决这个问题,修改子类 Teacher 中的代码,下面看一下使用方法重写后的效果。

Teacher.java

package inherit;

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

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

在 Eclipse 中重写某方法的快捷键是 Alt+Shift+S+V ,按完后选择要重写的方法

在 Idea 中重写某方法的快捷键是 Ctrl+O ,按完后选择要重写的方法

@Override 注解的作用, 用来检测是否符合重写规则,不符合重写规则将报错,这个注解可以不写

构造方法不能重写,因为构造方法不能被继承

方法重写的规则:

1.方法名相同

2.参数列表相同

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

4.访问权限不能严于父类

final 关键字的使用

1.final 修饰变量后变为常量

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 修饰创建的对象后,该对像不能再次实例化(可以修改属性)

final Teacher teacher=new Teacher();
teacher.setName("汤尼");
//teacher=new Teacher();//去掉注释试试

String 类就是一个典型的被 final 修饰的类

以上是Java繼承是什麼? Java繼承如何使用?的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文轉載於:cnblogs.com。如有侵權,請聯絡admin@php.cn刪除