面向對象主要特征
繼承(inheritance)
繼承也稱泛化,繼承性是子類自動共享父類屬性和方法的機制。
是類之間的的一種關系,一般類與特殊類之間的關系。關鍵字extends
*被繼承的類稱為父類(超類,基類),繼承的類叫子類(派生類)。
*子類繼承父類的所有屬性和方法,同時也可以增加自己的屬性和方法。
文法為:【修飾符】class 子類名 extends 父類名
例:
圖檔.png
繼承的含義
*java中隻支援單繼承,就是每個類隻能有一個父類,不允許有多重繼承。
*一個父類可以有多個子類
*子類繼承父類的所有屬性和方法。
*子類是父類的一種,也可以說“子類就是父類”。
類的繼承
子類執行個體化的過程
*子類執行個體化時先執行個體化其父類,然後執行個體化子類。
*要先調用父類的構造器,父類構造器運作完畢,才調用子類的構造器。
調用構造方法
在構造方法中,可以使用this或super調用其他的構造方法
*super()
作用:調用父類構造器
隻能出現在子類的構造器中,且必須是第一行。
super()中的參數,決定了調用父類的哪個構造器。
如果子類構造器中沒有出現super,那麼編譯器會預設加上super(),即調用父類的空構造器,如果父類沒有空構造器,編譯器提示錯誤。
(父類出現多個構造器,即重載使用super)
*this()
作用:調用本類的構造器。
隻能寫在構造器的第一行。
在同一個構造器中super()和this()不能同時出現。
-子類執行個體化過程
*使用預設構造器
*在子類中建立構造器
*在子類中建立構造器時,必須調用父類構造器
1.子類可以在自己的構造器中使用super關鍵字來調用父類構造器
例:super(參數1,參數2,)
2.如調用的是父類無參的構造器,那不可用super()
3.如果子類中調用了父類無參的構造器,而父類中沒有無參構造器則系統出錯。
super和this關鍵字
super.
指向父類的引用。
通過關鍵字super我們可以指定子類在構造時調用父類的哪個構造器
,達到先執行個體化父類然後執行個體化子類的目的。
子類的構造器預設的調用父類無參構造器,即子類構造器中沒有用
super指明調用父類哪個構造器的話,實際上編譯器會自動的在子類
構造器第一行加入代碼super( );
this.
指向本類的引用。
我們知道子類在執行個體化時必須調用父類的構造器,實際上有的子類
構造器也可以先調用本類的其他構造器,然後再通過那個構造器調
用父類的構造器
無論是調用父類的構造器還是子類的構造器,最終都是找到最頂級
的父類自上而下的執行個體化。隻要中間環節有一個構造器沒找到,這
個子類就無法完成執行個體化。
封裝(encapsulation)
所謂封裝是把對象的屬性和行為結合在一個獨立的系統機關内部。
盡可能隐蔽對象的内部細節,隻向外部提供接口。
封裝的重要意義:
使對象能夠集中而完整地描述并對應一個具體事物
展現了事物的相對獨立性,使對象外部不能随意存取對象的内部資料
權限修飾符
使用通路修飾符對類的成員進行控制,在java中稱為“封裝”。
用來控制類的成員和類的使用範圍。
權限修飾符包括:
圖檔.png
封裝的常用設定:
*構造器和類的權限通常為public
*private權限最小,限制類外通路,一般把屬性設為private,讓其他類不能直接通路屬性,達到保護屬性的目的。
*不使用權限符時即default的成員在類内以及在同一個包内的其他類可以通路。
*protected所修飾的成員在類内,同一個包中,所在類的子類中都可以通路。
方法的覆寫(override)
也可稱為重寫(rewrite),是對父類中繼承來的方法進行改造,隻有在子類繼承父類時發生。
方法覆寫規則
在子類中的覆寫方法與父類中被覆寫的方法應具有
相同的方法名
相同的參數清單(參數數量、參數類型、參數順序都要相同)
相同的傳回值類型
子類覆寫方法的通路權限要不小于父類中被覆寫方法的通路權限
abstract和final
在Java中使用abstract關鍵字定義抽象方法
例:abstract int method1(int a, int b);
abtract class A {
String name;
abstract int method1(int a, int b);
void sayHi( ){
System.out.println(“Hello!”);
};
抽象方法
隻有方法聲明,沒有方法實作的方法
抽象方法需要子類重寫該方法,是以不能用private、final修飾
抽象類是抽象方法和非抽象方法的集合,包含特殊情況如下:
*抽象類中可以全部是抽象對象
*抽象類中可以全部為非抽象方法
抽象類
抽象類規則
注意:
*抽象類不能被執行個體化
*包含的抽象方法必須在其子類中被實作,否則子類隻能聲明為abstract;
*抽象方法不能為static;
final關鍵字
final可以修飾的元素:
類:不能被繼承
變量(屬性和局部變量):不能被重新指派
– 在聲明時指派,或在構造器中指派
– 系統不會對final屬性預設的賦初始值
方法:不能在子類中被覆寫,即不能修改。
接口(interface)
接口意義
java繼承時一個類隻有一個直接父類,也就是單繼承,但是一個類可以實作多個接口,接口彌補了類的不能多繼承缺點,繼承和接口的雙重設計即保持了類的資料安全也變相實作了多繼承。
接口的概念
*接口中隻包含常量和抽象方法,而沒有變量和方法的實作。
*接口對類來說是一套規範,是一套行為協定。
接口不是一個類,不能執行個體化。
文法格式:
接口的成員:常量(字段),抽象方法
圖檔.png注意:接口不是一個類,沒有構造器,不能被執行個體化。
*接口用interface關鍵字來定義,而不是class。
接口預設:
-常量:public static final
-抽象方法:public abstract
接口與接口的繼承
可實作多繼承
圖檔.png
圖檔.png
接口和類的關系
類實作接口-implements
為了使用一個接口,你要編寫實作接口的類
如果一個類要實作一個接口,那麼這個類就必須實作接口中所有抽象方法。
否則這個類隻能聲明為抽象類
多個無關的類可以實作一個接口,一個類可以實作多個無關的接口
一個類可以在繼承一個父類的同時,實作一個或多個接口
圖檔.png
接口可以實作多繼承:用接口可以實作混合類型(主類型,副類型)在java中可以通過接口分出主次類型;主類型使用繼承,副類型使用接口實作。
JDK8接口預設方法
在JDK8之前,接口不能定義任何實作,這意味着之前所有的JAVA版本中
,接口制定的方法是抽象的,不包含方法體。
從JKD8開始,添加了一種新功能-預設方法。預設方法允許接口方法定義
預設實作,而所有子類都将擁有該方法及實作。
圖檔.png
預設方法是可選的,子類可以根據不同的需求Override預設實作。
接口與抽象類的對比
接口不能含有任何非抽象方法,而抽象類可以。
從JKD8開始,接口可以有預設方法。
類可以實作多個接口,但隻能有一個父類。
接口和接口之間可以多繼承
如:public interface A extends B,C
其中B,C也是接口.
抽象類可以了解為抽象方法和非抽象方法的混合體,而接口中的方法
完全是抽象方法,是一套純粹的規範。一般來說,有關系的類才能繼
承同一個抽象類,而無關的類不可能有同一個抽象父類,但是無關的
類可以實作同一個接口。
final常用方式
把常量設定為靜态static,多個執行個體共享該常量,沒有必要每個對象保
存一份;
常量設定為final類型,指派以後不能再改變;
最後注意遵守常量命名規範,所有字母大寫、單詞之間用下劃線。
圖檔.png
引用資料類型的轉換
上溯造型
向上轉型(uppcasting)-子類轉換為父類,自動轉換。
前提-具有實作和繼承關系
向上轉換損失了子類的新擴充的屬性和方法,僅可以使用從父類中繼承的屬性和方法。
圖檔.png
下溯造型
向下轉型(Downcasting):強制轉換
将父類對象顯示的轉換成子類類型。
曾經向上轉換過的對象,才能再向下轉換。對象不允許不經過上溯造型而直
接下溯造型。
如下寫法是會出現運作期錯誤:
– Person p = new Person();
– Student s = (Student)p;
instanceof運算符
通過instanceof來判斷該經過上溯轉型後是哪一個子類的。
判斷一個執行個體對象是否屬于一個類
– object instanceof class 對象 instanceof 類
判斷一個類是否實作了某個接口
– object instanceof interface 對象 instanceof 接口
傳回值都是boolean類型
例如:
Animal a = new Cat( );
boolean b= a instanceof Cat;
class Animal{}
class Cat extends Animal{}
多态(polymorphism)
指同一個命名可具有不同的語義。對于子類可用不同的方法替代實作父類的服務的方法(用父類建立子類的對象)
多态存在的三個必要條件:
*要有繼承,或實作。
*要有重寫。
*父類引用指向子類對象。
一旦滿足以上3個條件,當調用父類中被重寫的方法後,運作時建立的是
哪個子類的對象,就調用該子類中重寫的那個方法。
在執行期間(而非編譯期間)判斷所引用對象的實際類型,根據其實際
類型調用相應的方法。
内部類
内部類就是定義在另一個類内部的類。
内部類對于同一包中的其他類來說,内部類能夠隐藏起來。
文法:
圖檔.png
**注意:
内部類可以通路其外部類中所有的屬性和方法,無需建立外部類的對象。
必須建立内部類的對象,否則無法從外部類通路内部類的變量和方法。
如果内部類中有和外部類同名的變量或方法,則内部類的變量和方法将獲
得比外部類的變量和方法更高的優先級。
不能定義static變量
一個類隻會被這個類所調用,其他類不會使用他,你可以把它定義成
一内部類,這樣可以隐藏實作細節,避免錯誤的調用。
圖檔.png