为什么不能将类定义为受保护的?

M.J*_*.J. 74 java class protected

我知道这是一个愚蠢的问题,但我仍然怀疑需要清除.

我的问题是,为什么我们不能将课程定义为protected

我知道我们不能,但为什么呢?应该有一些具体的原因.

Nik*_*bak 89

因为没有意义.

受保护的类成员(方法或变量)就像package-private(默认可见性),除了它也可以从子类访问.
由于Java中没有'subpackage'或'package-inheritance'这样的概念,因此声明class protected或package-private将是同样的事情.

但是,您可以将嵌套和内部类声明为protected或private.

  • “因为它没有意义”——这是一个相当大胆的声明。它没有在 Java 中定义,但类似的东西 _do_ 存在;例如,Kotlin 中的 `open` 允许在当前包之外进行子类化(可以想象 Java 中的 `protected` 会阻止这种情况,而默认情况相反)。 (3认同)

Aka*_*288 38

如您所知,默认是针对包级访问,而protected是针对包级别加非包类,但是扩展了这个类(这里要注意的是,只有在可见的情况下才可以扩展类!).我们这样说吧:

  • 受保护的顶级类对于其包中的类是可见的.
  • 现在让它在包(子类)之外可见是有点混乱和棘手的.应该允许哪些类继承我们的受保护类?
  • 如果允许所有类都是子类,那么它将类似于公共访问说明符.
  • 如果没有,那么它与默认类似.

由于没有办法限制这个类只被几个类子类化(我们不能限制类只被包中/包外的所有可用类中的几个类继承),所以没有使用受保护的访问说明符对于顶级课程.因此不允许这样做.

  • "现在让一个受保护的类在包(子类)之外可见是有点混乱和棘手的.应该允许哪些类继承我们的受保护类?如果允许所有类继承子类,那么它将类似于公共访问说明符." 真的帮助我理解了为什么受保护的类没有意义的问题:) (3认同)

irr*_*ble 13

public class A
{
    protected class B
    {
    }
}
Run Code Online (Sandbox Code Playgroud)