10.18號java課後動手動腦
阿新 • • 發佈:2018-11-09
問題一結論:類如果提供了一個自定義的構造方法,將導致系統不再提供預設構造方法。
問題二結論:(1)程式執行的結果是100和300,field=200為類的初始化塊,可以在類中使用“{”和“}”將語句包圍起來,直接將其作為類的成員。類的這種“沒有名字”的“成員”.多用於初始化類的欄位。
(2)public int field=100; 在定義時進行初始化,此時field = 100。
(3)System.out.println(obj.field); 輸出field的值100。
(4)obj=new InitializeBlockClass(300);System.out.println(obj.field);利用構造方法進行初始化,field的值初始化為300,輸出300。
規律:
(1)執行類成員定義時指定的預設值或類的初始化塊,到底執行哪一個要看哪一個“排在前面”。
(2)執行類的建構函式。
(3)類的初始化塊不接收任何的引數,而且只要一建立類的物件,它們就會被執行。因此,適合於封裝那些“物件建立時必須執行的程式碼”。
問題三結論:程式碼為
class Root { static{ System.out.println("Root的靜態初始化塊"); } { System.out.println("Root的普通初始化塊"); }public Root() { System.out.println("Root的無引數的構造器"); } } class Mid extends Root { static{ System.out.println("Mid的靜態初始化塊"); } { System.out.println("Mid的普通初始化塊"); } public Mid() { System.out.println("Mid的無引數的構造器"); } public Mid(String msg) { //通過this呼叫同一類中過載的構造器 this(); System.out.println("Mid的帶引數構造器,其引數值:" + msg); } } class Leaf extends Mid { static{ System.out.println("Leaf的靜態初始化塊"); } { System.out.println("Leaf的普通初始化塊"); } public Leaf() { //通過super呼叫父類中有一個字串引數的構造器 super("Java初始化順序演示"); System.out.println("執行Leaf的構造器"); } } public class TestStaticInitializeBlock { public static void main(String[] args) { new Leaf(); } }
執行結果如下:
結論:靜態初始化塊只會在第一次裝入系統的時候執行,當再次例項化的時候就不需要再執行了,因為已經存在了。建立子型別的物件時,也會導致父型別的靜態初始化塊的執行。