1. 程式人生 > >Java中的小問題

Java中的小問題

1、同一個類中的多個過載構造方法的互相呼叫,要用this(params)呼叫,不能直接顯示呼叫構造方法,並且呼叫的時候this()必須放在構造方法中的首行,也就是this()之前不能存在其他程式碼。params為過載構造方法的引數列表。

2、 建立子類例項的時候,new子類的構造方法,實際預設的構造方法的呼叫順序為呼叫父類不帶引數的構造方法,若不存在不帶引數的父類構造方法則編譯出錯,若 存在則呼叫該父類構造方法,之後再呼叫帶相應引數的子類構造方法。也就是說,建立子類例項的時候永遠都是要先呼叫父類的構造方法再呼叫子類的構造方法。如 果需要指定呼叫的具體父類構造方法,需要在子類構造方法使用super(params)來表明呼叫父類中帶有相應引數列表的構造方法,並且super之前 不能出現任何可執行的程式碼。

3、對於記憶體來說,建立子類例項的時候,先呼叫父類構造方法,說明在記憶體中建立了一個父類例項(包括該父類實 例的屬性和父類方法引用,注:方法不建立,因為一個類的所有例項共享所有類方法),之後再呼叫子類的構造方法,這個時候並不像建立普通類一樣從頭到尾在內 存中完完整整的建立一個單獨的類例項,而是在該父類例項連續下來的記憶體空間裡再建立子類增加的屬性和方法引用,如果子類重寫了父類相關屬性和方法,則在連 續下來的記憶體中建立重寫的屬性和重寫的方法引用。換句話說,建立子類例項的時候,子類例項和父類例項共用一塊連續的記憶體空間,並且子類例項記憶體空間包含父 類例項記憶體空間,所以父類引用變數可以指向子類例項,使用多型的父類例項引用可以強制轉換為子類引用。

4、過載方法和重寫方法的區別:過載方法是方法名一樣,引數列表不一樣,返回型別可以一樣也可以不一樣,過載方法出現在同一個類中;重寫方法是方法名、引數類表、返回型別都完全一樣,是子類重新定義父類中相應的方法,重寫方法不能出現在同一個類中。

5、多型就是父類物件引用可以指向子類物件引用。

6、父類的構造方法不能被子類繼承。

7、 當使用多型方式呼叫方法時,也就是父類引用變數指向子類例項,此時,java會先查詢父類中是否存在需要呼叫的方法,如果不存在則編譯錯誤,如果存在則再 檢查子類是否重寫了這個方法,如果重寫則呼叫子類的該方法,如果沒有重寫則直接呼叫父類的這個方法。而多型的父類引用,如果使用重寫的屬性值,則使用的屬 性值是父類的屬性值,因為此時是父類例項引用,指向的是父類例項記憶體中的屬性。

8、可以通過強制轉換的方式將使用多型方式的父類引用變數轉換為子類引用變數。

 

1、確定引用型別是否是多型是在執行時確定的,編譯的時候只能確定引用型別引用的是什麼類,也就是說多型是在編譯後進行的,是晚繫結的。

2、抽象類定義: abstract class 類名;抽象方法定義:修飾符 abstract 返回型別 方法名(params);(沒有花括號)。抽象方法必須定義在抽象類中。抽象類中可以包含具體方法,也可以不包含具體方法,抽象方法也可包含或者不包含。

3、繼承抽象類的子類必須實現父類中所有的抽象方法,如果沒有全部實現,則該子類還是一個抽象類,需要使用abstract關鍵字,同樣不能例項化。

4、 介面定義:關鍵字 interface 介面名{};介面中所有方法都是抽象方法,所以在介面中的方法不能出現方法體,並且方法的abstract抽象關鍵字可以省略,因為預設都是抽象的。介面 可以看成是特殊的抽象類,但是一個子類只能繼承一個父類,而對於介面,一個類可以實現多個介面。實現介面用關鍵字implements,繼承類用關鍵字 extents。介面中所有方法也都是public關鍵字修飾的,所以public關鍵字在介面中省略。

5、實現一個介面必須同時實現介面中所有的方法,否則要將類定義為抽象類。

6、介面多型:介面型別引用指向實現介面類的例項,具有多型特徵。

7、 靜態關鍵字static,當用於修飾類屬性時,表明該屬性為靜態類屬性,所有的例項都共享一份靜態屬性,如果一個例項修改了靜態屬性,那麼其他例項使用的 靜態屬性值也會改變,使用靜態屬性可以用例項名.屬性名,但是推薦使用類名.屬性名;當用於修飾方法時,可以使用類名.方法名來呼叫。

8、靜態方法只能繼承,但不具備多型特徵,也就是不能被子類重寫,只能被隱藏。即,只能使用靜態方法隱藏靜態方法,不能使用靜態方法覆蓋非靜態方法,也不能使用非靜態方法覆蓋靜態方法。被隱藏後呼叫的是父類還是子類的靜態方法,取決於是使用什麼型別的引用。

