当前位置: 首页 > 知识库问答 >
问题:

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

衡修洁
2023-03-14

这可能是一个愚蠢的问题,但现在请耐心听我说。我有类似于:

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

那么,有什么好的方法来处理这个问题呢?

共有2个答案

阎咏思
2023-03-14

别忘了每个< code>B都是< code>A。所以每次你试图创建一个< code>B,你实际上是在创建一个< code>A。

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

欧阳晗日
2023-03-14

我看到了一些不对的事情。首先,根据注释,您不能在B的父类的构造函数中创建B的实例。这将是一个无限循环。

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

你想创建一个 B 而不是 A 的实例,那么在 B 的构造函数中,当启动线程时,你会希望将“this”传递给 Thread 对象,而不是尝试创建一个新实例。

最后,你真的不应该尝试在构造函数中启动线程。你将有效地传递给线程类一个还没有完全构造好的对象。应该在构造对象后启动它。

 类似资料:
  • 我见过子类的构造器方法被用于具有超类类型的变量。例如: 是类型对象还是类型?由于类inherit from,因此它的方法可能比它的超类多。实例调用这些函数是否只能存在于中,而不能存在于中?在这种情况下,和可以互换吗?例如:

  • 我正在尝试修改类Circle以包含第三个构造函数,用于构造具有两个参数的Circle实例——半径的双精度和颜色的字符串。还修改主类以使用此构造函数构造Circle的实例。我对此有困难,我一直收到从未使用构造函数Circle的消息。请查看代码。

  • 问题内容: 我正在尝试创建一个将字段作为参数的构造函数,然后将其放入存储在超类中的字段中。这是我正在使用的代码 在超类中,我用 我有一个访问器方法 我收到一个错误“ 味道在超类中具有私有访问权 ”,但是我认为这无关紧要,因为我正在调用将其返回到字段的访问器方法? 问题答案: 您应该做什么: 在您的超类中添加一个构造函数: 在Crisps类中: 注释 对您的问题的一些评论: “在超类中,我已经用”

  • 这是我的代码: 所以这里有一个无限循环错误(Stackoverflow)。但是,如果我注释掉我创建的两个对象中的任何一个,这都没关系。 我的代码中的对象如何导致Stackoverflow错误?

  • 我在弄清楚如何根据给定的类型在构造函数中创建一个新对象时遇到了困难。 例如,我有一个机器人驱动程序,它有一个默认构造函数,不接受任何参数,并创建一个基本的机器人。但我有另一个构造器,根据这个论点创造了一个新的机器人。 是一个接口。那么,如果我想创建,使其是另一种类型,比如?我需要做一些类型的铸造吗?