300字范文,内容丰富有趣,生活中的好帮手!
300字范文 > java中构造函数-静态代码块-代码块的执行顺序

java中构造函数-静态代码块-代码块的执行顺序

时间:2018-09-23 18:52:52

相关推荐

java中构造函数-静态代码块-代码块的执行顺序

面试题中,经常遇到这种题,我们只要记住一个原则,就不会出错。

三者的执行顺序:静态代码块>代码块>构造函数

package com.lbl.constructor;/*** Created by 李柏霖* /11/20 20:25*/public class Test01 {public Test01() {System.out.println("==== 父 ====");}public Test01(int b) {System.out.println("==== 父 ===="+b);}static {System.out.println("==== 父static ====");}{System.out.println("=== 父代码块 ====");}}class Demo extends Test01 {public Demo() {super();System.out.println("==== 子 ====");}public Demo(int a) {super(a);a=10;System.out.println("==== 子 ===="+a);}{System.out.println("=== 子代码块 ====");}static {System.out.println("==== 子static ====");}public static void main(String[] args) {Demo demo1 = new Demo();Demo demo2 = new Demo(1);}}

执行的结果是什么?

为什么呢?

我们一步一步分解来看。

分解1-父子构造方法

package com.lbl.constructor;/*** Created by 李柏霖* /11/20 20:25*/public class Test01 {public Test01() {System.out.println("==== 父 ====");}}class Demo extends Test01 {public Demo() {System.out.println("==== 子 ====");}public static void main(String[] args) {Demo demo1 = new Demo();}}

这段代码的结果是什么呢?

因为在执行子类的构造方法前会先执行父类的构造方法。

总的来说一句话,每个子类的构造方法中(不管子类构造方法中是否带参数),都会有一个隐藏的super()方法,这个会调用父类的无参构造方法

分解2-static静态方法

package com.lbl.constructor;/*** Created by 李柏霖* /11/20 20:25*/public class Test01 {public Test01() {System.out.println("==== 父 ====");}static {System.out.println("==== 父static ====");}}class Demo extends Test01 {public Demo() {System.out.println("==== 子 ====");}static {System.out.println("==== 子static ====");}public static void main(String[] args) {Demo demo1 = new Demo();}}

这段代码的结果又是什么呢?

静态代码块>代码块>构造函数

答案一眼就知道了。会先执行静态方法,且会先执行父类的静态方法。

分解3-代码块

package com.lbl.constructor;/*** Created by 李柏霖* /11/20 20:25*/public class Test01 {public Test01() {System.out.println("==== 父 ====");}static {System.out.println("==== 父static ====");}{System.out.println("=== 父代码块 ====");}}class Demo extends Test01 {public Demo() {System.out.println("==== 子 ====");}{System.out.println("=== 子代码块 ====");}static {System.out.println("==== 子static ====");}public static void main(String[] args) {Demo demo1 = new Demo();}}

这段代码执行的结果是什么呢?

静态代码块>代码块>构造函数

先执静态代码块,且先执行父类的静态代码块,再执行子类的静态代码块。

再执行父类的代码块,父类的构造方法。

再执行子类的代码块。子类的构造方法。

分解4-带参的构造方法

package com.lbl.constructor;/*** Created by 李柏霖* /11/20 20:25*/public class Test01 {public Test01() {System.out.println("==== 父 ====");}public Test01(int b) {System.out.println("==== 父 ===="+b);}}class Demo extends Test01 {public Demo() {System.out.println("==== 子 ====");}public Demo(int a) {a=10;System.out.println("==== 子 ===="+a);}public static void main(String[] args) {Demo demo2 = new Demo(1);}}

这一套的执行结果是什么呢?

静态代码块>代码块>构造函数

因为new Demo(1);是带参数的,所以会调用子类带参数的构造函数。

但在子类带参数的构造函数中,会有一个隐藏的super()方法,调用父类无参的构造函数。

a的值按顺序,开始是1,后面a=10,改为了10。

最终

package com.lbl.constructor;/*** Created by 李柏霖* /11/20 20:25*/public class Test01 {public Test01() {System.out.println("==== 父 ====");}public Test01(int b) {System.out.println("==== 父 ===="+b);}static {System.out.println("==== 父static ====");}{System.out.println("=== 父代码块 ====");}}class Demo extends Test01 {public Demo() {System.out.println("==== 子 ====");}public Demo(int a) {super(a);a=10;System.out.println("==== 子 ===="+a);}{System.out.println("=== 子代码块 ====");}static {System.out.println("==== 子static ====");}public static void main(String[] args) {Demo demo1 = new Demo();Demo demo2 = new Demo(1);}}

最后我们来分析一下最终版:

静态代码块>代码块>构造函数

Demo demo1 = new Demo();还是上面那一套不变

先执静态代码块,且先执行父类的静态代码块,再执行子类的静态代码块。

再执行父类的代码块,父类的构造方法。

再执行子类的代码块。子类的构造方法。

下面我们来分析:Demo demo2 = new Demo(1);

因为静态代码块只会执行一次,所以这次不会再执行

而是执行父类的代码块,父类的带参构造方法。

最后执行子类的代码块,子类的带参构造方法。

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。