JAVA基礎整理-50.Java繼承和多態
Java類的封裝
封裝就是將對象的屬性和方法相結合,通過方法將對象的屬性和實現細節保護起來,實現對象的屬性隱藏。
Java類的繼承:Java簡單的繼承及單繼承和多繼承的區別
簡單繼承
註意:類的繼承並不改變類成員的訪問權限。也就是說,如果父類的成員是公有的、被保護的或默認的,它的子類仍具有相應的這些特性。
extends 關鍵字直接跟在子類名之後,其後面是該類要繼承的父類名稱。例如:
- public class Student extends Person{}
註意:如果在父類中存在有參的構造方法而並沒有重載無參的構造方法,那麽在子類中必須含有有參的構造方法,因為如果在子類中不含有構造方法,默認會調用父類中無參的構造方法,而在父類中並沒有無參的構造方法,因此會出錯。
單繼承
Java 不支持多繼承,只允許一個類直接繼承另一個類,即子類只能有一個父類,extends 關鍵字後面只能有一個類名。
盡管一個類只能有一個直接的父類,但是它可以有多個間接的父類。
如果類聲明頭部沒有定義任何 extends 子句,則該類隱含地繼承自 java.lang.Object 類。
Java super關鍵字:super調用父類的構造方法、利用super訪問父類成員
由於子類不能繼承父類的構造方法,因此,要調用父類的構造方法,必須在子類的構造方法體的第一行使用 super() 方法。該方法會調用父類相應的構造方法來完成子類對象的初始化工作。
使用 super 調用父類的構造方法
子類可以通過 super 關鍵字來調用一個由父類定義的構造方法,格式如下:
super(parameter-list);
super() 必須是在子類構造方法的主體第一行。super 用來直接調用父類中的構造方法
使用 super 訪問父類成員
使用 super 訪問父類中的成員與 this 關鍵字的使用相似,只不過它引用的是子類的父類
super.member
super 還可以用於調用被子類隱藏的方法。
Java對象類型轉換和強制對象類型轉換
Java 語言允許某個類型的引用變量引用子類的實例,而且可以對這個引用變量進行類型轉換。如果把引用類型轉換為子類類型,則稱為向下轉型
強制對象類型轉換
Java 編譯器允許在具有直接或間接繼承關系的類之間進行類型轉換。對於向下轉型,必須進行強制類型轉換;對於向上轉型,不必使用強制類型轉換。
子類的對象可以轉換成父類類型,而父類的對象實際上無法轉換為子類類型
Java方法重載
方法重載有兩種情況:普通方法的重載和構造方法的重載。
方法重載時必須要註意以下兩點:
- 重載方法的參數列表必須和被重載的方法不同,並且這種不同必須足以清楚地確定要調用哪一個方法。
- 重載方法的返回值類型可以和被重載的方法相同,也可以不同,但是只有返回值類型不同不能表示為重載。
Java方法重寫
在子類中如果創建了一個與父類中相同名稱、相同返回值類型、相同參數列表的方法,只是方法體中的實現不同,以實現不同於父類的功能,這種方式被稱為方法重寫,又稱為方法覆蓋。
在重寫方法時,需要遵循下面的規則:
參數列表相同,返回類型相同,
訪問修飾符的限制一定要大於被重寫方法的訪問修飾符(public>protected>default>private)
Java多態性:Java什麽是多態?
多態性是面向對象編程的又一個重要特征,它是指在父類中定義的屬性和方法被子類繼承之後,可以具有不同的數據類型或表現出不同的行為
對面向對象來說,多態分為編譯時多態和運行時多態
Java 實現多態有 3 個必要條件:繼承、重寫和向上轉型。
- 繼承:在多態中必須存在有繼承關系的子類和父類。
- 重寫:子類對父類中某些方法進行重新定義,在調用這些方法時就會調用子類的方法。
- 向上轉型:在多態中需要將子類的引用賦給父類對象,只有這樣該引用才既能可以調用父類的方法,又能調用子類的方法。
Java抽象(abstract)類
在面向對象領域,抽象類主要用來進行類型隱藏。
如果在一個方法之前使用 abstract 來修飾,則說明該方法是抽象方法,不能有方法體;
註意:abstract 關鍵字只能用於普通方法,不能用於 static 方法或者構造方法中。在抽象類中必須包含至少一個抽象方法,並且所有抽象方法不能有具體的實現,而應在它們的子類中實現所有的抽象方法(要有方法體)。
任何使用 new 創建抽象類對象的嘗試都會導致編譯時錯誤。
Java接口:接口的定義和接口的實現,定義接口,實現接口
接口的成員沒有執行體
接口不能被實例化,接口沒有構造方法,沒有字段。
定義接口
接口繼承和實現繼承的規則不同,一個類只有一個直接父類,但可以實現多個接口。
Java 接口的方法只能是抽象的和公開的,Java 接口不能有構造方法,Java 接口可以有 public、Static 和 final 屬性。
在接口中的方法是沒有方法體的。
提示:如果接口本身被定義為 public,則所有的方法和常量都是 public 型的。
實現接口
如果一個類實現多個接口,這些接口需要使用逗號分隔。
實現接口的方法必須聲明為 public,而且實現方法的類型必須嚴格與接口定義中指定的類型相匹配。
Java接口和抽象類的區別
接口內只能是功能的定義
接口的實現類中使用 implements 關鍵字
而抽象類中則可以包括功能的定義和功能的實現。
而在抽象類的實現類中,則使用 extends 關鍵字。一個接口的實現類可以實現多個接口,而一個抽象類的實現類則只能實現一個抽象類。
在接口中,所有的屬性肯定是 public、static 和 final,所有的方法都是 abstract,
所以可以默認不寫上述標識符;在抽象類中,既可以包含抽象的定義,也可以包含具體的實現方法。
接口的實現類中使用 implements 關鍵字
設計思想區別
抽象類是對一組具有相同屬性和方法的邏輯上有關系的事物的一種抽象,而接口則是對一組具有相同屬性和方法的邏輯上不相關的事物的一種抽象。
Java內部類:Java什麽是內部類?
內部類擁有外圍類的所有元素的訪問權限。
內部類可以分為:實例內部類、靜態內部類和成員內部類
內部類也可以分為多種形式,與變量非常類似,如圖 1 所示。
圖1 內部類的分類
Java內部類:Java實例內部類
實例內部類是指沒有用 static 修飾的內部類。
(1) 在外部類的靜態方法和外部類以外的其他類中,必須通過外部類的實例創建內部類的實例。
(2) 在實例內部類中,可以訪問外部類的所有成員。
提示:如果有多層嵌套,則內部類可以訪問所有外部類的成員。
(3) 在外部類中不能直接訪問內部類的成員,而必須通過內部類的實例去訪問。如果類 A 包含內部類 B,類 B 中包含內部類 C,則在類 A 中不能直接訪問類 C,而應該通過類 B 的實例去訪問類 C。
(4) 外部類實例與內部類實例是一對多的關系,也就是說一個內部類實例只對應一個外部類實例,而一個外部類實例則可以對應多個內部類實例。
(5) 在實例內部類中不能定義 static 成員,除非同時使用 final 和 static 修飾。
Java內部類:Java靜態內部類
靜態內部類是指使用 static 修飾的內部類。
(1) 在創建靜態內部類的實例時,不需要創建外部類的實例。
(2) 靜態內部類中可以定義靜態成員和實例成員。
(3) 靜態內部類可以直接訪問外部類的靜態成員,如果要訪問外部類的實例成員,則需要通過外部類的實例去訪問。
Java內部類:Java局部內部類
局部內部類是指在一個方法中定義的內部類。
局部內部類有如下特點。
(1) 局部內部類與局部變量一樣,不能使用訪問控制修飾符(public、private 和 protected)和 static 修飾符修飾。
(2) 局部內部類只在當前方法中有效。
(3) 局部內部類中不能定義 static 成員。
(4) 局部內部類中還可以包含內部類,但是這些內部類也不能使用訪問控制修飾符(public、 private 和 protected)和 static 修飾符修飾。
(5) 在局部內部類中可以訪問外部類的所有成員。
(6) 在局部內部類中只可以訪問當前方法中 final 類型的參數與變量。如果方法中的成員與外部類中的成員同名,則可以使用 <OuterClassName>.this.<MemberName> 的形式訪問外部類中的成員。
Java匿名類,Java匿名內部類
匿名類是指沒有類名的內部類,必須在創建時使用 new 語句來聲明類。
其語法形式如下:
- new<類或接口>()
- {
- //類的主體
- };
匿名類有如下特點。
(1) 匿名類和局部內部類一樣,可以訪問外部類的所有成員。
(2) 匿名類中允許使用非靜態代碼塊進行成員初始化操作。
(3) 匿名類的非靜態代碼塊會在父類的構造方法之後被執行。
Java內部類的作用:Java利用內部類實現多重繼承
Java 提供的兩種方法讓我們實現多重繼承:接口和內部類。
內部類一個很重要的特性:內部類可以繼承一個與外部類無關的類,從而保證內部類的獨立性。
JAVA基礎整理-50.Java繼承和多態