1. 程式人生 > >動手動腦 課件中動手動腦3

動手動腦 課件中動手動腦3

課件中動手動腦3

(1)以下程式碼為何無法通過編譯?哪兒出錯了?

在Foo類中定義的Foo類有一個int型別的實參,但主函式呼叫的時候沒有傳引數,所以會報錯。

 

(2)Java欄位初始化的規律

 

測試程式碼:

複製程式碼
package 包;
public class main {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO 自動生成的方法存根
        int x=50;
        t d=new t(x);
        System.out.println(d.n);
    }
}
package 包;

public class t {
    {
        n=100;
    }
    public int n=200;
    public t(int x)
    {
        this.n=x;
    }
}
複製程式碼

既有初始化塊,又重寫了建構函式,又設定了欄位的初始值,當三者都存在時,建構函式為主,輸出為50.

 

(3)靜態初始化塊的執行順序

 

測試程式碼:

複製程式碼
public class f {
    {
        System.out.println("執行f的非靜態初始化塊");
    }
    static
    {
        System.out.println("執行f的靜態初始化塊");
    }
    public f()
    {
        System.out.println("f的無引數構造器");
    }
}
public class s extends f{
    {
        System.out.println("執行s的非靜態初始化塊");
    }
    static
    {
        System.out.println("執行s的靜態初始化塊");
    }
    public s()
    {
        System.out.println("s的無引數的構造器");
    }
    public s(String a)
    {
        this();//呼叫該類中過載的構造器
        System.out.println("s的帶引數的構造器"+a);
    }
}
public class t extends s{
    {
        System.out.println("執行t的非靜態初始化塊");
    }
    static
    {
        System.out.println("執行t的靜態初始化塊");
    }
    public t()
    {
        super("haha");
        System.out.println("t的構造器");
    }
}
public class main {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO 自動生成的方法存根
        t g=new t();
    }
}
複製程式碼

在繼承與派生時,當對新的子類進行初始化時,父類的靜態初始化塊,非靜態初始化塊,構造器都會被呼叫,在被呼叫時,會首先呼叫靜態初初始化塊,而且所有的靜態初始化塊執行且執行一次。

(4)如何在靜態方法中訪問類的例項成員:

測試程式碼:

複製程式碼
package 包;
public class text {
    static String a="靜態成員";
    String b="非靜態成員";
    static void ttt()
    {
        System.out.println("呼叫"+a);
        System.out.println("呼叫"+new text().b);//進行物件例項化
    }
}
public class main {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO 自動生成的方法存根
        text.ttt();
    }
}
複製程式碼

如果直接用方法ttt()對非靜態成員b進行呼叫時,系統會報錯,而在對例項化過後的物件的成員b進行呼叫時,就不會報錯。這是因為靜態方法只能呼叫靜態的成員,在對非靜態成員即例項成員進行呼叫時,必須通過對例項化的物件的例項成員的呼叫。

 

(1)以下程式碼為何無法通過編譯?哪兒出錯了?

在Foo類中定義的Foo類有一個int型別的實參,但主函式呼叫的時候沒有傳引數,所以會報錯。

 

(2)Java欄位初始化的規律

 

測試程式碼:

複製程式碼
package 包;
public class main {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO 自動生成的方法存根
        int x=50;
        t d=new t(x);
        System.out.println(d.n);
    }
}
package 包;

public class t {
    {
        n=100;
    }
    public int n=200;
    public t(int x)
    {
        this.n=x;
    }
}
複製程式碼

既有初始化塊,又重寫了建構函式,又設定了欄位的初始值,當三者都存在時,建構函式為主,輸出為50.

 

(3)靜態初始化塊的執行順序

 

測試程式碼:

複製程式碼
public class f {
    {
        System.out.println("執行f的非靜態初始化塊");
    }
    static
    {
        System.out.println("執行f的靜態初始化塊");
    }
    public f()
    {
        System.out.println("f的無引數構造器");
    }
}
public class s extends f{
    {
        System.out.println("執行s的非靜態初始化塊");
    }
    static
    {
        System.out.println("執行s的靜態初始化塊");
    }
    public s()
    {
        System.out.println("s的無引數的構造器");
    }
    public s(String a)
    {
        this();//呼叫該類中過載的構造器
        System.out.println("s的帶引數的構造器"+a);
    }
}
public class t extends s{
    {
        System.out.println("執行t的非靜態初始化塊");
    }
    static
    {
        System.out.println("執行t的靜態初始化塊");
    }
    public t()
    {
        super("haha");
        System.out.println("t的構造器");
    }
}
public class main {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO 自動生成的方法存根
        t g=new t();
    }
}
複製程式碼

在繼承與派生時,當對新的子類進行初始化時,父類的靜態初始化塊,非靜態初始化塊,構造器都會被呼叫,在被呼叫時,會首先呼叫靜態初初始化塊,而且所有的靜態初始化塊執行且執行一次。

(4)如何在靜態方法中訪問類的例項成員:

測試程式碼:

複製程式碼
package 包;
public class text {
    static String a="靜態成員";
    String b="非靜態成員";
    static void ttt()
    {
        System.out.println("呼叫"+a);
        System.out.println("呼叫"+new text().b);//進行物件例項化
    }
}
public class main {
    /**
     * @param args
     */
    public static void main(String[] args) {
        // TODO 自動生成的方法存根
        text.ttt();
    }
}
複製程式碼

如果直接用方法ttt()對非靜態成員b進行呼叫時,系統會報錯,而在對例項化過後的物件的成員b進行呼叫時,就不會報錯。這是因為靜態方法只能呼叫靜態的成員,在對非靜態成員即例項成員進行呼叫時,必須通過對例項化的物件的例項成員的呼叫。