Java应用程序运行机制
java是编译型和解释型混合的语言。由java源文件编译成字节码文件,再解释成机器码指令。
Java虚拟机(JVM)
所有*.java的源代码程序最终都要经过编译才能使用,但编译后的程序不是绑定在某一具体系统上的程序,而是一种通用的程序,而这种通用性的程序就是JVM所能识别的代码程序。
所有的程序并不是直接运行在操作系统上,而是通过JVM执行,执行速度肯定会比直接在操作系统上执行慢。但是由于硬件技术的发展,现在这已经不是问题,但是依然会存在有JVM调优问题。
JDK和JRE
- jdk:java开发工具包
- jre:java运行时环境,只提供程序的解释功能,不提供程序的开发功能。jdk默认包含了jre。
jdk 11及以后的版本安装时不会弹出jre安装选项,需要在安装完jdk以后cd到jdk的目录运行以下命令即可在jdk目录下生产jre目录:
binjlink.exe --module-path jmods --add-modules java.desktop --output jre
编写第一个java程序
public class Hello {
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
类
-
在java中最基本的单元是类,所以的程序都必须封装在类中执行。基本格式:[public] class 类名 {}
-
public class 类名 {}:类名必须与文件名一致,否则会报错。一个java文件里只能定义一个public class。
(base) PS C:UsersPeng WeiiCloudDriveMyFileJava学习_阿里云大学> javac Hello.java
Hello.java:1: 错误: 类 HelloWorld 是公共的, 应在名为 HelloWorld.java 的文件中声明
public class HelloWorld {
^
1 个错误
- class 类名 {}:类名可以与文件名不一致,但*.java编译后的*.class文件的文件名会与类名一致,而不是和*.java的文件名一致,解释执行的时候也应解释*.class的文件名。一个java文件里可以定义多个class,并且编译后每个class类都会生成一个*.class文件。
项目开发时很少会出现一个*.java文件里面定义多个class的情况,所以一个java文件里定义一个public class就够了。
下面的Hello.java文件编译后的文件是HelloWorld.class而不是Hello.class
// Hello.java
class HelloWorld {
public static void main(String args[]) {
System.out.println("Hello World!");
}
}
- java有明确的命名要求,类名每个单词首字母要大写。
主方法
主方法是所以程序执行的起点,并且一定要定义在类当中。主方法所在的类叫主类,所有主类都用public class定义。
屏幕打印(系统输出)
- 输出之后追加换行:System.out.println()
- 输出之后不追加换行:System.out.print()
jshell
java的交互式编程环境,只需要编写核心代码,而不用写很多结果化的代码,可用于验证程序等。
在jshell.txt中写入核心代码:
System.out.println("Hello jshell!");
System.out.println("Hello World!");
使用jshell可直接运行:
CLASSPATH
我们在运行java字节码文件时,jvm默认只找当前目录下的字节码文件,通过SET CLASSPATH=路径
可以解释运行其他目录下的字节码文件,但是并不推荐这么做。
jvm默认只寻找当前目录下的字节码文件是因为默认的CLASSPATH=.
,在我们安装了其它和java相关的程序软件后CLASSPATH的值可能会被更改,可以在系统变量中设置CLASSPATH的值来避免这种情况发生。
面试问题:PATH和CLASSPATH的区别?
- PATH:操作系统提供的路径配置,定义所有可执行程序的路径。
- CLASSPATH:是有jre提供的,用于在定义java程序解释时类加载的路径,默认为只在当前目录加载,可通过SET CLASSPATH=路径 来设置。jvm → CLASSPATH定义的路径 → 加载字节码文件。