[置顶] Java中静态代码块、非静态代码块、构造方法三者的执行顺序

时间:2021-07-25 16:07:01

1、静态代码块是在类加载时自动执行的非静态代码块在创建对象自动执行的代码,不创建对象不执行该类的非静态代码块。 顺序: 静态代码块--》非静态代码块--》类构造方法。 

(光是文字讲解会不会太抽象了,让我们来用代码演示一下,这样更直观些吧!)

代码演示如下:

/**
 * 创建一个父类 A
 */

public class A {
static {   // 在父类 A 里创建一个静态的代码块
System.out.println("我是父类静态代码块");
}
                                                                                                                 
{   //在父类 A 里创建一个非静态的代码块                            
注意了:   static{ .... }  和  { .... }  和   public  A() { ..... } ,在类  A 源码里面的位置可以
System.out.println("我是父类非静态代码块");                            随便放,不影响代码执行后的结果顺序,不一定要按照我的来放。
}
 
public A(){   //在父类 A 里创建一个构造方法
System.out.println("我是父类的构造方法");
}
}


/**
 * 创建一个子类 B 并继承父类 A
 */
public class B extends A {
static {   // 在子类 B 里创建一个静态的代码块
System.out.println("我是子类静态代码块");
}
                                                                                        注意了:    static{ .... }  和  { .... }  和   public  B() { ..... } ,在类  B 源码里面的位置可以
{   //在子类 B 里创建一个非静态的代码块                                                   随便放,不影响代码执行后的结果顺序,不一定要按照我的来放。
System.out.println("我是子类非静态代码块");
}
 
public B(){   //在子类 B 里创建一个构造方法
System.out.println("我是子类的构造方法");
}
}


/**
 * 主程序 Test
 */
public class Test {
public static void main(String[] args) {
B obj2 = new B();  //创建一个子类的对象 B
}
}


执行后的结果如下: 

我是父类静态代码块              
我是子类静态代码块              
我是父类非静态代码块              执行顺序总结:父类静态代码块 ——》 子类静态代码块  —— 》 父类非静态代码块 —— 》 父类构造方法 —— 》 
我是父类的构造方法                                          子类非静态代码块 —— 》 子类构造方法
我是子类非静态代码块
我是子类的构造方法


执行结果 2:
如果没有存在继承关系,只是单单的创建一个  A obj1 = new A ( ) ;   对象,执行结果如下:
我是父类静态代码块
我是父类非静态代码块         执行顺序总结:父类静态代码块  —— 》 父类非静态代码块  —— 》  父类构造方法
我是父类的构造方法

静态代码块在类被加载时执行,当静态代码块有多个时,执行顺序依照静态代码块出现的先后顺序。(当然类只加载一次,所以静态代码块在程序的生命周期中也只执行一次。)

非静态代码块只有在创建对象时执行(不必创建引用变量),且在构造方法前执行。

2、在静态方法里面只能直接调用同类中其他的静态成员(包括变量和方法),而不能直接访问类中的非静态成员。因为对于非静态的方法和变量,需要先创建类的实例对象后方可使用,而静态方法在使用前不用创建任何对象。 
3、如果某些代码必须要在项目启动时候就执行的时候,我们可以采用静态代码块,这种代码是主动执行的;需要在项目启动的时候就初始化,在不创建对象的情况下,其他程序来调用的时候,需要使用静态方法,此时代码是被动执行的。 
区别:静态代码块是自动执行的; 
静态方法是被调用的时候才执行的; 

作用:静态代码块可以用来初始化一些项目最常用的变量和对象;静态方法可以用作不创建对象也可以能需要执行的代码。


对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法