??各位小伙伴們大家好,歡迎來到這個小扎扎的《Java核心技術 卷Ⅰ》筆記專欄,在這個系列專欄中我將記錄淺學這本書所得收獲,鑒于 看到就是學到、學到就是賺到 精神,這波簡直就是血賺
💡涉及的知識點速通
- 🛫 abstract抽象
- 🪂 抽象類
- 🪂 抽象方法
- 🛫 interface接口
- 🪂 接口的結構
- 🪂 接口的實現和方法引用
- 🪂 為什么使用接口
🛫 abstract抽象
🪂 抽象類
??一旦一個類使用abstract修飾之后就代表他是一個抽象類,抽象類的顯著特征就是:抽象類無法實例化。有的小伙伴可能就會問了,既然抽象類已經無法實例化對象了,那么它是不是已經沒有構造器了?不,抽象類依然有構造器,構造器的作用就是供子類繼承的時候進行調用。
🪂 抽象方法
??方法聲明: 使用abstract修飾的方法只能有方法的聲明不能有方法體和大括號
??抽象的類與方法之間的關系: 包含抽象方法的類一定是一個抽象類,但是抽象類中不一定包含抽象方法。而且繼承了抽象類的子類必須重寫該類中所有的抽象方法(如果超類的超類中也有抽象方法,此時子類也必須重寫超類的超類的抽象方法),否則子類也要使用abstract修飾成抽象類,這樣的話子類也就無法實例化??abstract關鍵字不能使用的地方: 關鍵字只能用來修飾類和方法,無法修飾屬性、構造器、代碼塊等結構。方法的聲明中:abstract關鍵字無法與private修飾符、static關鍵字、final關鍵字一起使用,因為私有、靜態、final方法無法被子類重寫,但是抽象方法必須被子類重寫,產生沖突。類的聲明中:abstract關鍵字無法與final關鍵字一同使用,final類無法被繼承那么它內部的抽象方法也就無法被重寫,發生沖突
🛫 interface接口
??接口的存在類似于抽象類,將一些類的共同行為特征作為抽象方法抽取出來,但是他又和抽象類有著本質的不同,接口根本就不是一個類。接下來我們就使用抽象類來類比學習接口的特性
??接口源文件: 接口雖然不是一個類,但是接口在很多方面和類十分相似,比如接口的源文件:接口的源文件也是一個.java文件,可以通過javac命令進行編譯生成.class字節碼文件。一個.java源文件中只能有一個使用public修飾的類或者接口,這個源文件是以public修飾的接口或者類命名的
🪂 接口的結構
??JDK 7以及之前,接口中只能定義公共靜態常量和公共抽象方法,JDK 8之后接口中還可以定義公共靜態方法和公共默認方法,所以說接口中的公共靜態常量在聲明的時候可以省略public static final,接口中的方法聲明可以省略public
??靜態、默認方法: 接口中的靜態方法無法通過接口實現類的對象調用,只能使用接口直接調用,但是接口中的默認方法可以通過接口實現類的對象調用,而且抽象超類中的靜態方法也可以使用子類對象調用。子類無法重寫覆蓋超類或者接口中的靜態方法,但是可以重寫覆蓋接口中的默認方法??接口構造器: 接口中絕對不能出現構造器,這也就意味著接口無法實例化創建對象,雖然抽象類也無法實例化創建對象,但是抽象類中有構造器(供子類調用)
🪂 接口的實現和方法引用
??接口的實現: 接口無法實現接口但是可以繼承接口或者類,類使用implements關鍵字實現接口,一個類可以實現多個接口使用逗號隔開。接口中定義了抽象方法,實現接口的類必須重寫這個接口中的所有抽象方法(包括通過extends繼承來的抽象方法),否則這個類就必須定義成抽象類就近引用、類優先、接口沖突原則:
??① 如果一個類的超類和超類的超類中定義了一個同名變量或者方法的話,由于就近原則這個類中引用的就是超類的變量或者方法,如果子類中也有的話就近調用子類的??②類和接口是一個同一級的概念,如果一個類的超類和它實現的接口中定義一個同名變量,這就會導致這個類中變量的引用不明確而報錯,但是如果是方法的話就默認類優先原則調用超類中的方法
??③還有一種就是一個類實現多個接口中有同名變量或方法,由于接口沖突此時引用這個變量或者方法就會報錯,需要重寫該方法或者重定義該變量
??總結來說同名情況下,多重繼承變量方法都就近,一接口一超類變量報錯、方法類優先,多實現接口沖突
🪂 為什么使用接口
?? 可能有的小伙伴要問了,既然抽象類跟接口都可以定義抽象方法,它們的子類或者實現類也都必須實現這個抽象方法,那么為什么不直接使用抽象類,而是大費周折的再引入接口的概念呢?抽象類畢竟是個類,類的話就只能繼承一個抽象超類,但是一個類可以實現無數多個接口,也就是說接口彌補了Java語言只能單繼承的局限性。
??接口的使用很廣泛,比如想要實現序列化就要實現Serializable 接口,想要自定義對象的排序規則就要實現Comparable接口,重寫CompareTo方法……