抽象类构造函数访问修饰符

一个抽象类只能用作一个由其他类扩展的基类,对吧? 抽象类的构造函数可以具有通常的访问修饰符(public,protected和private(供内部使用))。 哪个protectedpublic是正确的访问修饰符,因为抽象类型似乎表明技术上公共构造函数会受到很大程度的保护? 我应该在所有构造函数上使用protected吗?

因为抽象类型似乎表明技术上公共构造函数将受到很大程度的保护

这是不正确的。 抽象类不能通过调用其构造函数直接实例化,但是,任何具体实现都将inheritance抽象类的方法和可见性

所以抽象类当然可以有公共构造函数。

实际上,抽象类的构造函数只能从实现的构造函数中调用,因此它在公共或受保护之间没有区别。 例如:

 public class Scratch { public static abstract class A { public A( int i ) {} } public static class B extends A { private B() { super(0); }; } } 

如果这种行为是正确的,并且我不确定它是什么,则应始终使用可用于应用程序的最受限制的作用域。 那么在这种情况下,我建议使用protected。

因为抽象类型似乎表明技术上公共构造函数将受到很大程度的保护

嗯…对于抽象类,这个构造函数范围[public或protected]没有太大区别,因为不允许实例化[即使是公共]。 由于它是由子类调用的,因此它可以无缝地调用public或protected构造函数。

它完全取决于使用什么。 在大多数情况下,我通常更喜欢公开。

至少,抽象类应该有一个受保护的构造函数。 它不是绝对必要的,因为无论如何都不可能使用构造函数,但它使合同明确。

另一种选择是使构造函数成为私有的。 如果该类的所有实现都是私有内部类,那么这只是一个好主意。 一个罕见但有用的例子。