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; ...
随机推荐
- UIAlertController的使用
在iOS8中,苹果对UIAlertView和UIActionSheet进行了重新的封装,成为适应性更强,灵活性更高的UIAlertController.具体使用方法如下. UIAlertControl ...
- FreeRTOS和Ucos在打开关闭中断的区别
- html+css实现简易下拉菜单
<!DOCTYPE html> <html> <head> <style> div { width:100px; height:40px; overfl ...
- LoadRunner事务/集合点/思考时间详解(转)
在LoadRunner的脚步编写中,有三个重要的概念:事务.集合点.思考时间. 一.事务: 事务又称为Transaction,我们为了衡量某个action的性能,需要在action的开始和结束位置插入 ...
- 黑马程序员+ADO.Net基础(下)
---------------<a href="http://edu.csdn.net"target="blank">ASP.Net+Android ...
- coding.net
http://coding.net 看上去不错,简洁自然. https://coding.net/u/zhongzf/p/TestProject/git http://zhongzf.coding.i ...
- C#面向对象编程进阶(一) ——实现栈
如何用C#编写一个栈类? 关键在于这样的一个类应该如何设计呢?首先要确立面向对象的编程思想,即类是对实体进行合理地抽象和建模,而这种思想将贯彻在我们编程的整个过程中.下面我们一步一步来做. 1.类方法 ...
- TypeError: 'bases' is null or not an object。IE8 bug 腐朽的对象
使用Webapp Builder时候发现,在IE8上很奇怪的一个现象:在ajax回调函数中引用一个闭包作用域链中的对象作为某一个Dijit的实例化参数时有问题:bases is null or not ...
- Alpha阶段冲刺总结
Alpha阶段冲刺阶段总结 预期计划: 本阶段的预期计划是实现打地鼠游戏的基本功能,包括:游戏功能.难度调节功能.计时功能.计数记分功能.DIY设置功能.分数记录功能. 实际进展: 在经过三周的Alp ...
- Javascript事件模型系列(三)jQuery中的事件监听方式及异同点
作为全球最知名的js框架之一,jQuery的火热程度堪称无与伦比,简单易学的API再加丰富的插件,几乎是每个前端程序员的必修课.从读<锋利的jQuery>开始,到现在使用jQuery有一年 ...