java文件名为什么要和public类名一致?
①test.java下public class classA
public class classA{
public static void main(String[] args){
System.out.println("public classA main...");
}
}
②test.java下public class classA + class test
public class classA{
public static void main(String[] args){
System.out.println("public classA main...");
}
}
class test{
public static void main(String[] args){
System.out.println("class test main...");
}
}
③test.java下public class classA + public class test
public class test{
public static void main(String[] args){
System.out.println("public classA main...");
}
}
public class classA{
public static void main(String[] args){
System.out.println("class test main...");
}
}
④test.java 下 class classA, class classB
class classA{
public static void main(String[] args){
System.out.println("classA main...");
}
}
class classB{
public static void main(String[] args){
System.out.println("classB main...");
}
}
⑤test.java 下 class test, class classB
class test{
public static void main(String[] args){
System.out.println("test main...");
}
}
class classB{
public static void main(String[] args){
System.out.println("classB main...");
}
}
现象:只要代码中有public类就必须和文件名一致,否则编译报错,但是没有public类则文件名和类名无所谓。
规定:编译器决定
(《java编程思想》):当编写一个java源代码文件时,此文件通常被称为编译单元(有时也被称为转译单元),每个编译单元都必须有一个后缀名.java,而在编译单元内则可以有一个public类,该类的名称必须与文件的名称相同(包括大小写,但不包括文件的后缀名.java)。每个编译单元只能有一个public类,否则编译器就不会接受。如果在该编译单元之中还有额外的类的话,那么在包之外的世界是无法看见这些类的,这是因为它们不是public类,而且它们主要用来为主public类提供支持。
每个编译单元(文件)只能有一个public类,意思是,每个编译单元只能有一个公开接口,而这个接口就由其public类来表示。(软件架构设计和安全性设计上得出的结论,或者说java的设计者们从这方面的考虑,或者真是一个规范?)
(参考:www.cnblogs.com/fuhongliang/p/4304477.html)
优点:
(1)防止.class文件覆盖,A.java下public class B若不记住这种关系,则可能再写出B.java下public class B,编译后只会留有一份B.class
(2)被项目中其他任何类引用时,只需在使用它前import所对应的class文件即可,将类名与文件名一一对应就可以方便虚拟机在相应的路径(包中)中找到相应的类的信息,否则很难找到需要的类,开销也很大。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 从 HTTP 原因短语缺失研究 HTTP/2 和 HTTP/3 的设计差异
· AI与.NET技术实操系列:向量存储与相似性搜索在 .NET 中的实现
· 基于Microsoft.Extensions.AI核心库实现RAG应用
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
· 10年+ .NET Coder 心语 ── 封装的思维:从隐藏、稳定开始理解其本质意义
· 【设计模式】告别冗长if-else语句:使用策略模式优化代码结构
· 字符编码:从基础到乱码解决
· 提示词工程——AI应用必不可少的技术