Java中的构造函数是否存在访问修饰符继承?

时间:2015-07-29 13:45:58

标签: java inheritance constructor access-modifiers

在Java中扩展类时,我可以给出覆盖更高或更高访问修饰符的方法,但不能更低。由于foo中的方法ClassB必须为public,因此不允许使用以下内容:

public class ClassA {
    public void foo() {}
}
public class ClassB extends ClassA {
    @Override
    protected void foo() {}
}

似乎这不适用于构造函数。我可以做到以下几点:

public class ClassA {
    public ClassA () {}
}
public class ClassB extends ClassA {
    protected ClassB() {}
}

为什么会这样?是否有其他规则也适用于构造函数但不适用于方法?

1 个答案:

答案 0 :(得分:6)

因为ClassB的构造函数不是override ClassA的构造函数。它是一种完全不同的方法,只调用(显式或隐式)ClassA的构造函数。因此,可见度也可以降低。

另一个强调点是,如果你没有自己调用ClassA的许多构造函数,那么将调用ClassA的默认构造函数。如果ClassA没有,并且你没有在ClassB的构造函数中调用另一个,编译器会不高兴。

// This WILL call super() implicitly, without you actually having to write it
protected ClassB() {}

我假设您已经知道如果您根本没有为您的类编写任何构造函数,则会隐式添加默认构造函数。 (这个默认构造函数将再次调用super(),见上文)。