具体类中的受保护构造函数与抽象类中的公共构造函数

Posted

技术标签:

【中文标题】具体类中的受保护构造函数与抽象类中的公共构造函数【英文标题】:protected constructor in concrete class vs public constructor in abstract class 【发布时间】:2013-08-29 18:05:19 【问题描述】:

这个问题是null source for FilterInputStream/FilterOutputStream的后续问题

这个问题可能与protected vs public constructor for abstract class? Is there a difference? (C#) 重复

我发现FilterInputStream是这样设计的。

public class FilterInputStream extends InputStream  // concrete

    protected FilterInputStream(InputStream in)  // protected
        // ...
    

我的问题是,如果代码是,有什么区别

public abstract class FilterInputStream extends InputStream  // abstract

    public FilterInputStream(InputStream in)  // public
        // ...
    

【问题讨论】:

【参考方案1】:

是的,您可以在第一个代码中使用一个主要区别

FilterInputStream fis =new FilterInputStream(in);

但是在第二个代码中你不能使用

FilterInputStream fis =new FilterInputStream(in);

因为抽象类不能有任何对象。 它只能被继承,并且它的孩子可以被实例化。

【讨论】:

在第一种情况下,只有当您是子类或在同一个包中时,您才能使用构造函数创建实例。没有其他类可以创建实例。【参考方案2】:

主要区别在于第一个类可以实例化,而第二个类不能实例化,因为它是抽象的。

受保护的构造函数可以被子类或同一个包中的类调用。

因此,java.io 包中的任何类都可以调用new FilterInputStream(),而其他包中的类不能这样做。

还有一个问题是,对于第一种情况,类中是否还有其他构造函数?

所以从继承来看,除了使用同一个包中的类之外,没有真正的区别。

【讨论】:

以上是关于具体类中的受保护构造函数与抽象类中的公共构造函数的主要内容,如果未能解决你的问题,请参考以下文章

C++:为啥我的 DerivedClass 的构造函数无法访问 BaseClass 的受保护字段?

Java 构造函数(抽象类中的构造函数) 和 加载

抽象类中的私有构造函数

为啥Java抽象类中需要受保护的构造函数

派生类中的构造函数和析构函数

构造函数与析构函数