java的静态代码块、静态方法、构造方法执行过程
1、静态代码块:在方法区类加载的时候执行;如果一个类需要在加载的时候执行一段代码,可以在静态块中写入逻辑。代码块是自动执行的
2、构造方法:在对象实例化的时候执行。
3、静态方法:在类进行方法调用的时候执行。代码是被动调用执行的
它们在代码中具体的执行过程如下:
对象的初始化顺序:首先执行父类静态的内容,父类静态的内容执行完毕后,接着去执行子类的静态的内容,当子类的静态内容执行完毕之后,再去看父类有没有非静态代码块,如果有就执行父类的非静态代码块,父类的非静态代码块执行完毕,接着执行父类的构造方法;父类的构造方法执行完毕之后,它接着去看子类有没有非静态代码块,如果有就执行子类的非静态代码块。子类的非静态代码块执行完毕再去执行子类的构造方法。总之一句话,静态代码块内容先执行,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。
注意:子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
当一个类中既有静态代码块,又有静态方法,构造方法的时候;例如Test2
public class Test2 { static { System.out.println("t2的静态代码块运行"); } Test2(){ System.out.println("t2的构造方法运行"); } public static void method() { System.out.println("t2的静态方法执行了"); } }
1. 下面写一个测试类,执行Test2.method方法,控制台会输出什么了
public class StaticMethod { public static void main(String[] args) { Test2.method(); } }
控制台输出如下
t2的静态代码块运行
t2的静态方法执行了
2. 再写一个测试,执行Test2的构造方法,查看输出
public class StaticMethod { public static void main(String[] args) { Test2 test2 = new Test2(); } }
控制台输出如下:
t2的静态代码块运行
t2的构造方法运行
上述为一个类,当有两个类,一个类继承了另外一个类的时候,而且两个类都有上述方法的时候,会出现什么情况了 ???
下面写一个Test3继承Test2
public class Test3 extends Test2 { static { System.out.println("t3-----------静态代码的块运行"); } Test3(){ System.out.println("t3----------构造方法运行"); } public static void method() { System.out.println("t3--------静态方法执行了"); } }
1. 下面写一个测试类,执行Test3.method方法,控制台会输出什么了
public class StaticMethod { public static void main(String[] args) { Test3.method(); } }
控制台输出如下:
t2的静态代码块运行 t3-----------静态代码的块运行 t3--------静态方法执行了
表明:在子类调用静态方法的时候,会先在方法区中加载父类,然后加载子类,最后执行子类的静态方法
2. 下面写一个测试类,执行执行Test3构造方法,控制台会输出什么了
public class StaticMethod { public static void main(String[] args) { Test3 test3 = new Test3(); } }
控制台输出如下:
t2的静态代码块运行 t3-----------静态代码的块运行 t2的构造方法运行 t3----------构造方法运行
发现,在子类进行实例化的时候,同样会现在方法区中完成类的加载过程;然后再调用子类的构造的方法,在调用子类的构造方法的时候,会隐士的调用父类的构造方法
最后补充:如果类中存在非静态的代码块,这个非静态的代码块会在对象初始化的触发执行,即构造方法运行之前运行,而且每一次初始化的时候都会运行一次;
如果只是执行了类的静态方法,不会触发类的非静态代码块。静态代码块在类加载的时候执行,而且只会执行一次

浙公网安备 33010602011771号