Java 静态语句块、语句块、构造函数执行顺序
2018-01-19 16:53
323 查看
先执行静态代码块内容,接着执行父类非静态代码块和构造方法,然后执行子类非静态代码块和构造方法。而且子类的构造方法,不管这个构造方法带不带参数,默认的它都会先去寻找父类的不带参数的构造方法。如果父类没有不带参数的构造方法,那么子类必须用supper关键子来调用父类带参数的构造方法,否则编译不能通过。
下面举几个实例
实例1:
父类HelloA
子类HelloB继承HelloA
运行结果为:
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/01/2a77ba1d46f9a33564184d270d219e62)
从结果可以看出,首先运行的是父类的static修饰的静态代码块,然后再运行子类静态代码块,接着开始运行main方法。new HelloB()执行该语句的时候首先调用的是父类的构造函数,然后再执行自己的构造函数,最后再执行new HelloA()只调用HelloA自身的构造函数。
实例2:
父类HelloA
子类HelloB
运行结果
![](https://oscdn.geek-share.com/Uploads/Images/Content/201910/01/aa9707270a65c442b3b3d203eb56fc29)
因为这次启动函数Main方法是在父类HelloA里面,所以只会先执行A的静态语句,然后再执行new HelloB()的时候首先执行B类的静态语句,再实例化B
实例3:
父类HelloA
子类HelloB
启动类HelloC
运行结果
下面举几个实例
实例1:
父类HelloA
public class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println("I'm A class"); } static { System.out.println("static A"); } }
子类HelloB继承HelloA
public class HelloB extends HelloA { public HelloB() { System.out.println("HelloB"); } { System.out.println("I'm B class"); } static { System.out.println("static B"); } public static void main(String[] args) { System.out.println("-------main start-------"); new HelloB(); System.out.println("-------HelloA() start-------"); new HelloA(); System.out.println("-------main end-------"); } }
运行结果为:
从结果可以看出,首先运行的是父类的static修饰的静态代码块,然后再运行子类静态代码块,接着开始运行main方法。new HelloB()执行该语句的时候首先调用的是父类的构造函数,然后再执行自己的构造函数,最后再执行new HelloA()只调用HelloA自身的构造函数。
实例2:
父类HelloA
package com.person.test; public class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println("I'm A class"); } static { System.out.println("static A"); } public static void main(String[] args) { System.out.println("-------main start-------"); new HelloB(); System.out.println("-------HelloA() start-------"); new HelloA(); System.out.println("-------main end-------"); } }
子类HelloB
package com.person.test; public class HelloB extends HelloA { public HelloB() { System.out.println("HelloB"); } { System.out.println("I'm B class"); } static { System.out.println("static B"); } }
运行结果
因为这次启动函数Main方法是在父类HelloA里面,所以只会先执行A的静态语句,然后再执行new HelloB()的时候首先执行B类的静态语句,再实例化B
实例3:
父类HelloA
package com.person.test;
public class HelloA { public HelloA() { System.out.println("HelloA"); } { System.out.println("I'm A class"); } static { System.out.println("static A"); } }
子类HelloB
package com.person.test; public class HelloB extends HelloA { public HelloB() { System.out.println("HelloB"); } { System.out.println("I'm B class"); } static { System.out.println("static B"); } }
启动类HelloC
package com.person.test; public class HelloC { public static void main(String[] args) { System.out.println("-------main start-------"); new HelloB(); System.out.println("-------HelloA() start-------"); new HelloA(); System.out.println("-------main end-------"); } }
运行结果
相关文章推荐
- Java 静态语句块、语句块、构造函数执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- java静态语句块、构造语句块以及构造函数的执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- 一道Java笔试题:静态语句块、构造语句块和构造函数的执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- Java类中静态属性、静态语句块、属性、初始化语句块、构造函数之间的执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- 一道Java笔试题:静态语句块、构造语句块和构造函数的执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- Java 静态语句块、语句块、构造函数执行顺序
- Java 静态语句块、语句块、构造函数执行顺序