java基础知识回顾-01-类名、java文件名、编译及运行关系

在不使用IDE的情况下,Windows系统编译.java后缀结尾的java源文件和运行.class后缀结尾的字节码文件的命令分别是 “javac FileName.java”和“java ClassName”。
有一个点是,当文件名与类名不一致时(即FileName != ClassName,不过项目开发中一般都会使用pulic 作为类的修饰符,在这种情况下,java的语法格式强制要求 FileName == ClassName,不然,在编译时会报错)
示例如下:

java基础知识回顾-01-类名、java文件名、编译及运行关系_第1张图片
Command 示例

上例说明,在执行 java 命令时,命令的对象是字节码文件里面的类,寻找的方式是直接根据类名找的,与文件名无关。

这里又产生了一个问题,如果同一个目录下两个字节码文件中的类名相同呢,会报错么? 答案是不会。

java基础知识回顾-01-类名、java文件名、编译及运行关系_第2张图片
Command 示例-2

java基础知识回顾-01-类名、java文件名、编译及运行关系_第3张图片
Command-2 示例的运行结果与Command-1 示例的运行结果对比

上面两图分别是示例和示例运行后的结果,两种情况下,编译、运行均不报错,且运行后的结果一样。
说明,相同的目录下,不同的java文件内有同名的类在编译、运行时均不报错。

承接上例,发现,两次使用javac命令分别编译两个java源文件(Test4Main.java 和 Test4MainAnothor.java)确只生成了一个字节码文件,该字节码文件的文件名为类名

java基础知识回顾-01-类名、java文件名、编译及运行关系_第4张图片
目录下两次编译生成的同一个字节码文件

字节码文件内容如下(因为乱码问题,所以用Idea打开,貌似是自动识别编码来解码的):
java基础知识回顾-01-类名、java文件名、编译及运行关系_第5张图片
Idea 打开后的字节码文件

根据这两个截图猜测,是不是两个不同名的文件内的类名一样的情况下,编译出来的字节码文件名一样(很明显,字节码文件的名字就是类名.class 或 FileName.class),但是字节码文件的内容是最近一次编译的文件的内容?
删掉之前编译好的字节码文件,两个文件内容改一下来验证:
java基础知识回顾-01-类名、java文件名、编译及运行关系_第6张图片
Test4Main

java基础知识回顾-01-类名、java文件名、编译及运行关系_第7张图片
Test4MainAnother.png

编译前目录内:
java基础知识回顾-01-类名、java文件名、编译及运行关系_第8张图片
编译前-两个源文件

编译Test4Main.java:
java基础知识回顾-01-类名、java文件名、编译及运行关系_第9张图片
编译生成名为 Test4.class 的字节码文件

编译Test4MainAnother.java:
java基础知识回顾-01-类名、java文件名、编译及运行关系_第10张图片
编译后 Test4.class 被修改,执行结果为Test4MainAnother

观察结果,得出结论:
1、相同目录下,不同文件名内的类名可以一致;
2、同一文件夹内,若存在多个文件内类名相同的多个类,编译后只生成一个.class结尾的字节码文件,但是编译不同的文件生成的字节码文件内容不同,生成的字节码文件内容为最近一次编译的java源文件内容

你可能感兴趣的:(java基础知识回顾-01-类名、java文件名、编译及运行关系)