1、Java语言是跨平台(跨OS)的,JVM依赖平台,所以JVM是Java程序和操作系统之间的桥梁。
2、JRE:Java运行环境,包括JVM+核心类库等
JDK:Java开发工具包,包含Java的开发工具(编译工具javac.exe、打包工具jar.exe等)+JRE
3、path:可执行文件.exe的路径(jdk的路径),到bin。path中存放的都是系统中应用程序所在的路径(bin目录下存放的都是可执行程序,即 .exe文件)
classpath:类文件 .class所在的目录。JVM到classpath指定的类文件路径找 .class 执行
4、源文件(xxx.java)-->编译器编译(javac.exe)-->类文件(xxx.class)-->运行(java.exe)-->结果
javac:是一个工具,调用jdk中提供的 编译工具/编译程序。此命令启动了一个编译程序,程序的编译内容的名称是.java,编译器对java源文件进行正确性检查(语法检查)。
java:是一个命令,启动JVM。JVM根据classpath到指定位置找 .class文件,将其加载进内存(任何一个应用程序都需要进内存才能运行),并找到主函数执行。
注:如何说明是java命令启动时,JVM才去调用主函数?将main函数去掉,执行javac时不报错,而执行java时报错:找不到main方法
运行环境中包含JVM。只编译不需要JVM,只需要一个编译器将文件编译成 .class即可。
源文件:xxx.java(path中的都是可执行文件,.java文件是不可执行的)
编译:javac xxx.java
执行:java xxx
5、主函数是程序的入口,格式是固定的。可以保证一个类的独立运行,一个类只能有一个主函数。需要独立运行时才需要主函数。主函数被JVM识别并调用。
6、主函数解析:public static void main(String[] args) { }
(1)public:权限必须最大。因为如果权限小,JVM运行该类时不让访问主函数,就运行不了
(2)static:JVM在调用主函数时是不需要对象的,直接用主函数所属类名调用main方法即可
(3)void:主函数没有具体的返回值。有确定的返回对象,返回给调用者,即JVM。但JVM拿着返回值没用,所以不需要返回
(4)main:函数名,不是关键字,是一个被JVM所识别的固定的名字
(5)String[] args:主函数的参数列表,是一个数组类型的参数,而且元素都是字符串类型。用字符串类型是因为字符串类型的数据是最通用的数据(可以将字符串进行其他类型的转换)
注:主函数中唯一可以变化的是形式参数args,只是一个变量名,但一般不变。若写成 public static void main(int x) { },不是入口,最多算是自定义的名称为main的函数(重载)
7、Java是解释型语言,两种核心机制是:
(1)Java虚拟机:一次编译,到处运行(跨平台)
(2)垃圾收集机制:程序的健壮性
8、类编译执行的过程
执行javac命令时,调用编译器将xxx.java文件编译成xxx.class文件。执行java命令时,JVM到classpath下找对应的xxx.class文件。如果不存在对应的xxx.class文件,则找xxx.java文件进行编译(如果xxx.java文件也不存在,则报错);如果存在对应的xxx.class文件,则将其加载进内存。之后,JVM找main函数执行main中的程序