1. 程式人生 > 其它 >05_面向物件程式設計(中)——1.面向物件特徵之二:繼承性(inheritance)

05_面向物件程式設計(中)——1.面向物件特徵之二:繼承性(inheritance)

目錄

1. 為什麼要有繼承?

    1) 多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中,那麼多個類無需再定義這些屬性和行為,只要繼承那個類即可。
    2) 此處的多個類稱為子類(派生類),單獨的這個類稱為父類(基類或超類)。可以理解為:“子類 is a 父類”
    3) 類繼承語法規則:
       class Subclass extends SuperClass{ }

2. 繼承的作用

    1) 減少了程式碼冗餘,提高了程式碼的複用性。
    2) 更有利於功能的擴充套件。
    3) 讓類與類之間產生了關係,提供了多型的前提。

3. 繼承性的注意事項

    1) 不要僅僅為了獲取其他類中【某個功能】而去繼承。
    2) 在Java 中,繼承的關鍵字用的是“extends”,即子類不是父類的子集,而是對父類的“擴充套件”。
    3) 子類繼承了父類,就繼承了父類的方法和屬性。
    4) 在子類中,可以使用父類中定義的方法和屬性,也可以建立新的資料和方法。   

4. 關於繼承的規則

    1) 子類不能直接訪問父類中私有的(private)的成員變數和方法。
    2) Java只支援單繼承和多層繼承,不允許多重繼承
        一個子類只能有一個父類
        一個父類可以派生出多個子類
        class SubDemo extends Demo{ } //ok
        class SubDemo extends Demo1,Demo2...//error

5. 單繼承與多層繼承舉例

【1. 建立一個 Individual 類】

package com.atzwx.java.inheritance;

public class {

    private int id;

    private String name;

    private int age;

    public Individual() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getName() {
        return name;
    }

    @Override
    public String toString() {
        return "Individual{" +
                "id=" + id +
                ", name='" + name + '\'' +
                ", age=" + age +
                '}';
    }

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

    public int getAge() {
        return age;
    }

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

    public void walk() {
        System.out.println("Individual.walk");
    }

    public void display() {
        System.out.println("Individual.display");
    }
}

【2. 建立一個 Employee 類,繼承 Individual 類】

package com.atzwx.java.inheritance;

public class Employee extends Individual {

    private int employeeId;

    private char gender;

    private String homeAddress;

    public Employee() {
    }

    public int getEmployeeId() {
        return employeeId;
    }

    public void setEmployeeId(int employeeId) {
        this.employeeId = employeeId;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public String getHomeAddress() {
        return homeAddress;
    }

    public void setHomeAddress(String homeAddress) {
        this.homeAddress = homeAddress;
    }

    @Override
    public String toString() {
        return "Employee{" +
                "employeeId=" + employeeId +
                ", gender=" + gender +
                ", homeAddress='" + homeAddress + '\'' +
                '}';
    }

    public void work() {
        System.out.println("Employee.work");
    }

    public void report() {
        System.out.println("Employee.report");
    }
}

【3. 建立一個 Farmer 類,繼承 Individual 類】

package com.atzwx.java.inheritance;

public class Farmer extends Individual{

    private int farmerId;

    private char gender;

    private String homeAddress;

    private int landCount;

    public Farmer() {
    }

    public int getFarmerId() {
        return farmerId;
    }

    public void setFarmerId(int farmerId) {
        this.farmerId = farmerId;
    }

    public char getGender() {
        return gender;
    }

    public void setGender(char gender) {
        this.gender = gender;
    }

    public String getHomeAddress() {
        return homeAddress;
    }

    public void setHomeAddress(String homeAddress) {
        this.homeAddress = homeAddress;
    }

    public int getLandCount() {
        return landCount;
    }

    public void setLandCount(int landCount) {
        this.landCount = landCount;
    }

    @Override
    public String toString() {
        return "Farmer{" +
                "farmerId=" + farmerId +
                ", gender=" + gender +
                ", homeAddress='" + homeAddress + '\'' +
                ", landCount=" + landCount +
                '}';
    }

    public void plough() {
        System.out.println("Farmer.plough");
    }

    public void harvest() {
        System.out.println("Farmer.harvest");
    }


}

【4. 呼叫 Employee 物件 和 Farmer 物件的方法】

package com.atzwx.test;

import com.atzwx.java.inheritance.Employee;
import com.atzwx.java.inheritance.Farmer;
import org.junit.Test;

// 單繼承與多繼承
public class InheritanceTest {

    /**
     * 單繼承
     */
    @Test
    public void inheritanceTest1() {

        Employee employee = new Employee();

        System.out.println("=============Employee==============");

        employee.walk();

        employee.display();

        System.out.println();

        employee.work();

        employee.report();

        System.out.println("=============Employee==============");

        Farmer farmer = new Farmer();

        System.out.println("=============Farmer==============");

        farmer.walk();

        farmer.display();

        System.out.println();

        farmer.plough();

        farmer.harvest();

        System.out.println("=============Farmer==============");

    }
}

【output】

=============Employee==============
Individual.walk
Individual.display

Employee.work
Employee.report
=============Employee==============
=============Farmer==============
Individual.walk
Individual.display

Farmer.plough
Farmer.harvest
=============Farmer==============

【5. 建立一個 Programer 類,繼承 Employee 類】

package com.atzwx.java.inheritance;

public class Programer extends Employee {

    private int programerId;

    private int teskCount;

    private String test;

    public void programming() {
        System.out.println("Programer.programming");
    }

    public void analyzing() {
        System.out.println("Programer.analyzing");
    }

    public void distributing() {
        System.out.println("Programer.distributing");
    }

}

【6. 呼叫 Programer 物件的方法】

package com.atzwx.test;

import com.atzwx.java.inheritance.Programer;
import org.junit.Test;

// 單繼承與多繼承
public class InheritanceTest {

    /**
     * 多層繼承
     */
    @Test
    public void inheritanceTest2() {

        Programer programer = new Programer();

        System.out.println("=============Programer==============");

        programer.walk();

        programer.display();

        System.out.println();

        programer.work();

        programer.report();

        System.out.println();

        programer.analyzing();

        programer.distributing();

        programer.programming();

        System.out.println("=============Programer==============");

    }
}

【output】

=============Programer==============
Individual.walk
Individual.display

Employee.work
Employee.report

Programer.analyzing
Programer.distributing
Programer.programming
=============Programer==============

6. 繼承性小結

    1) 不要僅僅為了獲取其他類中的某個功能就去進行繼承
    2) 子類不能直接訪問父類中的私有的(private)成員變數和方法
    3) 在Java中,只有單繼承和多層繼承;即 一個子類只能有一個父類,一個父類可以派生出多個子類。
       eg: 父類 class Dome, 子類 class Dome01, class Dome02, class Dome03
       單繼承: class Dome01 extends class Dome          結構:     父類 Dome
               class Dome02 extends class Dome                 |             |
                                                               |             |
                                                          子類 Dome01    子類 Dome02
       
       多層繼承: class Domeo3 extends Dome01         結構: 父類 Dome
                                                                |
                                                                |
                                                            子類 Dome01
                                                                |
                                                                |
                                                            子類 Dome03

    4) 在Java中,子類是父類的 “拓展”,子類可以看作是一個 特殊的父類(繼承性作為多型性的前提)