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 }

转载于:https://www.cnblogs.com/hujunzheng/p/3813599.html

java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题...相关推荐

  1. java中父类与子类有相同属性调谁?取决于左边

    java中父类与子类有相同属性调谁?答案是:取决于左边! 一. 在今天的继承复习当中,我有对继承中的属性有新的感悟------>子类继承父类,会继承父类的方法和属性,看下图: 从上图可以看出,即 ...

  2. Java中父类和子类抛出异常的处理

    (尊重劳动成果,转载请注明出处:https://blog.csdn.net/qq_25827845/article/details/85109390冷血之心的博客) 背景: 这篇博客的灵感来自于我在实 ...

  3. java中父类与子类的关系以及使用

    java中父类与子类的关系以及使用 在java中规定:一个父类可以有多个子类,但是一个子类只能有一个父类.子类可以通过extends关键字来继承父类.做个比较通俗的比喻,就像一个父亲可以有多个亲孩子, ...

  4. java 继承 子类 实例化_关于Java继承中父类和子类构造函数的问题

    Java子类在实例化时默认调用的是父类的无参构造函数,不论实例化时调用的是子类的有参还是无参构造函数, 1.当父类没有显式定义构造方法时, 编辑器会默认为此类添加一个隐式无参构造函数.此时子类可以有自 ...

  5. java子类和父类实例_java中父类与子类之间的转换示例

    java中父类与子类之间的转换示例有以下三点: 示例一 父类强制转子类 pre class="brush:php;toolbar:false">Father f = new ...

  6. C++继承中父类和子类之间的赋值兼容

    文章目录 1 C++继承中父类和子类之间的赋值兼容 1.1 父子间的赋值兼容 1.2 特殊的同名函数 1 C++继承中父类和子类之间的赋值兼容 1.1 父子间的赋值兼容 在公有继承的条件下,子类对象可 ...

  7. C++继承中父类和子类之间的同名覆盖

    文章目录 1 C++继承中父类和子类的同名成员变量 1.1 父类和子类的同名成员变量 2 C++继承中父类和子类的同名成员函数 2.1 父类和子类中的同名成员函数 1 C++继承中父类和子类的同名成员 ...

  8. 继承中父类、子类构造器中的super. 和super()运用

    1)第一种用法:super 关键字是父类对象的引用 package com.example;public class Person{ // 父类public String name="李四& ...

  9. C++ 中父类与子类赋值,取地址,引用的理解关系

    /*************** 功能:为了验证C++中父类与子类的赋值,引用,取地址. ****************/ #include <iostream> using names ...

最新文章

  1. python路3--tuple、str
  2. SAP Spartacus的configModule
  3. SQL Server日期函数集合
  4. react.lazy 路由懒加载_React lazy/Suspense使用及源码解析
  5. A+B Problem(高精)(洛谷-P1601)
  6. (组合数学笔记)Pólya计数理论_Part.4_Burnside引理
  7. 上中下结构html网页代码,简单理解网页源码(HTML源代码)
  8. 利用函数imnoise2处理噪声污染和spfilt处理滤波器
  9. c++求余弦的泰勒展开式
  10. css图片悬停特效,使用CSS3实现图片悬停放大的特效
  11. 数据结构_树与二叉树总结
  12. Tensorflow基础知识
  13. SQL Server数据库锁机制及类型
  14. Python函数(完整版)
  15. 【Matlab学习手记】良好的编程习惯
  16. tabIndex 和 aria注意点
  17. windows server 2012 RD服务器
  18. 压抑的西安互联网环境,你有纠结辞职吗?
  19. 隐私保护与隐私计算研讨会 | 余维仁:大数据时代下需要各界更新对个人隐私保护的固有认识
  20. spring 注解大全 及用法

热门文章

  1. bert 多义词_自然语言处理:Bert及其他
  2. app inventor离线版_百度要哭了!今日头条出了搜索引擎了,还做了APP
  3. 计算机论文哪儿找,查找关于计算机毕业论文.docx
  4. python刷题技巧_【python刷题】分治法
  5. Spring Schema整合Quartz_01
  6. 查看大日志文件的专门工具logviewer
  7. 快速部署web项目上线云服务器
  8. 冰雪复古鸿蒙碎片哪里出,冰雪复古:玩法攻略,如何高爆率搞回收!
  9. 省培计算机实践作业,计算机软件基础强化实践能力培养实践部分考核作业.doc...
  10. 信号槽绑定时出现未有匹配的connect()函数