1 /* 2 對于類中對成員變量的初始化和代碼塊中的代碼全部都挪到了構造函數中, 3 并且是按照java源文件的初始化順序依次對成員變量進行初始化的,而原構造函數中的代碼則移到了構造函數的最后執行 4 */ 5 import static java.lang.System.out; 6 7 public class PersonDemo 8 { 9 public static void main(String[] args) 10 { 11 //*********測試父類與子類之間的循環調用的問題 12 out.println("main1"); 13 14 Father f = new Father(); 15 16 out.println("main2"); 17 18 f.show(); 19 20 out.println("main3"); 21 22 //*********測試兩個無關類的循環調用的問題 23 24 MyClass11 m1=new MyClass11(); 25 m1.myOut(); 26 } 27 } 28 29 class Father 30 { 31 public Son s ; //=new Son(); 32 33 /* 34 public Song s= new Son(), 注意在這里進行初始化操作相當于在構造函數中進行初始化,會導致棧溢出, why? 35 在主函數中我們產生了一個Father對象, 然后在new一個Son對象的過程中,Son對象調用其父類的構造方法來完成 36 一些子類中包含父類成員的初始化,最終導致了循環調用,最終棧溢出 37 */ 38 public newSon ns =null; // new newSon(); 39 40 public Father() 41 { 42 this(10); 43 System.out.println("Father"); 44 } 45 46 public Father(int a) 47 { 48 //this();很顯然, 加上這一句就會形成構造函數遞歸調用!哈哈。。。 49 } 50 51 public void show() 52 { 53 s = new Son(); 54 /* 55 如果我們將 s 的賦值操作放在這里, 也就是去掉 public Son s = new Son()的初始化,這樣就不會導致棧溢出了 56 看一看也就會明白了, new Son()時會調用父類Father的構造方法來完成Son的一些成員的初始化,但是其父類構造 57 函數中沒有行循環調用! 58 */ 59 ns = new newSon(); 60 61 System.out.println("father show"); 62 63 s.show(); 64 ns.show(); 65 } 66 67 public class newSon extends Father//內部類同樣會導致上面的問題! 68 { 69 public newSon() 70 { 71 System.out.println("newSon"); 72 } 73 74 public void show() 75 { 76 System.out.println("newSon show"); 77 } 78 } 79 } 80 81 class Son extends Father 82 { 83 public int a = 20; 84 85 public Son() 86 { 87 super(); 88 System.out.println("Son"); 89 } 90 91 public void show() 92 { 93 System.out.println("Son show"); 94 } 95 } 96 97 class MyClass11{ 98 99 MyClass22 m2; 100 //MyClass22 m2=new MyClass22();//這樣寫會導致循環調用問題 101 102 public MyClass11(){ 103 //m2=new MyClass22();//這樣寫和上面的錯誤是一樣的 104 } 105 public void show(){ 106 System.out.println("This MyClass11"); 107 } 108 public void myOut(){ 109 m2=new MyClass22();//m2的賦值放在這里 110 m2.show(); 111 } 112 } 113 114 class MyClass22{ 115 116 MyClass11 m1; 117 public MyClass22(){ 118 m1=new MyClass11();//移位main()函數中沒有定義MyClass22的對象,所以這句賦值不會導致循環調用的問題,只需要將MyClass11中的賦值操作更改一下就好了 119 } 120 public void show(){ 121 System.out.println("This MyClass22"); 122 } 123 public void myOut(){ 124 m1.show(); 125 } 126 }
?