Java 为什么可以';类或接口是否接收私有或受保护的访问修饰符?
我正在阅读一些Java文本,其中说我们只能对类和接口应用Java 为什么可以';类或接口是否接收私有或受保护的访问修饰符?,java,access-modifiers,Java,Access Modifiers,我正在阅读一些Java文本,其中说我们只能对类和接口应用public或default访问修饰符。因此,如果我们声明: private class A {} 或 我只是好奇为什么一个类或接口不能接收私有的或受保护的访问修饰符?对于顶级的类可见性只有两个用例(a)随处可见(b)仅在包内可见。因此只有两个修饰符(public和default)。如果类是公共的,那么它对所有类都是可见的。如果没有访问修饰符,则它仅对同一包中的类可见 如果在顶层有更多的类可见性用例,Java语言将提供更多的修饰符 pri
public
或default
访问修饰符。因此,如果我们声明:
private class A {}
或
我只是好奇为什么一个类或接口不能接收
私有的
或受保护的
访问修饰符?对于顶级的类可见性只有两个用例(a)随处可见(b)仅在包内可见。因此只有两个修饰符(public
和default)。如果类是公共的,那么它对所有类都是可见的。如果没有访问修饰符,则它仅对同一包中的类可见
如果在顶层有更多的类可见性用例,Java语言将提供更多的修饰符
private
表示“仅在封闭类中可见”
protected
表示“仅在封闭类和任何子类中可见,并且在封闭类的包中的任何位置也可见”
因此,private
在应用于顶级类时没有任何意义;受保护的定义的第一部分也是如此。protected
的第二部分可以应用,但它被默认(package protected)修饰符覆盖,因此protected
部分无意义,部分冗余
private
和protected
都可以(并且经常)应用于嵌套类和接口,但决不能应用于顶级类和接口。顶级类只能具有public
或default
访问权限,但内部类可以具有private访问权限
:
public class TestClassAccess
{
public static void main(String[] args)
{
new TestClassAccess().new TestClassPrivateAccess();
}
private class TestClassPrivateAccess
{
TestClassPrivateAccess()
{
System.out.println("I'm a private class");
}
}
}
只要a和B不是顶级类,如果我们声明私有类a{}或受保护类B{},这不是编译错误。我相信接口的默认访问权限是公共的,因此实际上接口总是公共的。@Adrian Koster No.该规则适用于接口内部,但不是接口本身。首先,可见性的情况比Java提供的要多(参见示例c#),其次,您可以使用带有受保护或私有修饰符的类—只是没有顶级修饰符。@Voo,顶级只有两个用例。我相信这个问题意味着,正如它所说的,任何其他修饰符给出了类的编译错误可见性意味着什么?若类A可以访问(创建、调用成员函数等)类B,那个么类B对类A来说就是可见的。很好的例子。内部类也可以是静态的。内部接口和枚举是隐式静态的。
public class TestClassAccess
{
public static void main(String[] args)
{
new TestClassAccess().new TestClassPrivateAccess();
}
private class TestClassPrivateAccess
{
TestClassPrivateAccess()
{
System.out.println("I'm a private class");
}
}
}