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方法的嵌套与递归调用
256 0
|
Java 编译器
[Java基础]基本概念(下)运算符,表达式和语句,分支,循环,方法,变量的作用域,递归调用
在上一篇文章[Java基础]基本概念(上)(标识符,关键字,基本数据类型)_小王师傅66的博客-CSDN博客中,我们学习了Java基础基本概念中的标识符,关键字,基本数据类型。这篇文章,我们将学习:运算符,表达式和语句,分支,循环,方法,变量的作用域,递归调用。
|
Java 数据库
记录一次Java递归调用导致java.lang.StackOverflowError错误
通过递归调用每次查询500条数据的id,再通过id删除记录的方式,数据量一大,导致递归过深,栈帧数超出虚拟栈深度,虚拟机栈过多,报java.lang.StackOverflowError错误。
558 0
记录一次Java递归调用导致java.lang.StackOverflowError错误
ZZULIOJ-1113: 递归调用的次数统计(函数专题)(Java)
ZZULIOJ-1113: 递归调用的次数统计(函数专题)(Java)
|
Java
java基础学习3_方法的递归调用
java基础学习3_方法的递归调用
380 0
|
Java
Java中函数的递归调用
说到递归,java中的递归和C语言中也是很相似的,在Java中,递归其实就是利用了栈的先进后出的机制来描述的。 public class HelloWorld { public static void main(String[] args){ // Scanner s = new Scanner(System.
899 0
|
Java
java中父类与子类, 不同的两个类中的因为构造函数由于递归调用导致栈溢出问题
1 /* 2 对于类中对成员变量的初始化和代码块中的代码全部都挪到了构造函数中, 3 并且是按照java源文件的初始化顺序依次对成员变量进行初始化的,而原构造函数中的代码则移到了构造函数的最后执行 4 */ 5 import static java.
784 0
|
21天前
|
Java 开发者
Java多线程编程中的常见误区与最佳实践####
本文深入剖析了Java多线程编程中开发者常遇到的几个典型误区,如对`start()`与`run()`方法的混淆使用、忽视线程安全问题、错误处理未同步的共享变量等,并针对这些问题提出了具体的解决方案和最佳实践。通过实例代码对比,直观展示了正确与错误的实现方式,旨在帮助读者构建更加健壮、高效的多线程应用程序。 ####
|
12天前
|
缓存 Java 开发者
Java多线程编程的陷阱与最佳实践####
本文深入探讨了Java多线程编程中常见的陷阱,如竞态条件、死锁和内存一致性错误,并提供了实用的避免策略。通过分析典型错误案例,本文旨在帮助开发者更好地理解和掌握多线程环境下的编程技巧,从而提升并发程序的稳定性和性能。 ####
|
7天前
|
监控 Java 开发者
深入理解Java中的线程池实现原理及其性能优化####
本文旨在揭示Java中线程池的核心工作机制,通过剖析其背后的设计思想与实现细节,为读者提供一份详尽的线程池性能优化指南。不同于传统的技术教程,本文将采用一种互动式探索的方式,带领大家从理论到实践,逐步揭开线程池高效管理线程资源的奥秘。无论你是Java并发编程的初学者,还是寻求性能调优技巧的资深开发者,都能在本文中找到有价值的内容。 ####