学习java的一点心得(三)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/u012668018/article/details/50956286

Java的程序源码存放在后缀名为.java的文件中,但是我们知道源码是无法直接被机器识别并执行的,源码是给人读的,是一堆英文字母;而机器能理解的是0和1。所以源码必须经过编译生成二进制文件才能被机器执行。

和C语言不同的,C生成的二进制文件可以直接交给操作系统执行;而class文件则只能交给jvm执行,jvm跟操作系统交互并最终执行代码。这相当于在代码和操作系统之间构建了一个中间层,这个中间层就是jvm,而jvm是java能跨平台的根本原因。C语言编写的程序为什么不能跨平台呢?因为不同的平台定义了不同的指令,指令就是二进制代码;所以C语言要为不同的平台生成不同的二进制代码,这就是不能跨平台——编译后的二进制代码在各个平台无法通用、兼容。对比Java,它生成的二进制代码在哪个平台都是一样的,只要这个平台安装了jvm,代码就能运行。显然,能做到这一点是因为jvm在各个平台是不一样的,由jvm去兼容复杂的平台,屏蔽操作系统底层的细节。这样java的二进制代码就不用去关心自己在哪个平台,能不能运行了。


下面从命令行的角度谈一谈源码和二进制文件。java的二进制代码存放在后缀为.class的文件中,它是.java文件编译后生成的。当然,java软件产品交付的时候给的是class文件,肯定不能给源码,这都是商业秘密、劳动成果、知识产权。


Java的所有代码都封装在类中,所以源文件中就是一个个的Class,通常情况下,是一个Class。

java文件是所谓的编译单元,class文件是运行单元。如果一个编译单元内定义了多个class,那么编译后就会生成多个class文件。如下,在App.java定义了两个class:

class App0 {}

class App1{}
编译后:

javac App.java
ls
App.java            App0.class          App1.class


需要注意的是, App.java能通过编译是有前提的,那就是其中定义的两个类都没有用public修饰。大家知道,外部类(相对于内部类而言)只有两种访问修饰符,就是public和default,default就是啥都没有,比如上文中的两个类。 如果要使用public,事情就会变得麻烦许多。

首先一点就是,文件名和类名有了绑定。本来,在没有类被public修饰的情况下,java文件名随便起,就比如上面的情况。但是如果源文件中有一个类被public修饰了,那么文件名必须和这个类名一致,否则编译器会报错。仍以App.java为例:

public class App0 {}

class App1{}

javac App.java
App.java:1: 错误: 类App0是公共的, 应在名为 App0.java 的文件中声明
public class App0 {
       ^
1 个错误


然后,如果源文件中有多个类都被public修饰了,那么文件名该跟哪个保持一致呢?放心,无论取哪个编译器根本不会让你通过编译的:

public class App {}

public class App1{}
javac App.java
App.java:3: 错误: 类App1是公共的, 应在名为 App1.java 的文件中声明
public class App1{}
       ^
1 个错误

综上,一个java文件中最多只能有一个类被public修饰,如果存在其它的类,这些类的访问权限只能是default;如果有一个类被public修饰了,那么文件名必须跟这个类名保持一致。

猜你喜欢

转载自blog.csdn.net/u012668018/article/details/50956286
今日推荐