標籤:style color 問題 代碼 sp on c 應用 設計
問題1 介面可以繼承介面。問題2 抽象類別可以實現介面。問題3 抽象類別可以繼承具體類,前提是實體類必須有明確的建構函式。證明:所有的類都從Object類繼承的。
解釋“實體類必須有明確的建構函式”的含義:
-1.沒寫構造器的,那是擁有預設無參公有建構函式的,子類可以什麼都不寫,讓預設構造器去調用它。這是最初那兩行代碼的情況。
-2.寫了子類可訪問的無參構造器的,也是一樣,子類裡可以什麼都不寫,用預設機制調用。
-3.寫了 有參構造器卻沒寫無參構造器的,父類裡沒有子類可訪問的無參構造器,子類必須在子類構造器裡的第一句寫明,調用父類有參構造器,並把參數傳進去。
-4.聲明為final的以及所有構造器都不在子類存取權限之內的類無法繼承
其實只要是在類的繼承中,無論抽象還是實體,都需要符合這個規則的。在這個繼承實驗中隨時刪掉或是加上abstract的首碼,結果都沒有變化。個人覺得“實體類必須有明確的建構函式”一句實在是無法把這個情況表達清楚,所以廣大求職者還是寫得清楚些好。
我喜歡的寫法是“可以繼承,但是和實體類的繼承一樣,也要求父類可繼承,並且擁有子類可訪問到的構造器。”
問題4 抽象類別中可以有靜態main方法。
只要記住,抽象類別與普通類的唯一區別就是不能建立執行個體對象和允許有abstrct方法!
我認為----抽象類別中的成員變數只能是正常的成員變數或者public static final的,抽象類別中的成員方法只能是正常的成員方法或public abstract!
問題5 abstractclass和interface有什麼區別?
含有abstract修飾符的class即為抽象類別,abstract 類不能建立的執行個體對象。含有abstract方法的類必須定義為abstract class,abstract class類中的方法不必是抽象的。abstract class類中定義抽象方法必須在具體(Concrete)子類中實現,所以,不能有抽象構造方法或抽象靜態方法。如果的子類沒有實現抽象父類中的所有抽象方法,那麼子類也必須定義為abstract類型。
介面(interface)可以說成是抽象類別的一種特例,介面中的所有方法都必須是抽象的。介面中的方法定義預設為public abstract類型,介面中的成員變數類型預設為public static final。
下面比較一下兩者的文法區別:
1.抽象類別可以有構造方法(非抽象),介面中不能有構造方法。
2.抽象類別中可以有普通成員變數,介面中沒有普通成員變數
3.抽象類別中可以包含非抽象的普通方法,介面中的所有方法必須都是抽象的,不能有非抽象的普通方法。
4. 抽象類別中的抽象方法的訪問類型可以是public,protected和(預設類型,雖然 eclipse下不報錯,但應該也不行),但介面中的抽象方法只能是public類型的,並且預設即為public abstract類型。
5. 抽象類別中可以包含靜態方法(非抽象),介面中不能包含靜態方法
6. 抽象類別和介面中都可以包含靜態成員變數,抽象類別中的靜態成員變數的訪問類型可以任意,但介面中定義的變數只能是public static final類型,並且預設即為public static final類型。
7. 一個類可以實現多個介面,但只能繼承一個抽象類別。
兩者在應用上的區別:介面主要是在系統架構設計方法上發揮作用,用於定義模組之間的通訊契約;抽象類別在代碼實現方法發揮作用,可以實現代碼重用,例如模板方法設計模式就是抽象類別的一個典型應用。
問題6 abstract的方法是否可以同時是static,或native,或synchronized?
答案是都不可以。
20 介面、抽象類別、繼承