1、JDK 、JRE和JVM 的区别?
- JDK,java development kit java开发工具包,为java程序提供开发和运行环境
- JRE, java runtime environment java运行环境,为java程序提供必须的运行环境
- JVM, java virtual machine , java 虚拟机,用来编译解释java的.class文件生成机器码使程序能够被执行
JDK中包含了JRE和编译java源码所需的javac编译工具,以及java程序调试和分析的工具,而JRE只是提供给了一个运行环境,如果需要编译调试和运行java程序则需要安装JDK,如果只是运行java程序,只需要安装JRE。
一次编译、处处运行?
由于jvm对于不同的系统都做了适配有不同版本的jvm,这样使得编译后的.class文件能够在不同的系统都能够运行。
图解:JDK包含JRE和JVM,JRE包含JVM ,编译生成的.class文件会交给对应的jvm,jvm会调用lib类库进行class文件的解释,将.class文件翻译成机器码,映射到操作系统,最终使java程序能够运行。
2、final的作用
- 修饰类:表示类不可以被继承
- 修饰方法: 表示方法不可以被重写,但可以重载(方法名相同,形参列表不相同)
- 修饰变量:表示变量一旦被赋初值就不能更改
1)final修饰成员变量 (分为类变量和实例成员变量)
- 修饰静态成员变量(类变量,有static修饰的变量):只能在定义时或者静态代码块中赋值
//定义时赋值
final static int a;
static {
//2、在静态代码块中赋值
a = 0;
}
- 修饰实例成员变量(无static修饰的变量):可以在非静态代码块或者定义时赋值
//1、定义时赋值
final int b = 0;
final int c;
{
//2、在非静态代码块中赋值
c = 1;
}
2)final修饰局部变量时可以不赋初值,但在使用时必须给定值。
补充:
静态代码块
属于类中的代码块,它会随着类的创建而自动执行一次,仅在类的初始化之前执行一次,可用于在类的创建之前初始化一些方法。
非静态代码块(构造代码块)
属于对象中的代码块,它会随着对象的创建而执行,并且在构造器执行前执行,只有创建对象才会触发
3)final修饰基本类型和引用类型
- 修饰基本类型,一旦赋初值,值就不能被更改
- 修饰引用类型,对其初始化后不可以更改他的对象地址,但是可以修改他的成员变量的值
//1、定义时赋值
final int b = 0;
final int c;
{
//2、在非静态代码块中赋值
c = 1;
}