繁体   English   中英

同一.java文件中任何其他顶级类的可访问性是什么?

[英]What is the accessibility of any other top-level class in the same .java file?

我听说一个.java文件只能有一个公共顶级类。

同一.java文件中其他任何顶级类的可访问性是否必须是privateprotected

为什么

public class MyClass {
    public static void main(String args[]) {
    }
}

 private class C{}

有错误

/MyClass.java:6: error: modifier private not allowed here
 private class C{}
         ^
1 error

谢谢。

一个Java文件只能有一个顶级类,这意味着您可以嵌套类。 您当前正在尝试创建两个顶级类。 嵌套类看起来像

public class MyClass {
    public static void main(String args[]) {
    }
    private class C{}
}

并具有名称MyClass.C (此处MyClass是顶级类,而C是内部类)。 对于顶级类,源文件名必须与顶级类的声明名称匹配。 这与C语言(不强制执行源文件的命名方案)形成对比。

正如@Erwin Bolwidt评论中指出的那样,您可以(尽管这是一个坏主意)

public class MyClass {
    public static void main(String args[]) {
    }
}
class C{}

但是只有与MyClass相同的程序包中的类才能访问它。

同一.java文件中其他任何顶级类的可访问性是否必须是privateprotected

显然不是,因为您的问题编译错误已经告诉您private对于顶级类无效。

Java语言规范7.6顶级类型声明回答了您的问题:

在没有访问修饰符的情况下,顶级类型具有包访问权限:只能在声明该包的包的编译单元中对其进行访问(第6.6.1节 )。 可以将某个类型声明为public类型,以授予从其他包中的代码对该类型的访问权限。

如果顶级类型声明包含以下任何一种访问修饰符,则是编译时错误: protectedprivatestatic

因此,顶级类甚至不允许 privateprotected

规范继续说:

当且仅当包存储在文件系统中(第7.2节 ),如果在文件中未找到由类型名组成的名称的类型,则主机系统可以选择强制执行限制,即它是编译时错误。如果满足以下任一条件,则加上扩展名(例如.java.jav ):

  • 该类型由声明该类型的包的其他编译单元中的代码引用。

  • 该类型被声明为public (因此可以从其他包中的代码访问)。

这种限制意味着每个编译单元最多只能有一个这样的类型。 此限制使Java编译器可以轻松地在包中查找命名的类。 实际上,许多程序员选择将每个类或接口类型放入其自己的编译单元中,无论该类或接口类型是公共的还是由其他编译单元中的代码引用的。

如您所见, public顶级类的名称必须与源文件相同。 那么,每个文件当然只能有一个public顶级类。

任何非public顶级类都必须是通常称为package-private的类 ,即它必须没有访问修饰符。

访问修饰符在第6章中定义。名称

在没有访问修饰符的情况下,大多数声明都具有包访问权限 ,从而允许访问包中包含其声明的任何位置; 其他可能性是publicprotectedprivate

内部类可以具有任何访问修饰符,但是外部类只能具有public或default修饰符。

例如:- public class A class Aclass A

要了解有关Java中访问修饰符的更多信息,可以查看此链接。 在Java中,默认,公共,受保护和私有之间的区别

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM