面向物件程式設計的三大特性(繼承)
阿新 • • 發佈:2018-12-15
文章目錄
基本含義
建立
繼承語法:
[訪問控制修飾符] [非訪問控制修飾符] class 子類名 extends 父類名{ 類體 }
專案 | 含義 |
---|---|
含義 | 繼承父類的屬性和方法。 |
目的 | 複用程式碼。便於維護。 |
父類別名 | 基類或者超類。 |
特性 | 單繼承(即子類只有一個父類,父類可以有多個子類) |
Object類 | Java中,是所有的類的父類。 |
呼叫父類方法——未被重寫後
語法:super.父類被重寫方法名();
子類重寫父類:
專案 | 含義 |
---|---|
目的 | 繼承父類時,展現特性。 |
別名 | 覆蓋(override) |
重寫父類 | 一大兩小兩同 |
訪問控制修飾符 | 不小於父類 |
非訪問控制修飾符 | 不限 |
返回值型別 | 不大於父類 |
丟擲的異常類 | 不大於父類 |
方法名 | 與父類相同 |
引數列表 | 與父類相同 |
呼叫父類方法——構造器
語法:
[ 訪問控制修飾符 ] [ 非訪問控制修飾符 ] 類名{ super(引數列表);…}
注意:
- 同一構造器中,super(引數)必須放置有效執行方法體首行。
- 同一構造器中,super(引數)只能出現一次。
- 同一構造器中,super(引數)必須出現一次。
- 同一構造器中,super只能出現在子類的方法體中。
- 同一構造器中,只能引用一個構造器。
- 同一構造器中,this(引數)和super(引數)只能出現一個。
特別提醒:
若父類顯式宣告只有有參構造器,而子類未呼叫顯式有參構造器,則會出錯。
具體操作
主函式入口原始檔:
public class MainEntrance{
public static void main(String[] args){
Rabbit rb = new Rabbit("小白兔", 1, 3, "雄");
// 封裝屬性呼叫:
System.out.println(rb.getName()); // 外部類呼叫,子類的父類的封裝屬性。
// rb.setLegNumber();
System.out.println(rb.getAge()); //
rb.eat();
}
}
動物類原始檔:
public class Animal{
// 封裝屬性:動物共性,名字和年齡。
private String name;
private int age;
/* 構造器:無參。
* 被呼叫:子類構造器必須呼叫父類構造器。
* 此處目的:防止子類沒有呼叫父類有參建構函式時,報錯情況發生。
*
*/
public Animal(){
}
public Animal(int age){
// 封裝屬性呼叫:本類中,this.私有變數名。
this.age = age;
}
public Animal(String name, int age, String sex){
// 封裝屬性呼叫:本類中,this.私有變數名。
this.name = name;
this.age = age;
this.sex = sex;
}
// 物件方法:
public void eat(){
System.out.println(this.name + "也需要吃東西" );
}
public void sleep(){
System.out.println(this.name + "已經" + this.age + "歲了!");
}
public void life(){
System.out.println("每個動物都有宣告!");
}
// set和get方法:通過建立此兩種方法,讓外部類訪問被封裝的屬性。
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;
}
}
兔子類原始檔:
public class Rabbit extends Animal{
private int legNumber;
/*
* 構造器
* 同一構造器中,只能引用一個構造器。
* 同一構造器中,this(引數)和super只能出現一個。
* 同一構造器中,super(引數)必須出現一次。
* 同一構造器中,super(引數)只能出現一次。
* 同一構造器中,super(引數)必須放置有效執行方法體首行。
* 同一構造器中,super只能出現在子類的方法體中。
* 若父類顯式宣告只有有參構造器,而子類未呼叫顯式有參構造器,則會出錯。
*/
public Rabbit(String name, int age, int legNumber, String sex){
super(name,age,sex);
judgeLegNumber(legNumber);
// this(legNumber); // 同一構造器中,this(引數)和super只能出現一個。
}
// 過載構造器:其它相同,只是引數列表和方法體不同。
public Rabbit(int legNumber){
super(legNumber);
}
// 重寫父類方法:兩大一小兩同原則。
public void eat(){
super.eat(); // 呼叫父類的物件方法。
System.out.println(super.getName() + "是食草動物!"); // 呼叫父類封裝的屬性。
System.out.println(this.sex + "兔跑得快嗎?"); // 呼叫父類未封裝的屬性。也可省略this。
}
// 物件方法:
public void judgeLegNumber(int legNumber){
if(legNumber != 4){
System.out.println("這不是一個正常的兔子!");
}else{
this.legNumber = legNumber;
}
}
// get方法和set方法:幫助外類獲取封裝的屬性。
public int getLegNumber() {
return legNumber;
}
public void setLegNumber(int legNumber) {
this.legNumber = legNumber;
}
}