final和static关键字辨析
final关键字
final关键字被用于修饰 变量,方法和类
final修饰的变量若为基本数据类型,值不可改变,如为引用数据类型,则引用指向不可改变。
当final修饰一个类时,final类中所有的成员方法都会被隐式的指定为final类型
static关键字
调用格式:
- 类名.静态变量名
- 类名.静态方法名()
修饰成员变量和成员方法
被static修饰的成员变量和方法属于类,被所有的此类的对象所共享,不属于某一个具体的对象和方法。
正因为如此,static所修饰的内容需要存储在共享的区域中,既方法区中(Java虚拟机把方法区描述为堆的一个逻辑部分,但他有一个别名叫Non-heap,目的是将方法区和堆区分开)。
静态代码块
静态代码块定义在类中,静态代码块在非静态代码块之前执行(类的初始化顺序:静态代码块|静态变量 --》 非静态代码块|非静态成员变量 --》 构造方法)
静态代码块可以在静态成员变量定义之前为其赋值。
public class Test {
static {
a =10;
}
static int a = 11;
public static void main(String[] args){
System.out.println(a);
}
}
这段段代码是符合规范的。运行结果为:11 因为在静态代码块执行结束后又进行了一次赋值操作。
static{}静态代码块与{}非静态代码块(构造代码块)
-
相同点: 都是在JVM加载类时且在构造方法执行之前执行,在类中都可以定义多个,定义多个时按定义的顺序执行,一般在代码块中对一些static变量进行赋值。
-
不同点: 静态代码块在非静态代码块之前执行(静态代码块—非静态代码块—构造方法)。静态代码块只在第一次new执行一次,之后不再执行,而非静态代码块在每new一次就执行一次。 非静态代码块可在普通方法中定义(不过作用不大);而静态代码块不行。
-
一般情况下,如果有些代码比如一些项目最常用的变量或对象必须在项目启动的时候就执行的时候,需要使用静态代码块,这种代码是主动执行的。如果我们想要设计不需要创建对象就可以调用类中的方法,例如:Arrays类,Character类,String类等,就需要使用静态方法, 两者的区别是 静态代码块是自动执行的而静态方法是被调用的时候才执行的.
public class Test {
static {
System.out.println("静态代码块执行了");
}
{
System.out.println("构造代码块执行了");
}
public Test(){
System.out.println("构造方法执行了");
}
public static void main(String[] args){
Test a = new t();
Test b = new t();
}
}
运行结果: