05_面向物件程式設計(中)——1.面向物件特徵之二:繼承性(inheritance)
阿新 • • 發佈:2022-03-22
目錄
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中,子類是父類的 “拓展”,子類可以看作是一個 特殊的父類(繼承性作為多型性的前提)