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();
   }
}

目录
相关文章
|
9月前
|
机器学习/深度学习 Java
Java方法的嵌套与递归调用
Java方法的嵌套与递归调用
152 0
|
10月前
|
Java 编译器
[Java基础]基本概念(下)运算符,表达式和语句,分支,循环,方法,变量的作用域,递归调用
在上一篇文章[Java基础]基本概念(上)(标识符,关键字,基本数据类型)_小王师傅66的博客-CSDN博客中,我们学习了Java基础基本概念中的标识符,关键字,基本数据类型。这篇文章,我们将学习:运算符,表达式和语句,分支,循环,方法,变量的作用域,递归调用。
|
Unix Java
第10 篇:Java 方法的递归调用详解(递归调用的分析和案例:阶乘、斐波那契、猴子吃桃)
📖 调用方法会在栈空间分配一块新的、独立的、受保护的栈空间(栈帧) 📖 方法的局部变量是独立的,不会相互受影响 📖 调用递归方法的参数必须向退出递归的条件逼近,否则会导致无限递归,进而导致 StackOverflowError(栈溢出)
196 0
第10 篇:Java 方法的递归调用详解(递归调用的分析和案例:阶乘、斐波那契、猴子吃桃)
|
Java 数据库
记录一次Java递归调用导致java.lang.StackOverflowError错误
通过递归调用每次查询500条数据的id,再通过id删除记录的方式,数据量一大,导致递归过深,栈帧数超出虚拟栈深度,虚拟机栈过多,报java.lang.StackOverflowError错误。
477 0
记录一次Java递归调用导致java.lang.StackOverflowError错误
ZZULIOJ-1113: 递归调用的次数统计(函数专题)(Java)
ZZULIOJ-1113: 递归调用的次数统计(函数专题)(Java)
|
Java
java基础学习3_方法的递归调用
java基础学习3_方法的递归调用
362 0
|
Java
Java中函数的递归调用
说到递归,java中的递归和C语言中也是很相似的,在Java中,递归其实就是利用了栈的先进后出的机制来描述的。 public class HelloWorld { public static void main(String[] args){ // Scanner s = new Scanner(System.
867 0
|
Java
java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题
1 /* 2 对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中, 3 并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行 4 */ 5 import static java.
766 0
|
3天前
|
安全 Java 调度
Java线程:深入理解与实战应用
Java线程:深入理解与实战应用
23 0
|
1天前
|
消息中间件 缓存 NoSQL
Java多线程实战-CompletableFuture异步编程优化查询接口响应速度
Java多线程实战-CompletableFuture异步编程优化查询接口响应速度