如何从超类中实例化子类

时间:2013-10-08 05:00:38

标签: java inheritance constructor subclass superclass

以下代码有什么问题,我该如何解决?我的目标是在我的main方法中使用超类。这个超类对象本身应该创建(在其内部状态下)其子类的实例。 这样做的目的是因为子类只需要超类的状态来处理,并且因为子类需要做的所有操作只对超类有用。

public class Test {
    public static void main(String[] args) {
        Test2 testSuperclass = new Test2("success #1");
    }   
}

class Test2 {
    public Test2(String printComment) {
        System.out.println(printComment);
        Test3 testSubclass = new Test3("success #2");
    }
}

class Test3 extends Test2 {
    public Test3(String printComment2) {
        System.out.println(printComment2);
    }
}

Test3构造函数生成错误Implicit super constructor Test2() is undefined. Must explicitly invoke another constructor

3 个答案:

答案 0 :(得分:3)

构造函数必须做的第一件事是调用超类的构造函数。

通常,您没有看到,因为如果您不指定另一个,Java编译器会自动插入对非参数构造函数(super())的调用。但在你的情况下,Test2中没有非参数构造函数(因为你创建了另一个需要String的构造函数)。

public Test3(String printComment2) {
    super(printComment2);
    System.out.println(printComment2);
}

答案 1 :(得分:0)

添加Thilo的答案,当你没有明确定义super(对父的构造函数的调用)时,隐式调用就是“super()”。所以你基本上允许调用Test2的构造函数,但不传递字符串导致未定义的错误。

答案 2 :(得分:0)

您可以执行以下操作之一:

  1. 如果您只想让代码无需任何额外打印或创建对象,请创建一个无参数构造函数:

    class Test2 {
        public Test2(){
        }
        public Test2(String printComment) {
            System.out.println(printComment);
            Test3 testSubclass = new Test3("success #2");
        }
    }
    
    class Test3 extends Test2 {
        public Test3(String printComment2) {
            System.out.println(printComment2);
        }
    }
    
  2. 或者另一种方式是Thio提到的:

    public Test3(String printComment2) {
      super(printComment2);
      System.out.println(printComment2);
    }