java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题
/*
对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中,
并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行
*/
import static java.lang.System.out; public class PersonDemo
{
public static void main(String[] args)
{
//*********测试父类与子类之间的循环调用的问题
out.println("main1"); Father f = new Father(); out.println("main2"); f.show(); out.println("main3"); //*********测试两个无关类的循环调用的问题 MyClass11 m1=new MyClass11();
m1.myOut();
}
} class Father
{
public Son s ; //=new Son(); /*
public Song s= new Son(), 注意在这里进行初始化操作相当于在构造函数中进行初始化,会导致栈溢出, why?
在主函数中我们产生了一个Father对象, 然后在new一个Son对象的过程中,Son对象调用其父类的构造方法来完成
一些子类中包含父类成员的初始化,最终导致了循环调用,最终栈溢出
*/
public newSon ns =null; // new newSon(); public Father()
{
this(10);
System.out.println("Father");
} public Father(int a)
{
//this();很显然, 加上这一句就会形成构造函数递归调用!哈哈。。。
} public void show()
{
s = new Son();
/*
如果我们将 s 的赋值操作放在这里, 也就是去掉 public Son s = new Son()的初始化,这样就不会导致栈溢出了
看一看也就会明白了, new Son()时会调用父类Father的构造方法来完成Son的一些成员的初始化,但是其父类构造
函数中没有行循环调用!
*/
ns = new newSon(); System.out.println("father show"); s.show();
ns.show();
} public class newSon extends Father//内部类同样会导致上面的问题!
{
public newSon()
{
System.out.println("newSon");
} public void show()
{
System.out.println("newSon show");
}
}
} class Son extends Father
{
public int a = 20; public Son()
{
super();
System.out.println("Son");
} public void show()
{
System.out.println("Son show");
}
} class MyClass11{ MyClass22 m2;
//MyClass22 m2=new MyClass22();//这样写会导致循环调用问题 public MyClass11(){
//m2=new MyClass22();//这样写和上面的错误是一样的
}
public void show(){
System.out.println("This MyClass11");
}
public void myOut(){
m2=new MyClass22();//m2的赋值放在这里
m2.show();
}
} class MyClass22{ MyClass11 m1;
public MyClass22(){
m1=new MyClass11();//移位main()函数中没有定义MyClass22的对象,所以这句赋值不会导致循环调用的问题,只需要将MyClass11中的赋值操作更改一下就好了
}
public void show(){
System.out.println("This MyClass22");
}
public void myOut(){
m1.show();
}
}
java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题的更多相关文章
- 谈谈java中静态变量与静态方法在有继承关系的两个类中调用
谈谈java中静态变量与静态方法在有继承关系的两个类中调用 学习的中如果遇到不明白或者不清楚的的时候,就是自己做些测试,自己去试试,这次我就做一个关于静态变量和静态方法在有继承关系的两个类中的问题测试 ...
- Java 多态 父类和子类方法的访问控制权限
Java 多态 父类和子类方法的访问控制权限 @author ixenos 父类和子类方法的访问控制权限 继承是为了扩展类的功能,而这种扩展显然就是对一个原始类的扩展,目的还是向上转型来调用,所以这就 ...
- AQS的子类在各个同步工具类中的使用情况
AQS AQS(AbstractQueuedSynchronizer)是 java.util.concurrent的基础.J.U.C中宣传的封装良好的同步工具类Semaphore.CountDownL ...
- Reader与InputStream两个类中的read()的区别
InputStream类的read()方法是从流里面取出一个字节,他的函数原型是 int read(); ,Reader类的read()方法则是从流里面取出一个字符(一个char),他的函数原型也是 ...
- 转载:C++中两个类中互相包含对方对象的指针问题
原文链接:http://www.cnblogs.com/hanxi/archive/2012/07/25/2608068.html 前几天很不爽,因为C++中两个类中互相包含对方对象的指针编译时提示某 ...
- Java中父类和子类代码执行顺序
执行顺序:父类静态块-->子类静态块-->父类非静态块-->父类构造方法-->子类非静态块-->子类构造方法 当父类或子类中有多个静态方法时按在代码中的顺序执行 pack ...
- Java Collection - 003 高效的找出两个List中的不同元素
如题:有List<String> list1和List<String> list2,两个集合各有上万个元素,怎样取出两个集合中不同的元素? 方法1:遍历两个集合 public ...
- 【Java知识点专项练习】之 数据类型两大类
Java的数据类型分为两大类:基本类型和引用类型: 基本类型只能保存一些常量数据,引用类型除了可以保存数据,还能提供操作这些数据的功能: 为了操作基本类型的数据,java也对它们进行了封装, 得到八个 ...
- 找出list中的不同元素、删除两个list中相同的对象
package com.test; import java.util.ArrayList; import java.util.Arrays; import java.util.Collections; ...
随机推荐
- Python学习之路--面向对象
1.面向对象概述 面向过程:根据业务逻辑从上到下写垒代码 函数式:将某功能代码封装到函数中,日后便无需重复编写,仅调用函数即可 面向对象:对函数进行分类和封装,让开发“更快更好更强...” 面向 ...
- asp.net中gridview的checkbox使用总结
1.在gridview中的<column>中加入 <asp:TemplateField HeaderText="选择"> <ItemTemplate& ...
- Irrlicht 鬼火
1.下载引擎 2.引入头文件 在VS2010下新建项目,项目->属性->配置属性->VC++目录 在包含目录中:添加 引擎安装目录\include\ 在库目录中:添加 引擎安装目录\ ...
- 《Python标准库》 目录
目录 译者序序前言第1章 文本1.1 string—文本常量和模板1.1.1 函数1.1.2 模板1.1.3 高级模板1.2 textwrap—格式化文本段落1.2.1 示例数据1.2.2 填充段落1 ...
- linux-用命令形式聊天的常用命令
当我们在Linux的终端下使用命令“who”或“w”时,我们总会看到一长串的用户列表,此时,你是不是很想发送一个消息给他/她.如果她是一个你心仪很久的MM,而你正好看到她也在,迫于害羞的你,是不是此时 ...
- oracle在impdp时报ORA-31655和ORA-39154
检查表空间大小设置的是否合理. 另外可以试试 grant IMP_FULL_DATABASE to user;增加导入权限. (转)
- Quartz.net(调度框架) 使用Mysql作为存储
最近公司的做的项目中涉及到配置任务地址然后按照配置去目标地址提取相关的数据,所以今天上午在Internet上查看有关定时任务(调度任务)的相关信息,筛选半天然后查找到Quartz.net. Quart ...
- Razor.js,基于JavaScript的Razor实现
哈罗大家好,之前造了JS模板轮子Otmpl,虽然勉强算不错,但是和MVC Razor的简洁优雅相比,简直是惨不忍睹.经过几天的研究,终于在参考国外一些牛人的代码后,展现出第一版,欢迎各位园友拍砖讨论. ...
- 修改nw.js的exe文件使其请求管理员权限
修改nw.js的exe文件使其请求管理员权限 默认情况下,nw.js发布的nw.exe文件请求的是普通权限,当我们的应用需要访问一些特殊目录或者注册表等,就需要程序启动的时候以管理员权限运行.那么此时 ...
- 一步一步跟我学DeviceOne开发 - 仿微信应用(一,二,三)
这是一个系列的文档,长期目标是利用DeviceOne开发一些目前使用广泛的优质手机应用,我们会最大化的实现这些应用的每一个功能和细节,不只停留在简单的UI模仿和Demo阶段,而是一个基本可以使用的实际 ...