在超类构造函数中创建子类对象需要无限循环java

在超类构造函数中创建子类对象需要无限循环java,java,oop,Java,Oop,这可能是个愚蠢的问题,但请暂时容忍我。我有一些类似于: public class A{ public A(){ //Some statements here B bObj = new B(); //Goes in infinite loop this above statement (new Thread(bObj)).start(); //Some statements here }

这可能是个愚蠢的问题,但请暂时容忍我。我有一些类似于:

     public class A{


    public A(){
        //Some statements here

        B bObj = new B(); //Goes in infinite loop this above statement

        (new Thread(bObj)).start();
        //Some statements here


    }

    public static void main(String[] args){
         A aObj = new A();

        }

    }
}

class B extends A implements Runnable{
    public testprint(){
        System.out.println("Inside testprint()");
    }
}
如果我在超类中创建一个子类对象,它会进入无限循环,因为我猜一旦创建了子类对象,它就会一直调用超类构造函数,而超类构造函数会一直创建子类对象。如果我在main中声明子类对象,我会得到类似“无法从静态上下文引用非静态成员”的结果,因为我的超类对象尚未初始化。所以我不能在main中初始化我的子类对象


那么,什么才是解决这个问题的好办法呢?

我发现有几件事情是错误的。首先,根据注释,您不能在B的父类的构造函数中创建B的实例。这将是一个无限循环

还有,我看到你叫“新bObj”。我想你是说新的B()吧

您希望创建B的实例而不是A,然后在B的构造函数中,启动线程时,您希望将“this”传递给thread对象,而不是尝试创建新实例


最后,无论如何,您都不应该尝试在构造函数中启动线程。实际上,您将向Thread类传递一个尚未完全构造的对象。应该在构建对象后启动它。

不要忘记每个
B
都是
A
。所以每次你试图创建一个
B
,你实际上是在创建一个
a


现在再看看你的代码。在
A
的构造函数中(当然每次创建
A
时都会调用该构造函数),您说过“从创建
A
开始”。您不希望出现无限循环吗?

为什么要尝试在
a
的构造函数中创建
B
对象?真正的问题是什么?B的隐式构造函数调用A的构造函数,这就是问题所在,当B是A的子类时,它需要是
静态的
,这就是第二条消息的解释。还要注意,您提供的代码甚至没有编译(
testprint
没有返回类型,B也没有
run
method)@Ted如果我在main方法中创建一个B对象,我会收到“无法从静态上下文引用非静态成员”消息。所以我是从A的构造函数开始做的:P你说的“处理这个问题的好方法是什么?”是什么意思?你实际上希望你的代码做什么?请发布生成错误的代码“不能引用非静态成员…”。我发现它确实在无限循环中运行。我只是想知道,如果没有无限循环,我想做什么是一个好方法。如果你想做的是创建一个a类,用B扩展它,在a构造函数中创建一个B,没有无限循环,你就做不到。它必然会创造一个。如果您只想创建一个A类,那么就用B扩展它,并分别创建一个,不要将B与A混合在一起。用main()创建一个外部类并将A和B放在其他地方。@DavidWallace OP不应该做的是创建一个扩展B的类C,并在B构造函数中创建一个C的实例。@David我不知道我的语句是如何以这种方式构造的。它明显地增加了一个限定词,询问做我想做的事情的“好方法”是什么。如果我的问题不能说明我想做什么,那么你应该让我进一步澄清,我很乐意这样做。我认为你的上述评论是不必要的。好吧,如果你不想让我帮你,我会把时间花在其他地方。顺便说一句,欢迎你到目前为止对我的帮助。