- 繼承是面向對象三大特性之一,所謂繼承,可以簡單理解爲子類繼承父類,子類擁有父類的屬性和方法,子類可以對父類的屬性和方法進行修改,子類也可以增加方法和屬性;
- 通過繼承,我們可以簡化類的設計,從而直接擁有某個類的方法和屬性
- 通過繼承,我們可以將一些類中具有相同屬性和行爲特徵(方法)抽取出來,抽象成一個父類,讓這個父類擁有這些屬性和方法,從而在定義其他子類時,通過繼承父類的方法來簡化設計,達到繼承這個特性;
- 比如,現實生活中的很多例子,我們在動物園中肯定會見到各種各樣的動物,這些動物都有一些特徵(可以理解爲java中的屬性)和行爲(可以理解爲java中的方法),比如,動物都有年齡,名字等屬性,有喫、喝、睡覺等行爲特徵,我們把這些屬性和方法定義爲一個animals類,然後讓各種動物(貓,狗)繼承animals這個類,從而簡化了類的設計,在寫代碼的同時可以簡化;
//動物類
public class Animals {
String name;
int age;
String sex;
public Animals() {
}
//父類中的方法
public void eat(){
System.out.println(this.name+"正在喫飯");
}
public void drink(){
System.out.println(this.name+"正在喝水");
}
public void sleep(){
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;
}
public String getSex() {
return sex;
}
public void setSex(String sex) {
this.sex = sex;
}
public Animals(String name, int age, String sex) {
this.name = name;
this.age = age;
this.sex = sex;
}
public Animals(String name) {
this.name = name;
}
}
public class Cat extends Animals {
public Cat(String name, int age, String sex) {
super(name, age, sex);
}
public Cat(String name) {
super(name);
}
//重寫方法
@Override
public void eat() {
super.eat();
}
@Override
public void drink() {
super.drink();
}
@Override
public void sleep() {
super.sleep();
}
}
public class Test {
public static void main(String[] args) {
Cat cat = new Cat("波斯貓");
cat.eat();
System.out.println("喫飽了,喝點水");
cat.drink();
System.out.println("喫飽喝足之後,躺會");
cat.sleep();
}
}
運行結果爲:
-
以上實例我個人覺得可以很好的理解繼承這個特性吧
-
關於java中繼承的特點
- java中是單繼承,所謂單繼承,就是子類只能繼承一個父類,不能繼承多個父類
- java中支持多層繼承關係,一個類可以是多個類的父親,也可以是一個類的子類
-
使用繼承時,子類應該是更加詳細具體的父類,我們可以使用is關鍵字來判斷是否可以使用繼承
-
重寫方法
在繼承關係下,子類覆蓋父類的方法;- 方法名相同,
- 參數相同
- 返回值類型兼容,父類的類型一定要能包容子類的類型
-
關於繼承
- 父類有的,子類一定有;
- 父類沒有的,子類可以增加;
- 父類有的,子類可以修改重寫
-
super關鍵字
super關鍵字代表父類的對象引用,在子類中,通過super可以訪問父類對象的屬性和方法;
在上面創建Cat這個類的時候,我使用了一個只有name參數的構造方法,而父類animals中我沒有寫只有name的構造方法,所以報錯了,我才發現繼承中構造方法有幾個需要特別注意的地方 -
關於繼承中構造方法的說明
- 在繼承關係中,構造方法是不能被繼承的;
- 在子類調用構造方法時,首先會調用父類的構造方法;
- 如果在子類中調用構造方法時沒有指定父類的構造方法,會默認使用父類的無參構造方法
- 可以使用supper(參數)來指定調用父類的構造方法,super()語句必須放在第一行來執行
-
方法重載與方法重寫的區別
- 方法重載是在一個類中,方法名相同,方法參數不同的一些方法;
- 方法重寫是在繼承關係下,,子類覆蓋父類的方法,要求名字相同,參數相同,返回值類型小於父類的返回值類型,可以兼容返回值類型;