Java學習總結 【繼承】
繼承
特性
封裝
繼承
多型
是面向物件程式語言的三大特性,三個特性的目的都是為了讓類的呼叫者減少對類的實現者使用成本,因而可以說它們是非常的重要。
繼承
1.繼承背景
程式碼中可以用類抽象現實中的事物,比如動物(包含①動物的自身
屬性
比如:毛髮顏色、品種、狗腿的數量等②動物的行為(在這裡稱作方法
),比如:會跳、會吃、會咬人等等。有時動物A與動物B之間存在共性也可以說是一些關聯,也就是說他們有相同的屬性和行為,那麼表示成類和物件時候,動物A、動物B與動物大類之間存在一定關聯,我們可以在此基礎上衍生出繼承特性。
2.繼承示例
class Animal{
public String name;
private int age; //private封裝後,age只能在類內訪問
public Animal(){
}
public Animal(String name){
this.name = name;
}
public void eat(){
System.out.println(this.name+"->eat"); //this表示當前物件的引用
}
}
class Cat {
public String name;
public int age;
public Cat(String name){
this.name = name;
}
public void eat(){
System.out.println("Cat->eat");
}
}
class Bird {
public String name;
public int age;
public Bird(String name){
this.name = name;
}
public void eat(){
System.out.println("Bird->eat");
}
public void fly(){
System.out.println(this.name+"正在起飛。。。");
}
}
我們發現程式碼出現大量的冗餘內容,Animal Cat Bird三個類之間存在一定關聯,都有相同eat方法,都有name和age屬性,這種情況下,可以說Cat和Bird繼承了Animal類,如此一來到達程式碼重用效果。
Animal:被繼承的類,稱為父類、基類、超類
Cat與Bird:子類、派生類
上面的程式碼用繼承改進後,我們發現共同的屬性和方法不必再寫,程式碼看起來不再繁瑣。
class Animal{
public String name;
private int age;
public Animal(){
}
public Animal(String name){
this.name = name;
}
public void eat(){
System.out.println(this.name+"->eat");
}
}
class Cat {
public Cat(String name){
super(name);
}
}
class Bird {
public Bird(String name){
super(name);
}
public void fly(){
System.out.println(this.name+"正在起飛。。。");
}
}
3.繼承語法
①class 子類 extends 父類{ }
②java中一個子類只能繼承一個父類,不支援多繼承
③子類會繼承父類所有方法和欄位,對於父類中private方法而言,子類繼承但無法訪問
④子類的例項中,也包含著父類的例項,用super
關鍵字可以得到父類例項的引用
⑤extends本意為擴充套件,繼承可以理解為基於一個類再擴充套件別的類
4.protected關鍵字
出於封裝思想,protected關鍵字擯棄了private缺點(子類無法訪問父類)和public缺點(任何情況均能訪問)
特點:protected修飾的成員變數和方法,類的呼叫者無法訪問
繼承關係上,子類可以訪問protected修飾的成員變數和方法;同一個包的不同類可以訪問protected。
5.欄位和方法訪問的4種許可權
範圍 | private | default | protected | public |
---|---|---|---|---|
同一個包中同一個類 | √ | √ | √ | √ |
同一個包中不同類 | √ | √ | √ | |
不同包中的子類 | √ | √ | ||
不同包中的非子類 | √ |
default被稱為包訪問許可權
6.final關鍵字
我們知道final修飾變數時,表示這個變數值不能發生改變;同樣final修飾方法時,表示方法成為密封方法不能被重寫;final修飾類時,類被限制成為密封類,不能被繼承。
7.super用法
子類繼承父類的方法和欄位,但是對於類本身構造方法而言,子類構造時候,先要幫助父類進行構造。如何幫助構造呢?
子類構造方法內部,先通過super()顯示父類的構造方法,再構造子類本身,所以能看出父類的構造方法是顯示在子類中的,而不是被子類所繼承。
super代表父類物件的引用,這裡需要注意的是,super無法在static方法中使用;此外與this有區別,this代表當前物件的引用。