Java中的构造函数是不是有访问修饰符继承?

Posted

技术标签:

【中文标题】Java中的构造函数是不是有访问修饰符继承?【英文标题】:Is there access modifier inheritance for constructors in Java?Java中的构造函数是否有访问修饰符继承? 【发布时间】:2015-10-20 13:03:19 【问题描述】:

在 Java 中扩展类时,我可以提供覆盖更高或相等访问修饰符的方法,但不能提供更低的访问修饰符。以下是不允许的,因为ClassB 中的方法foo 必须是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】:

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

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

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

我假设你已经知道如果你根本不为你的类编写任何构造函数,默认构造函数将被隐式添加。 (此默认构造函数将再次简单地调用super(),见上文)。

【讨论】:

以上是关于Java中的构造函数是不是有访问修饰符继承?的主要内容,如果未能解决你的问题,请参考以下文章

继承中构造函数的默认访问修饰符

简单的描述Java中的构造函数,及访问修饰符

Java_修饰符详解

Java 修饰符

继承 多态

Java 构造函数的默认访问修饰符