超类子类构造函数java

时间:2014-09-05 14:21:32

标签: java constructor subclass superclass

我是Java新手。在下面的代码中,我很难理解这些概念。

class A {

    private Integer intr;

    public A(Integer intr) {
        this.inrt = intr;
    }

    public Integer getIntr() {
        return intr;
    }
}

class B extends A {

    public B(Integer intr) { //Eclipse asking me to create this constructor. 
        super(intr);
    }
}

我很困惑为什么我需要像eclipse建议那样创建那种构造函数。那里有什么?

3 个答案:

答案 0 :(得分:4)

子类的构造函数调用其超类的构造函数(在您的情况下为A)。如果您的子类B没有构造函数,编译器会自动创建一个没有任何参数的构造函数。该构造函数自动调用构造函数,不带基类A的参数。

由于您的基类A具有带参数的构造函数,因此编译器不会生成没有参数的构造函数,因此您必须在子类B中使用单个参数显式创建匹配构造函数。

在B中创建该构造函数的其他替代方法是:

您可以在A:

中定义无参数构造函数
public A()
{
   this.inrt = 0;
}

这将允许为B自动生成no参数构造函数来调用A中的匹配构造函数。

或者您可以在B中显式定义一个无参数构造函数,该构造函数调用A的现有构造函数:

public B()
{
    super(0);
}

答案 1 :(得分:2)

如果没有构造函数,则有默认构造函数,它也会调用super的默认构造函数。但是当您在父级中创建构造函数时,父级中没有默认构造函数。

答案 2 :(得分:2)

实例化A的唯一方法是使用A(Integer)构造函数。除非超类实现了一个无效的构造函数,否则每个子类都必须在其自构造函数的开头明确地调用一个超级构造函数。

但子类构造函数不一定需要完全相同的签名。例如,这些也是有效的:

public B() {
    super(42);
    // other B specific stuff
}

public B(Integer i, String s) {
    super(i);
    // other B specific stuff
}