1

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

     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 中初始化我的子类对象。

那么解决这个问题的好方法是什么?

4

2 回答 2

2

我看到的一些事情是错误的。首先,根据评论,您不能在 B 的父类的构造函数中创建 B 的实例。那将是一个无限循环。

另外,我看到您称其为“新 bObj”。你的意思是我假设的 new B() ?

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

最后,你真的不应该尝试在构造函数中启动线程。您实际上是将尚未完全构造的对象传递给 Thread 类。应该在构造对象后启动它。

于 2013-10-20T04:25:38.173 回答
1

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

现在再次查看您的代码。在你的构造函数中A,当然每次你创建一个时都会调用它A,你已经说过“从创建一个开始A”。你不期待一个无限循环吗?

于 2013-10-20T04:26:52.990 回答