9、final修飾的類不能被繼承,final修飾的方法不能被子類重寫,final修飾的屬性不能被修改(屬性為原生資料型別時,則數值不能改變;屬性為引用型別時,則引用指向的物件不能改變,但物件屬性可以改變)。

10、final屬性定義時必須顯式賦予初值,如果定義時沒有賦初值則只能在構造方法中賦初值,並且所有構造方法都必須賦初值,否則編譯不通過,因為此時不賦初值將沒有其他機會再定義值。

11、 final{}靜態程式碼塊,是在編譯器編譯後的class類檔案載入進虛擬機器時執行的程式碼,一個類中的靜態程式碼只執行一次,在載入進虛擬機器的時候。所有靜 態程式碼塊在構造方法之前執行,構造方法是在生成新例項的時候才執行的,此時class檔案已載入進虛擬機器。對於繼承的靜態程式碼跟構造方法差不多,也是父類 的先執行,再執行子類的靜態程式碼,所有靜態程式碼執行完畢後有建立例項才按構造方法順序呼叫構造方法。

12、class類檔案在類被使用的時候才會載入進JVM,而且只加載一次。

13、 static靜態方法中只能呼叫靜態屬性,原因在於靜態方法可以通過類名呼叫,如果呼叫的是非靜態屬性,那麼每個例項的非靜態屬性都不同,靜態方法會無法 辨認使用的是哪個例項的屬性,因此編譯的時候不允許。反過來,非靜態方法可以呼叫靜態屬性,因為靜態屬性時唯一,方法知道呼叫的是哪個屬性。

14、不能在靜態方法中使用關鍵字this,同使用非靜態屬性的道理一樣,this只當前的例項物件,在靜態方法中使用this,java會無法辨認是哪個例項物件,因此編譯不通過。

15、介面中的成員變數都是public、final、static關鍵字修飾的,可以省略。因此,介面中的成員變數必須在定義的時候賦初值。

16、final和abstract關鍵字不能同時使用,因為abstract抽象定義要求繼承實現,而final是終止繼承,互相矛盾。

17、 單例模式:一個類只有唯一的一個例項,即無論建立多少個類例項,它們實際上都是同一個例項。實現的方法是:首先,將類的構造方法關鍵字設為 private,這麼一來構造方法只能在類內部呼叫,在類外無法呼叫也就無法在類外建立類例項;其次,將建立類例項轉移到類內部建立,並且使用 static關鍵字修飾建立的類例項;最後,建立static的返回類內建立類例項引用的方法,使用static的原因是無法在類外建立類例項也就無法在 類外呼叫類的任何一個非靜態方法,只能通過靜態方法來獲取類內建立的類例項,類例項也用static修飾也是因為它要被static方法呼叫。由此三個步 驟決定一個類由始至終只能建立一個類例項。

18、包相當於目錄,用於分類管理類檔案,包名推薦使用反順序的域名,並且全部小寫。

19、當java原始檔中使用package引入包名,則表明此原始檔中的類全名為:包名.類名,呼叫類的時候時候必須使用類的全名,即必須將類的class檔案放置到包名指示的檔案路徑下,虛擬機器才能找到相應的類執行,否則執行出錯。

20、當java原始檔沒有使用package引入包名,則使用預設的包default,呼叫的時候無需包名,即無包名。

21、編譯java原始檔使用命令時,javac -verbose 檔名,可以追蹤編譯器的執行情況;javac -d 路徑 檔名,可以將class生成到指定路徑下。

22、匯入包和類的時候使用import關鍵字,匯入類要使用類的全名,即指定到類名下,匯入包則在包名後加“.*”,*號是萬用字元的意思,即該包下所有的類檔案都匯入,但是沒有包含子包,如果需要匯入子包則要將子包當成另外一個包,按匯入包的方法匯入。

23、原始檔中,必須遵循package、import、class的順序宣告。

24、同個包內的類在關鍵字允許下,可以直接呼叫。

25、 訪問修飾符:public,所有包的類都可訪問,可以被所有包的類繼承;private,只有在定義為private的類內部才可訪問,不能被繼承;不帶 訪問修飾符即預設訪問修飾符,可以被該類內部和該類所在包內的類可以訪問,可以被所在包的其他類繼承,不能被其他包的類訪問和繼承;protected, 可以被類內部、相同包內其他類訪問,可以被其他包的類繼承,但不能被其他包的類訪問。

26、包和類的匯入跟訪問修飾符沒有直接聯絡,匯入是關於能不能找到類,訪問修飾符是關於找到的類有沒有許可權訪問。

27、關鍵字instanceof用於判斷某例項是不是某類或其子類的例項,引用名 instanceof 類名或介面名,返回一個布林值。