直接调用构造函数来创建对象是不可能的abstract
班级。的构造函数abstract
类只能从派生类中调用。因此它seems对我来说,抽象类的构造函数必须是protected
或包私有(后者用于限制对包内的派生类使用构造函数的特殊情况)。然而 Java 允许构造函数abstract
类是public
.
是否存在任何情况useful声明一个构造函数abstract
类是public
, 而不是protected
还是包私有?
这与问题并不完全重复“抽象类构造函数访问修饰符 https://stackoverflow.com/questions/260744/abstract-class-constructor-access-modifier”:显然你can将构造函数声明为public
;我想知道是否有过good这样做的理由。在我看来,没有。我看到C#也有类似的特点 https://stackoverflow.com/questions/2742408/relevance-of-public-constructor-in-abstract-class.
对于java来说答案是一样的:
没有理由为抽象类提供公共构造函数。我认为编译器不抱怨的原因很简单,他们只是没有花时间讨论这一点,因为它是公共的还是受保护的并不重要。 (source https://stackoverflow.com/questions/2742408/relevance-of-public-constructor-in-abstract-class/2742446#2742446)
除了直接子类之外,您不能从任何其他类调用抽象类的构造函数。
因此,为抽象类的构造函数的访问修饰符添加特殊规则不会为该语言添加有用的东西。
One看起来像是此规则的例外 - 如果抽象类仅定义默认构造函数,则子类不必实现构造函数:这是合法的:
public abstract class A {
public A() {}
}
public class B extends A {}
所以我们可以创建一个B
通过致电new B()
- 但请注意,我们still创建一个B
而不是一个A
。再说一次,构造函数是否存在并不重要A
是公开的还是受保护的。它不应该是私有的,但编译器会注意到并抱怨......
实际上我们调用了一个“不可见的”公共默认构造函数B
它做了一个简单的super()
call...
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)