java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题...
生活随笔
收集整理的這篇文章主要介紹了
java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题...
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
1 /*
2 對(duì)于類中對(duì)成員變量的初始化和代碼塊中的代碼全部都挪到了構(gòu)造函數(shù)中,
3 并且是按照java源文件的初始化順序依次對(duì)成員變量進(jìn)行初始化的,而原構(gòu)造函數(shù)中的代碼則移到了構(gòu)造函數(shù)的最后執(zhí)行
4 */
5 import static java.lang.System.out;
6
7 public class PersonDemo
8 {
9 public static void main(String[] args)
10 {
11 //*********測(cè)試父類與子類之間的循環(huán)調(diào)用的問題
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 //*********測(cè)試兩個(gè)無關(guān)類的循環(huán)調(diào)用的問題
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(), 注意在這里進(jìn)行初始化操作相當(dāng)于在構(gòu)造函數(shù)中進(jìn)行初始化,會(huì)導(dǎo)致棧溢出, why?
35 在主函數(shù)中我們產(chǎn)生了一個(gè)Father對(duì)象, 然后在new一個(gè)Son對(duì)象的過程中,Son對(duì)象調(diào)用其父類的構(gòu)造方法來完成
36 一些子類中包含父類成員的初始化,最終導(dǎo)致了循環(huán)調(diào)用,最終棧溢出
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();很顯然, 加上這一句就會(huì)形成構(gòu)造函數(shù)遞歸調(diào)用!哈哈。。。
49 }
50
51 public void show()
52 {
53 s = new Son();
54 /*
55 如果我們將 s 的賦值操作放在這里, 也就是去掉 public Son s = new Son()的初始化,這樣就不會(huì)導(dǎo)致棧溢出了
56 看一看也就會(huì)明白了, new Son()時(shí)會(huì)調(diào)用父類Father的構(gòu)造方法來完成Son的一些成員的初始化,但是其父類構(gòu)造
57 函數(shù)中沒有行循環(huán)調(diào)用!
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//內(nèi)部類同樣會(huì)導(dǎo)致上面的問題!
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();//這樣寫會(huì)導(dǎo)致循環(huán)調(diào)用問題
101
102 public MyClass11(){
103 //m2=new MyClass22();//這樣寫和上面的錯(cuò)誤是一樣的
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()函數(shù)中沒有定義MyClass22的對(duì)象,所以這句賦值不會(huì)導(dǎo)致循環(huán)調(diào)用的問題,只需要將MyClass11中的賦值操作更改一下就好了
119 }
120 public void show(){
121 System.out.println("This MyClass22");
122 }
123 public void myOut(){
124 m1.show();
125 }
126 }
?
轉(zhuǎn)載于:https://www.cnblogs.com/hujunzheng/p/3813599.html
總結(jié)
以上是生活随笔為你收集整理的java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题...的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 火箭鱿鱼和其他鱿鱼有什么区别
- 下一篇: 贡缎提花面料容易勾丝吗(贡缎提花面料)