为什么不能在Java中有一个受保护的抽象类?

2022-09-03 16:54:45

我有一个抽象类,看起来像这样:

abstract class AbstractFoo implements Bar {
  //Code goes here
}

但是,当我尝试使AbstractFoo受到保护时,我收到一个错误编译时错误,抱怨它是一个非法的修饰符。

protected abstract class AbstractFoo implements Bar {
  //Code goes here
}

为什么不能在Java中拥有受保护的抽象类?

编辑:我应该提到这不是香草Java,实际上是黑莓/ J2ME。


答案 1

正如许多其他人所指出的那样,这里的限制与你的类是抽象的这一事实无关,而是在你选择使用的可见性修饰符中。请记住这些可见性修饰符的含义:

对于您正在使用关键字的类...

  • 私人:仅对此类可见

  • (默认值/包私有):仅对此类及其包中的类可见

  • 保护:对此类、其包中的类以及此类的子类可见

  • 公共:对任何类都可见

不能将顶级类声明为私有,因为这样就没有任何内容能够访问它们。

但是你的问题围绕着为什么它们可能不被宣布为受保护。很明显,受保护的顶级类(如果它能够存在)对自身是可见的(每个类对它自己都是可见的)。同样清楚的是,受保护的顶级类对其包中的类是可见的。但是,使其对其子类可见是很棘手的。应该允许哪些类继承我们受保护的类?

如果它们都是,那么我们的类也可能是公共的,因为这样我们就说任何类都有权访问我们受保护的类。如果它们都不是,那么我们的类也可能是包私有的,因为只满足其他两个条件(对自身可见并且其包中的东西)。它不能是“其中一些”,因为我们需要一种方法来定义哪些类可以访问它,这就是可见性修饰符的初衷。

因此,由于这些原因,顶级类不能私有的或受保护的;它们必须是包私有公共的。


答案 2

顶级类只能是公共类或包私有类(默认)。

public class PublicClass { 

    protected class InnerClass { } //protected makes sense here

}

class PackagePrivateClass { }

因为: 和 这里都是顶级类,所以它们不能有其他访问修饰符,并且 .PublicClassPackagePrivateClassprivateprotected

顶级类只允许使用公共访问修饰符和默认访问修饰符。但对于内部成员类,也允许使用其他修饰符。

这个抽象在这里很可能没有任何关系。


推荐