Java知識Part02(協變、接口)

1、協變返回類型 表示在導出類中的被覆蓋方法可以返回基類方法的返回類型的某種導出類型
	JavaSE5 和Java較早之前的主要差異就是較早版本強制 導出類只能返回基類返回的類型(基類),而不能返回基類返回的類型的導出類,儘管這個導出類是從基類導出的,因此也應該允許返回。協變返回類型允許返回更具體的導出類。
2、由於向上轉型(在繼承層次中向上移動)會丟失具體的類型信息。所以我們嘗試通過向下轉型——在繼承層次中向下移動————來獲取類型信息。
因爲我們無法知道導出類具體是什麼類,爲了確保向下轉型的正確性,我們必須執行一個特殊的操作來獲得安全的向下轉型。在Java語言中,所有轉型都會得到檢查,即使只是進行一次普通的加括弧形式的類型轉換,在進入運行期時仍然會對其進行檢查,以確保它的確是我們希望的那種類型。如果不是,就會返回一個ClassCastException(類轉型異常)。這種在運行期間對類型進行檢查的行爲稱作“運行時類型識別”(RTTI)
3、多態意味着“不同的形式”,在面向對象的程序設計中,我們持有從基類繼承而來的相同接口,以及使用該接口的不同形式:不同版本的動態綁定方法。
4、接口和內部類爲我們提供了一種將接口與實現分類的更加結構化的方法————抽象
	因爲只是表示了一個接口,但是沒有具體實現內容,創建這個接口對象是沒有意義而且我們要阻止使用者這樣做。爲了在編譯時捕獲問題而不是在運行時發現,Java提供了抽象方法的基址。抽象僅有聲明而沒有方法體
5、abstract關鍵字允許人們在類中創建一個或多個沒有任何定義的方法————提供了接口部分,但是沒有提供任何相應的具體實現,這些實現由此類的繼承者創建的。interface這個關鍵字產生一個完全抽象的類,它根本就沒有提供任何具體的實現。它允許創建者確定方法名、參數列表和返回類型,但是沒有任何方法體。接口只提供了形式,而未提供任何具體實現。
一個接口表示“所有實現了該特定接口的類看起來都像這樣”,接口被用來建立類與類之間的協議。
6、Interface不僅僅是一個極度抽象的類,因爲它允許人們通過創建一個能夠被向上轉型爲多種基類的類型,來實現某種類似多重繼變種的特性
7、當實現一個接口的時,在接口中被定義的方法必須被定義爲pbulic;否則,它們就只能得到默認的包訪問權限,這樣在方法被繼承的過程中,其可訪問權限就被降低了,這是Java編譯器所不允許的。
8、只要一個方法操作的是類而非接口,那麼你就只能使用這個類及其子類。如果你想要將這個方法應用於不在此繼承結構中的某個類,那麼就很麻煩。接口可以在很大程度上放寬這種限制,因此,它使得我們可以編寫可複用性更好的代碼。
9、創建一個能夠根據所傳遞的參數對象的不同而具有不同行爲的方法,被稱爲策略設計模式。
	這類方法包含所要執行的算法中固定不變的部分,而“策略”包含變化的部分。策略就是傳遞進去的參數對象,它包含要執行的代碼。
10、接口的實現類的對象可以被傳遞給他的接口,這意味着它能被向上轉型成每一個接口。
11、使用接口的的核心原因:
	爲了能夠向上轉型爲多個基類型(以及由此而帶來的靈活性)。
	與使用抽象基類相同:防止客戶端程序員創建該類的對象,並確保這僅僅是建立一個接口。
12、如何選擇使用接口還是抽象類?
	如果要創建不帶任何方法定義和成員變量的基類,那麼應該選擇接口而不是抽象類。如果知道某事物應該稱爲一個基類,那麼第一選擇爲接口。
13、Java標識具有常量初始化值的static final時,會使用大寫字母的風格(在一個標識符中用下劃線來分隔多個單詞)。接口中的域自動是public的,所以沒有顯式地指明這一點。
14、接口可以嵌套在類中或其他接口中
	在類中的接口可以實現爲private,這個private接口可以強制自己的方法定義不要添加任何類型信息(不允許向上轉型)
	嵌套在另一個接口中的接口自動就是public,而不能聲明爲private
		當實現某個接口時,並不需要實現嵌套在其內部的任何接口,而且private接口不能在定義它的類之外被實現。
15、接口是實現多重繼承的途徑,而生成遵循某個接口的對象的典型方法就是工廠方法設計模式。這與直接調用構造器不同,我們在工廠對象上調用的是創建方法,而該工廠對象將生成接口的某個實現的對象。理論上,通過這種方式,我們的代碼將完全與接口的實現分離,這就使得我們可以透明地將某個實現替換爲另一個實現。
16、使用字節流來深度拷貝的時候,堆棧溢出發現有個數據很多過萬
	使用hashset來去重
17、重載就是靜態綁定,靜態多態。重寫是動態綁定,通過虛函數實現
2、向下轉型 運行時類型識別(RTTI)
 class Useful {
    void start(){
        System.out.println("ConstructorMethod");
    }
    void end(){
        System.out.println("end");
    }
}

class MoreUseful extends  Useful{
   void test(){
       System.out.println("test");
   }
}

public class TestUseful {
    public static void main(String[] args) {
        Useful[] a = {new Useful(),new MoreUseful()};
        a[0].start();
        a[1].start();
        a[1].end();
//        a[1].test();//cannot resolve method test()
        ((MoreUseful)a[1]).test();//run
    }
}
-
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章