Java面向對象(三)繼承

一:繼承的基本概念
1)從現實中理解:類似於父親和兒子的關係,兒子要繼承父親的某些特徵,同時也會有自己的新特徵。
2)從計算機角度理解:可以基於已經存在的類構造一個新類。即構造一個子類繼承他的父類的某些共同特徵和方法。
父類:也叫派生類;子類:也叫超類,基類【先有父類,纔有子類】
3)語法:用關鍵字extends,基於繼承語法。
格式:

		public class subClass extends superClass{
					//代碼邏輯
        }

二:繼承中的構造器
子類可以繼承父類的成員變量,通過調用父類的構造器來實現
(1)語法:(關鍵字)super(有參傳參);
(2)作用:可以更方便個從父類繼承的成員變量賦值
例如:
在這裏插入圖片描述
在這裏插入圖片描述
上述實例中Fish是一個子類,它通過extends關鍵字繼承父類Animal。
並調用了父類的構造器給成員變量初始化。
PS:
1)子類中的構造器一定會有一個調用了父類的構造器
2)父類中如果沒有無參構造器(存在有參構造器),子類需要顯式調用父類構造器。(用super關鍵字)
3)父類中如果有無參構造器(系統默認),子類中的構造器可能隱式調用了父類的無參構造器。(隱藏了super)
4)super與this的比較:
(1)相同點:都是調用構造器,並且都放在首行首句
(2)不同點:this關鍵字調用的是本類的構造器。
super關鍵字調用的是父類的構造器。

三:繼承的特點
1)單繼承:即一個子類只能有一個父類。可理解一個兒子只能有一位父親。
2)傳遞性:即一個子類1繼承了他的父類,而這個子類1的子類2也可繼承子類1的父類。可理解兒子繼承父親,也繼承了爺爺的某些特徵。
四:方法的重寫
1)定義:子類在繼承父類,可在子類中重寫父類的某些方法,即與父類方法名一樣,參數列表相同,但是方法體不同。
PS:
1)返回值類型可以相同,也可以不同,如果不同,子類方法的返回值類型必須是父類方法返回值的子類。
2)父類型的變量可以引用子類型的對象
如上述實例中:
Animal f1=new Fish();
Animal類型的變量f1引用了子類型Fish的對象.
在這裏插入圖片描述
在這裏插入圖片描述
3)方法的重寫與重載比較:
(1)方法的重載:在同一個類中;返回值相同;方法名相同;參數列表不同
(2)方法的重寫:在父子類中;返回值可以不同;方法名相同;參數列表相同;方法體不同。
四:訪問權限修飾詞

 1)四種修飾詞public 、 protected 、 default 、 private

(1)修飾類時:
外部類:可以使用public和默認的
內部類:可以使用public protected 默認的(default) private
(2)修飾成員變量:四個都可以進行修飾,但是可見性不同
(3)修飾方法:與修飾成員變量的可見性一致
PS:
1)在實際開發中,成員變量要儘可能的設置成不可見,爲了提高代碼的安全性,即用private修飾。
2)defalut爲默認意思,修飾方法時,不寫defalut,會報錯。
3)在繼承中,子類不能重寫父類的私有方法。

  		      本類中      同包下     不同的包子類中      其他
public		  true	      true          true          true

protected	  true        true          true          true

default		  true        true

private	      true


2)final關鍵字:最終的,最後的    

(1)修飾類:用final修飾的類,不能再有子類。
(2)修飾方法:用final修飾的方法,不能在子類中重寫。
(3)修飾成員變量:用final修飾的成員變量,意爲最後的變量,可以直接初始化,也可以在構造器中初始化,凡是不可以在其他地方再次賦值。

 3)static關鍵字

(1)修飾成員變量:
用static修飾的成員變量是靜態的,不屬於對象的特徵,是屬於類的,得用類名去調用。
(2)修飾方法:
用static修飾的成員方法是靜態的,不屬於對象的行爲,是屬於類的,得用類名去調用。
PS:static方法內因爲無法使用this關鍵字,因此不能直接訪問非靜態成員。
(3)修飾代碼塊:
格式:

			static{
							//代碼邏輯
			}

PS:
1)靜態代碼塊存儲在方法區中,只加載一次,與對象無關執行時機爲加載類的信息期間,可以理解爲在對象實例化之前
2)作用:通常用於加載程序中所需要的靜態資源:圖片,音頻,視頻
3)運行時機:在實例化之前都會執行,每次實例化之前都會執行一次

五:抽象類

1)定義: 在繼承中,子類繼承父類,子類的功能會越來越具體化,所以有時候父類無法完成子類的功能需求,這時候子類需要重寫父類的方法,而爲了代碼簡單化,父類可不寫方法體且不佔空間,此時方法必須用abstract修飾,且以分號結尾,而抽象方法所屬的類也應該用abstract修飾,即抽象類。
如: public abstract void eat();

2)抽象方法與抽象類
一個抽象類中可以沒有抽象方法,但一個抽象方法所在的類一定是抽象類。

3)注意:
(1) 抽象類不能實例化,即創建對象,沒有意義
(2) 抽象類可以提供構造器
(3) abstract和final不能同時修飾一個類型
(final修飾的類不能被繼承,修飾的方法不能被重寫)

4)繼承抽象類
(1)若一個類繼承了抽象類,那麼這個類必須重寫(實現)抽象類的所有抽象方法
(2)若一個類沒有實現抽象類的所有抽象方法, 那麼這個類必須使用abstract修飾

5)抽象類的作用:
(1)給不同的子類定義一個父類
(2)抽象類可以封裝子類的共同特徵與共同行爲
(3)雖然子類方法可能有不能的實現邏輯,但是
方法的定義一致。

六:接口
1)定義:有時我們需要從多個不相關的類中設計出一個子類型,而java繼承
是單繼承的特點,無法滿足我們的需求,所以,我們可以使用接口來達到多繼承的目的。
接口實際上就是一種規範制度。 (規範與規則的理解)
2)接口的特點:
(1)接口使用interface關鍵字,而不是class,但是我們可以理解成接口是特殊的抽象類
(2)接口裏只能有抽象方法,類方法(靜態方法),私有方法(1.9版本), 默認方法和常量(只能是靜態)
(3)接口不能實例化,沒有任何意義
(4)接口不能提供構造方法(注意與抽象類不同)
(5) 接口中的常量:默認使用修飾詞爲public static final
(6)接口中的方法: 默認使用public abstract

3)接口的實現
(1)子類需要實現接口中的所有抽象方法,
(2)使用implements關鍵字進行實現
(3)如果子類沒有實現所有抽象方法,那麼子類需要使用abstract修飾
(4)子類可以實現多個接口(多繼承),接口間使用逗號分開

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章