静态代码块
用static声明,jvm加载类的时候执行。仅执行一次
【注意事项】:记住一句话,静态的东西和对象无关
构造代码块
类内直接使用{}。每一次创建对象的时候执行。
执行优先顺序:静态代码块 > 构造代码块 > 构造方法
若在一个类中,含有成员变量,构造代码块,构造方法。
执行流程:成员变量| 构造代码块 > 构造方法
【注意事项】:
1.java编译器编译一个源文件的时候,会把成员变量的声明语句提高至最顶端。
2.成员变量的初始化以及代码块的代码都会移到构造方法中标去执行。
3.成员变量和构造代码块的顺序大部分是按照代码的顺序执行的。构造方法会最后执行。
示例
//比较构造代码块和构造方法的优先级
public class Demo1 {
//成员变量
public int num = 1000;
//构造方法
public Demo1() {
this.num = 3000;
}
//构造代码块
{
this.num = 2000;
}
public static void main(String[] args) {
Demo1 demo1 = new Demo1();
System.out.println(demo1.num);
}
}
运行结果:
3000
构造方法
public Hello() {
}
【注意事项】:
1、对象一创建,就会调用与之对应的构造方法。也就是说,不建立对象,构造方法不执行。
2、对对象进行初始化的。
3、一个对象创建,构造方法只运行一次,再创建一个对象,再运行一次。
构造代码块
{
代码块;
}
【注意事项】:
1、构造代码块是给对象进行初始化的。
2、对象一建立就运行构造代码块,而且优先于构造方法。强调!!!:有对象才能执行构造代码块。
3、类不能调用构造代码块。
静态代码块
static {
代码块;
}
【注意事项】
1、随着类的加载而执行的,并且只执行一次,并且优先于main主函数。具体来讲,静态代码块是由类来调用的。
2、静态代码块是对类进行初始化的,构造代码块是对对象进行初始化的。
3、静态代码中的变量,是一个局部变量,和普通的局部变量没有任何区别。
4、一个类中可以有多个静态代码块。
示例
public class Demo2 {
//成员变量
static int cut = 6;
//静态代码块
static {
cut += 9;
}
public static void main(String[] args) {
System.out.println(cut);
}
//静态代码块
static {
cut /= 3;
}
}
执行结果:
5
java类初始的顺序
对于一个类,静态代码块只要类加载就执行
示例1
public class HelloA {
public HelloA() {
System.out.println("构造方法");
}
{
System.out.println("构造代码块");
}
static {
System.out.println("静态代码块");
}
public static void main(String[] args) {
}
}
运行结果:
静态代码块
示例2
public class HelloA {
public HelloA() {
System.out.println("构造方法");
}
{
System.out.println("构造代码块");
}
static {
System.out.println("静态代码块");
}
public static void main(String[] args) {
HelloA helloA = new HelloA();
}
}
运行结果:
静态代码块
构造代码块
构造方法
示例3
public class HelloA {
public HelloA() {
System.out.println("构造方法");
}
{
System.out.println("构造代码块");
}
static {
System.out.println("静态代码块");
}
public static void main(String[] args) {
HelloA helloA = new HelloA();
HelloA helloA1 = new HelloA();
}
}
运行结果:
静态代码块
构造代码块
构造方法
构造代码块
构造方法
变量和静态变量
1.先去执行静态代码块
2.执行构造代码块
3.执行构造方法
对于静态变量,静态的代码块,变量,代码块,构造方法。他们初始化的顺序:(静态变量,静态代码块)>(变量,代码块)>构造方法
示例
public class InitTest {
//静态变量
public static String staticField = "静态变量";
//变量
public String field = "变量";
//静态代码块
static {
System.out.println(staticField);
System.out.println("静态代码块");
}
//代码块
{
System.out.println(field);
System.out.println("代码块");
}
public InitTest() {
System.out.println("构造方法");
}
public static void main(String[] args) {
new InitTest();
}
}
运行结果:
静态变量
静态代码块
变量
代码块
构造方法
继承关系的类
示例
class HelloB {
public HelloB() {
System.out.println("B的构造方法");
}
{
System.out.println("B的构造代码块");
}
static {
System.out.println("B的静态代码块");
}
}
class HelloC extends HelloB {
public HelloC() {
System.out.println("C的构造方法");
}
{
System.out.println("C的构造代码块");
}
static {
System.out.println("C的静态代码块");
}
public static void main(String[] args) {
HelloC helloC = new HelloC();
System.out.println("**********");
HelloC helloC1 = new HelloC();
}
}
运行结果:
B的静态代码块
C的静态代码块
B的构造代码块
B的构造方法
C的构造代码块
C的构造方法
**********
B的构造代码块
B的构造方法
C的构造代码块
C的构造方法
当涉及到继承的时候,顺序如下:
1.执行父类的静态代码块。并初始化父类静态的成员变量
2.执行子类的静态代码块。并初始化子类静态的成员变量
3.执行父类的构造代码块,执行父类的构造方法,并初始化父类的普通的成员变量
4执行子类的构造代码块,执行子类的构造方法,并初始化子类的成员变量