1. 程式人生 > >10.18號java課後動手動腦

10.18號java課後動手動腦

 問題一結論:類如果提供了一個自定義的構造方法,將導致系統不再提供預設構造方法。

 問題二結論:(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(); } }

執行結果如下:

結論:靜態初始化塊只會在第一次裝入系統的時候執行,當再次例項化的時候就不需要再執行了,因為已經存在了。建立子型別的物件時,也會導致父型別的靜態初始化塊的執行。