java基礎知識總結--繼承和介面
什麼是繼承?什麼是介面?他們之間的區別和聯絡是什麼?
什麼是繼承?
繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的資料或新的功能,也可以用父類的功能。多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中,那麼多個類無需再定義這些屬性和行為,只要繼承那個類即可。多個類稱為子類,單獨的那個類稱之為父類,超類、或者是稱為基類。
什麼是介面?
介面在Java程式語言中是一個抽象型別,是抽象方法的集合,介面並不是類,編寫介面的方法和類很相似,但是他們屬於不同的概念,類描述物件的屬性和方法,介面則主要是包含類要實現的方法。在人們講到介面的時候,一般會有兩方面的含義:第一種就是講的Java介面,這是一種在Java語言中存在的結構,有特定的語法和結構;另一種僅僅是指一個類所具有的方法的特徵的集合,是一種邏輯上的抽象。前者叫Java介面,後者就是叫介面。
一個Java介面是一些方法特徵的集合,這些方法當然來自於具體的方法,但是他們一般都是來自於在系統中不斷出現的方法。一個介面只有方法的特徵,但是沒有方法的具體實現,因為這些方法在不同的地方被實現的時候可能會有完全不同的功能或者行為。
在Java語言中,介面還可以被定義為public的常量。
二、方法的特徵:
在Java語言規範中,一個方法的特徵包括方法名、引數的數目和種類,但方法的返回值型別、引數的變數名、還有丟擲的異常都不屬於方法的特徵。
在Java語言編譯器檢查方法的過載的時候就只是根據方法的特徵進行判斷兩個方法是不是過載,但是在Java編譯器檢查方法的置換的時候,則會進一步的檢查兩個方法的返回值型別和所丟擲的異常型別。
三、區分介面繼承和實現繼承
一個類實現一個介面,這種關係叫做介面繼承,而一個類是另一個類的字類,這種關係叫做實現繼承。介面繼承和實現繼承的規則是不同的,一個類最多隻能實現繼承一個超類,但是可以同時實現多個介面。
四、介面和類最重要的區別:
介面僅僅描述方法的特徵,而不給出方法具體的實現;但是類不單單給出方法的特徵,還給出方法的實現。因此介面把方法的特徵和方法的實現分割開來。這種分割,體現在介面常常代表的是一個角色,它負責封裝與該角色相關的操作和屬性,而實現這個介面的類則是扮演這個角色的演員。想通過的角色可以由不同的演員來演,而不同的演員之間除了扮演的是同一個角色之外,並不要求有其他的共同之處。
五、為什麼要使用介面
如果沒有介面,可插入性就不會有保證,介面讓可插入性變成可能。介面提供了關聯以及方法呼叫上的可插入性,軟體系統的規模越大,宣告週期越長,介面的重要性就越明顯,介面使得軟體系統在靈活性和可擴充套件性、可插入性方面得到保證。
六、Java介面常用的方法
單方法介面:介面中只有一個方法,這個方法可以看作是這個介面的唯一內容。這種做法可以看作是c語言中函式指標的對應物。
標識介面:表示介面是沒有任何方法和屬性的介面,表示介面不對實現它的類有任何的語義要求,它僅僅表示實現它的類屬於一個特定的型別。標識介面通常使用在工具類中,在其他的類裡邊很少使用到。
常量介面:實際上,Java介面應當僅僅用來生命一種新的型別,而不應該用來幹別的事情。介面常量是指的用介面來宣告一些常量,然後有實現這個介面的類使用這些常量。這樣一來,凡是實現這個介面的Java類都會自動的繼承這些常量,並且都可以像使用自己的常量一樣使用這些常量。
七、Java構建模型的頂端是Object類,所有的Java類,包括陣列物件,都已這個類為超類。需要說明的是:這是一個具體的類,既不是Java介面也不是Java抽象類。
八、Java語言是型別安全的,Java語言依靠三種機制做到了這一點:編譯期間的型別檢查、自動的儲存管理、陣列的邊界檢查。任何被Java編譯器接受的合法的Java類保證是型別安全的,在程式執行期間,不會有任何型別的錯誤。
繼承的主要特點?
優點:
- 子類不能選擇性的繼承父類。
- Java語言只支援單繼承,也就是一個類只能有一個父類。
- Java支援多層繼承體系。
- 子類可以直接訪問父類中的非私有的屬性和方法。
- 對於構造器來說,子類只能是呼叫父類的構造器,不能繼承。
- 繼承的使用提高了程式碼的複用性。
- 繼承讓類和類之間產生了關係,這是多型的前提。
- 在面向物件設計程式的過程中使用繼承原則,就是在每一個有一般類和特殊類形成的一般+特殊的結構中,把一般類的物件例項和所有特殊類的物件例項都共同擁有的屬性和方法一次性的在一般類中進行顯示的定義,在特殊類中不再重複的定義一般類中已經定義的東西。但是在語義上,特殊類卻自動的隱含的擁有他的一般類的(以及所有更上一層的一般類)中定義的屬性和方法。特殊類的物件擁有一般類的全部屬性和方法。
缺點:
- 父類變,子類就必須會變
- 繼承破壞了封裝性,對於父類而言,他的實現細節對子類來說都是透明的
- 繼承是一種強耦合關係。
- 介面無法被例項化,但是介面只能被別的類實現。
- 一個實現介面的類,必須實現介面內描述的所有的方法,否則就要宣告為抽象類。
介面的主要特點?
- 介面無法被例項化,但是介面只能被別的類實現。
- 一個實現介面的類,必須實現介面內描述的所有的方法,否則就要宣告為抽象類。
如何實現繼承?
使用繼承需要記住這幾句話:
- 通過使用extends關鍵字讓類與類之間產生繼承關係。
- 子類擁有父類非private的屬性和方法。
- 子類可以擁有自己屬性和方法,即子類可以對父類進行擴充套件。
- 子類可以用自己的方式實現父類的方法。
介面和類的相似點?
- 一個介面可以有很多的方法。
- 介面檔案儲存在以.java結尾的檔案中,檔名必須是介面名。
- 介面的位元組碼檔案儲存在.class結尾的檔案中。
- 介面相應的位元組碼檔案必須在與包名稱相匹配的目錄結構中
介面和類的區別?
- 介面不能用於例項化
- 介面沒有構造方法
- 介面中所有的成員方法必須是抽象方法
- 介面不能包含成員變數,除了static和final變數。
- 介面不能被類繼承,只能被類實現。
- 介面是支援多“繼承”的
什麼時間用繼承?什麼時間用介面?
什麼時候使用繼承?
如果類之間的關係存在著:is a 的關係,就需要考慮使用繼承,但是也不能為了繼承某個類的部分功能就盲目的使用繼承。
所以說當我們使用繼承的時候,我們需要確信使用繼承確實是有效可行的辦法。那麼到底要不要使用繼承呢?《Think in java》中提供瞭解決辦法:問一問自己是否需要從子類向父類進行向上轉型。如果必須向上轉型,則繼承是必要的,但是如果不需要,則應當好好考慮自己是否需要繼承。
重寫介面中宣告的方法時需要注意一下幾點:
- 類在宣告介面的時候,不能丟擲強制性,只能在介面中或者繼承介面的抽象類中丟擲強制性異常。
- 類在重寫介面中的方法時,必須要保持方法名的一致性,並且返回值的型別也必須要相同或者相互相容。
- 如果實現介面的是一個抽象類,那麼就沒有必要實現該介面中的所有方法。
繼承中構造器的呼叫順序是什麼?
在具有繼承關係的類進行例項化的過程中,構建例項的過程是從父類“向外”擴散的,也就是從父類開始向子類一級一級的完成構建,但是我們並沒有顯式的呼叫父類的構造器,這就是Java的高明之處:編譯器會預設給子類呼叫父類的無參構造器。
預設呼叫父類的構造器是有前提的:父類必須有預設的構造器(父類的程式碼中沒有顯式的構造器),如果父類沒有預設的構造器,那麼我們在子類中就必須使用super()來顯式的呼叫父類的構造器,並且必須是在子類構造器中的第一行程式碼,否則編譯器就會報錯。
介面的特性
- 介面是隱式抽象的,當宣告一個介面的時候,不必使用abstract關鍵字。
- 介面中的每一個方法都是隱式抽象的,介面中的方法會被隱式的指定為public abstract,並且只能是public abstract,其他的修飾符都會被編譯器報錯。
- 介面中可以含有變數,但是介面中的變數會被隱式的指定為public static final變數,並且只能是public static final 用其他的修飾符就會被編譯器報錯。
- 介面中的方法都不能在介面中實現,只能在實現介面的類物件裡實現介面中的方法。
- 一個介面能繼承另一個介面,和類之間的繼承方式比較相似。介面的繼承使用extends關鍵字,子介面繼承父介面的方法。
抽象類和介面的區別
- 抽象類裡邊的方法可以有方法體,就是能實現方法的具體功能,但是介面中的方法不行,介面中的方法必須是抽象方法。
- 抽象類中的成員變數可以是各種型別的,但是介面中的成員變數只能是public static final型別的。
- 介面中不能含有靜態程式碼塊和靜態方法,但是抽象類中可以有靜態程式碼塊和靜態方法。
- 一個類只能繼承一個抽象類,但是一個類可以實現多個介面。
標記介面
- 定義:標記介面是沒有任何方法和屬性的介面,它僅僅表明它的類屬於一個特定的型別。
- 作用:簡單形象地說就是給某個物件打個標記,是物件擁有某項或者是某些特權。