Java中为何仅生成一个.class文件?为何仅首个声明类生成对应文件?
为什么编译后仅生成一个.class文件,且只有首个声明的类对应文件?
这是Windows文件系统大小写不敏感结合javac编译逻辑产生的现象,具体拆解:
Java编译的常规行为
对于包含多个非public类的.java源文件,javac编译时会为每个类生成独立的.class字节码文件。比如你给出的两段代码,在Linux、macOS这类区分文件名大小写的系统上编译,会同时生成A.class和a.class两个文件。Windows系统的特殊限制
Windows的NTFS/FAT文件系统默认不区分文件名大小写,它会把A.class和a.class判定为同一个文件。当javac按照代码里的类声明顺序依次编译时,先生成的.class文件会被后生成的“同名”文件覆盖——如果编译时系统弹出覆盖提示,你选择不覆盖,就会保留首个类的.class文件;如果选择覆盖,文件内容会变成后编译类的字节码,但文件名还是显示先创建的那个。你看到“仅首个类生成”的原因
你测试时应该是在Windows系统下,且编译时选择了保留先生成的文件,所以第一段代码先编译class A生成A.class,后续的class a无法生成独立文件;第二段代码先编译class a生成a.class,后续的class A也无法生成独立文件,最终只保留了首个类对应的.class文件。
另外补充:如果你的源文件名和某个类名一致(比如第一段代码存在A.java中),javac不会只编译这个类,还是会尝试编译所有类,只是Windows的文件系统导致第二个类的文件无法独立存在。
内容的提问来源于stack exchange,提问作者user16796941
相关产品推荐
相关产品推荐

