1. 程式人生 > >java基礎知識總結--繼承和接口

java基礎知識總結--繼承和接口

fin 關系 java抽象類 形象 無需 行為 聲明周期 class 代碼塊

什麽是繼承?什麽是接口?他們之間的區別和聯系是什麽?

什麽是繼承?

  繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的數據或新的功能,也可以用父類的功能。多個類中存在相同屬性和行為時,將這些內容抽取到單獨一個類中,那麽多個類無需再定義這些屬性和行為,只要繼承那個類即可。多個類稱為子類,單獨的那個類稱之為父類,超類、或者是稱為基類。

什麽是接口?

  接口在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類型的。
  • 接口中不能含有靜態代碼塊和靜態方法,但是抽象類中可以有靜態代碼塊和靜態方法。
  • 一個類只能繼承一個抽象類,但是一個類可以實現多個接口。

標記接口

  • 定義:標記接口是沒有任何方法和屬性的接口,它僅僅表明它的類屬於一個特定的類型。
  • 作用:簡單形象地說就是給某個對象打個標記,是對象擁有某項或者是某些特權。

java基礎知識總結--繼承和接口