为什么Java编译器认为无package声明的同目录两文件属于同一包?
结论
Java编译器会将同一目录下未显式声明package的所有类,统一归属于同一个无名包(unnamed package),你遇到的编译表现完全符合Java语言规范的设计。
原理说明
- Java类的缺省访问修饰符(未写
public/protected/private的类、成员)为包级私有,仅允许同一包内的类访问。 - 你的示例中,
Square、Triangle都是缺省修饰符,且和App都没有声明package,三者同属一个无名包,因此App可以正常访问这两个类,编译不会报错。 - 当你为两个文件分别声明
package A和package B后,两个类归属不同的命名包,缺省修饰符的类跨包不可访问,因此编译失败,符合预期。
补充提示
无名包仅用于快速编写小型测试代码,正式项目要求所有类必须显式声明所属package,避免类名冲突、访问控制混乱等问题。
内容的提问来源于stack exchange,提问作者Tthis
相关产品推荐
相关产品推荐

