Java三大特性

ChanJying發表於2020-12-29

Java三大特性

封裝

封裝是指把一個物件的狀態資訊(也就是屬性)隱藏在物件內部,不允許外部物件直接訪問物件的內部資訊。但是可以提供一些可以被外界訪問的方法來操作屬性。如果屬性不想被外界訪問,我們大可不必提供方法給外界訪問。但是如果一個類沒有提供給外界訪問的方法,那麼這個類也沒有什麼意義了。

繼承

**概念:**繼承就是子類繼承父類的特徵和行為,使得子類物件(例項)具有父類的例項域和方法,或子類從父類繼承方法,使得子類具有父類相同的行為。

不同型別的物件,相互之間經常有一定數量的共同點。例如,小明同學、小紅同學、小李同學,都共享學生的特性(班級、學號等)。同時,每一個物件還定義了額外的特性使得他們與眾不同。例如小明的數學比較好,小紅的性格惹人喜愛;小李的力氣比較大。繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的資料或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。通過使用繼承,可以快速地建立新的類,可以提高程式碼的重用,程式的可維護性,節省大量建立新類的時間 ,提高我們的開發效率。

繼承是使用已存在的類的定義作為基礎建立新類的技術,新類的定義可以增加新的資料或新的功能,也可以用父類的功能,但不能選擇性地繼承父類。通過使用繼承可以提高程式碼複用性。繼承是多型的前提。

關於繼承如下 3 點請記住:

  1. 子類擁有父類物件所有的屬性和方法(包括私有屬性和私有方法),但是父類中的私有屬性和方法子類是無法訪問,只是擁有
  2. 子類可以擁有自己屬性和方法,即子類可以對父類進行擴充套件。
  3. 子類可以用自己的方式實現父類的方法。

分類:

根據繼承的特性可以分為純繼承與擴充套件。

純繼承關係是純粹的“is-a”(是一種)關係,因為一個類的介面已經確定了它應該是什麼。繼承可以確保所有的匯出類具有基類的介面,且絕對不會少。基類可以接收傳送給匯出類的任何訊息,因為二者有著完全相同的介面。

擴充套件關係“is-like-a”(像一個)關係,匯出類就像是一個基類——它有著相同基類的基本介面,但是它還具有由額外方法實現的其他特性。匯出類中介面擴充套件部分不能被基類訪問,因此,一旦向上轉型,就不能呼叫那些新方法

A extends B , B a =new A(); B向上轉型為A 的物件

A a1 =(A) a; 向下轉型(要先向上轉型),此時,a1可以呼叫擴充套件方法

特性:

Java 語言的繼承是單繼承,不允許一個類繼承多個父類。

繼承最重要的方面是用來表現新類和基類之間的關係。這種關係可以用“新類是現有類的一種型別”。

  • 繼承可以把新類向上轉換成基類,這是向上轉型的一種表現。

  • 由匯出類轉型成基類,在繼承圖上是向上移動的。

  • 向上轉型是從一個較專用型別向較通用型別轉換。

  • 匯出類是基類的一個超集。它可能比基類含有更多的方法,但它必須至少具備基類中所有的方法。

優缺點:

在面嚮物件語言中,繼承是必不可少的、非常優秀的語言機制,它有如下優點:

  • 程式碼共享,減少建立類的工作量,每個子類都擁有父類的方法和屬性;
  • 提高程式碼的重用性;
  • 子類可以形似父類,但又異於父類;
  • 提高程式碼的可擴充套件性,實現父類的方法就可以“為所欲為”了。
  • 提高產品或專案的開放性。

自然界的所有事物都是優點和缺點並存的,繼承的缺點如下:

  • 繼承是侵入性的。只要繼承,就必須擁有父類的所有屬性和方法;
  • 降低程式碼的靈活性。子類必須擁有父類的屬性和方法,讓子類自由的世界中多了些約束;
  • 增強了耦合性。當父類的常量、變數和方法被修改時,需要考慮子類的修改,而且在缺乏規範的環境下,這種修改可能帶來非常糟糕的結果——大段的程式碼需要重構。

多型

多型,顧名思義,表示一個物件具有多種的狀態。具體表現為父類的引用指向子類的例項。

**定義格式:**父類型別 變數名=new 子類型別();

理解:

​ 多型是同一個行為具有多個不同表現形式或形態的能力。

​ 多型就是同一個介面,使用不同的例項而執行不同操作。

多型的前提:
  1)要有繼承關係實現關係(介面);
  2)要有方法重寫
  3)要有父類或者父介面引用指向子類`Fu f= new Zi();
    注意:形參實參形式的(形參父類實參子類)

成員特點:

1、成員變數(編譯執行全看父類)

編譯的時候,參考父類中有沒有這個變數,如果有,編譯成功,沒有編譯失敗

執行的時候,執行的是父類中的變數值

2、成員方法(編譯看父類,執行看子類)

編譯的時候, 參考父類中有沒有這個方法,如果有,編譯成功,沒有編譯失敗

執行的時候, 執行的是子類的重寫方法

特例:呼叫靜態成員方法時,執行看父類。原因:靜態屬於類,不屬於物件。不new物件,也可呼叫父類的靜態方法,直接用類名呼叫。

多型的特點:

  • 物件型別和引用型別之間具有繼承(類)/實現(介面)的關係;
  • 引用型別變數發出的方法呼叫的到底是哪個類中的方法,必須在程式執行期間才能確定;
  • 多型不能呼叫“只在子類存在但在父類不存在”的方法;
  • 如果子類重寫了父類的方法,真正執行的是子類覆蓋的方法,如果子類沒有覆蓋父類的方法,執行的是父類的方法。

多型的型別:

如果在編譯時能夠確定執行多型方法稱為編譯時多型,否則稱為執行時多型。

編譯時多型

方法過載都是編譯時多型—對於多個同名方法,如果在編譯時能夠確定執行同名方法中的哪一個,則稱為編譯時多型性.。

執行時多型

如果在編譯時不能確定,只能在執行時才能確定執行多個同名方法中的哪一個,則稱為執行時多型性

Person p = new Man();   
p.toString();

Java支援執行時多型,意為p.toString()實際執行p所引用例項的toString(),究竟執行Person類還是Man類的方法,執行時再確定。如果Man類宣告瞭toString()方法,則執行之;否則執行Person類的toString()方法。

多型的好處:

  1. 可替換性(substitutability)。多型對已存在程式碼具有可替換性。
  2. 可擴充性(extensibility)。多型對程式碼具有可擴充性。增加新的子類不影響已存在類的多型性、繼承性,以及其他特性的執行和操作。實際上新加子類更容易獲得多型功能。
  3. 介面性(interface-ability)。多型是超類通過方法簽名,向子類提供了一個共同介面,由子類來完善或者覆蓋它而實現的。
  4. 靈活性(flexibility)。它在應用中體現了靈活多樣的操作,提高了使用效率。
  5. 簡化性(simplicity)。多型簡化對應用軟體的程式碼編寫和修改過程,尤其在處理大量物件的運算和操作時,這個特點尤為突出和重要。

instanceof關鍵字

作用:用來判斷某個物件是否屬於某種資料型別。

  • 注意: 返回型別為布林型別

    使用案例:

        Fu f1=new Zi();
        Fu f2=new Son();

        if(f1 instanceof Zi){
            System.out.println("f1是Zi的型別");
        }
        else{
            System.out.println("f1是Son的型別");
        }