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

时间:2008-11-04 03:14:43

标签: java

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

4 个答案:

答案 0 :(得分:24)

  
    

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

  
     

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

     

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

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

public class Scratch
{
    public static abstract class A
    {
        public A( int i ) {}
    }

    public static class B extends A
    {
        private B() { super(0); };
    }
}

答案 1 :(得分:7)

如果此行为属实,并且我不确定是否存在,则应始终使用可用于应用程序的最受限制的作用域。所以在这种情况下,我建议使用protected。

答案 2 :(得分:1)

  

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

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

完全可以选择使用什么。在大多数情况下,我通常更喜欢公开。

答案 3 :(得分:1)

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

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