動手動腦 課件中動手動腦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進行呼叫時,就不會報錯。這是因為靜態方法只能呼叫靜態的成員,在對非靜態成員即例項成員進行呼叫時,必須通過對例項化的物件的例項成員的呼叫。