static、final关键字及参数加载顺序

static

1、静态变量被所有的对象所共享,在内存中只有一个副本,它当且仅当在类初次加载时会被初始化
2、虽然在静态方法中不能访问非静态成员方法和非静态成员变量,但是在非静态成员方法中是可以访问静态成员方法/变量的

final

1、当用final修饰一个类时,表明这个类不能被继承
2、只有在想明确禁止 该方法在子类中被覆盖的情况下才将方法设置为final的。
注:类的private方法会隐式地被指定为final方法。
3、对于一个final变量,如果是基本数据类型的变量,则其数值一旦在初始化之后便不能更改;如果是引用类型的变量,则在对其初始化之后便不能再让其指向另一个对象。它指向的对象的内容是可变的

静态块、静态变量加载顺序详解

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
package com.qnr.test;

public class TestLoadClass { //1.第一步,准备加载类
public static void main(String[] args) {
new TestLoadClass(); //4.第四步,new一个类,但在new之前要处理匿名代码块
}
static int num = 4; //2.第二步,静态变量和静态代码块的加载顺序由编写先后决定
{
num += 3;
System.out.println("b"); //5.第五步,按照顺序加载匿名代码块,代码块中有打印
}
int a = 5; //6.第六步,按照顺序加载变量
{ // 成员变量第三个
System.out.println("c"); //7.第七步,按照顺序打印c
}
TestLoadClass() { // 类的构造函数,第四个加载
System.out.println("d"); //8.第八步,最后加载构造函数,完成对象的建立
}
static { // 3.第三步,静态块,然后执行静态代码块,因为有输出,故打印a
System.out.println("a");
}
static void run() // 静态方法,调用的时候才加载// 注意看,e没有加载
{
System.out.println("e");
}
}
  1. 第一步,准备加载类
  2. 第二步,静态变量和静态代码块的加载顺序由编写先后决定
  3. 第三步,静态块,然后执行静态代码块,因为有输出,故打印a

  4. 第四步,new一个类,但在new之前要处理匿名代码块

  5. 第五步,按照顺序加载匿名代码块,代码块中有打印
  6. 第六步,按照顺序加载变量
  7. 第七步,按照顺序打印c

  8. 第八步,最后加载构造函数,完成对象的建立

  9. 静态方法,调用的时候才加载// 注意看,e没有加载