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

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

package com.lbl.constructor;/*** Created by 李柏霖* 2020/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 李柏霖* 2020/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 李柏霖* 2020/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 李柏霖* 2020/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 李柏霖* 2020/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 李柏霖* 2020/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);

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

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

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

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

  1. Java中构造函数,静态代码块,构造代码块的执行顺序

    静态代码块:用static声明,jvm加载类的时候执行,只执行一次. 构造代码块:由{}定义,每一次创建对象的时候执行. 构造函数:对象一建立就调用相应的构造函数. 静态代码块 1.它是随着类的加载而 ...

  2. java 中的静态变量,静态代码块,动态代码块,构造方法执行顺序的深入探究

    要想完全弄懂这个执行顺序,需要我们先了解几个概念. 首先是类加载与对象的构造,类加载就是在第一次调用这个类的时候jvm虚拟机会通过类加载器在一个叫做方法区的逻辑内存中将所要用到的类的信息存放在里边,其 ...

  3. 构造代码块、静态代码块、构造方法的执行顺序

    构造代码块.静态代码块.构造方法的执行顺序 牛客网上的一道题目: 通过查询,我写的这道题的解题步骤: package niukewang;/*** @author jxd* @date 2021/8/ ...

  4. java中怎么实现指数幂,java中幂指数值的运算代码解析

    说到幂指数的运算我们就会用到Math.pow(doublea,doubleb),返回的结果是a的b次方. 在Java中,当我们计算2的n次方时,可以直接用Math.pow来计算.非常方便. 但是,已知 ...

  5. java怎么计算幂函数,java中幂指数值的运算代码解析

    说到幂指数的运算我们就会用到Math.pow(doublea,doubleb),返回的结果是a的b次方. 在Java中,当我们计算2的n次方时,可以直接用Math.pow来计算.非常方便. 但是,已知 ...

  6. java中的静态是什么?怎么用?

    Java属于入门容易,天花板却极高的编程语言.java中的静态是什么?对于java工程师来说技术的不断发展,需要不断学习java进阶知识.为了帮助大家巩固基础,本文解答了java中的静态是什么?怎么用 ...

  7. java 静态变量方法,java中的静态变量和静态方法

    java中的静态变量和静态方法 发布时间:2020-06-25 20:15:28 来源:亿速云 阅读:100 作者:Leah 今天就跟大家聊聊有关java中的静态变量和静态方法,可能很多人都不太了解, ...

  8. 第32节:Java中-构造函数,静态方法,继承,封装,多态,包

    构造函数实例 class Cat{// 设置私有的属性 name private String name;// 设置name的方法public void setName(String Name) {t ...

  9. java中的静态、动态代理模式以及Spring中的CgLib动态代理解读(面试必问)

    java中的静态.动态代理模式以及Spring中的CgLib动态代理解读(面试必问) 静态代理 动态代理 CgLib动态代理     基础知: 反射知识 代理(Proxy)是一种设计模式,提供了对目标 ...

最新文章

  1. Win8 Metro(C#)数字图像处理--2.52图像K均值聚类
  2. LeetCode 21. Merge Two Sorted Lists
  3. [转]vb socket通信(TCP/UDP)一对一、多对一
  4. JS基础_break和continue
  5. Linux_基础_磁盘管理
  6. 深入理解计算机系统第四版_深入理解计算机系统第三版2.4节中文版的一处翻译问题及英文版可能的一处错误...
  7. 基于R16标准的5G电力高精度授时解决方案PTP授时方案
  8. 笔记本电脑把BlackBerry当modem上网
  9. 神秘病毒现形 网购当心黑客“点杀”
  10. From Nand to Tetris Week2 2021 超详细笔记
  11. 施工员报考建筑八大员报考提高工程建筑施工人员安全生产意识
  12. 岛屿的最大面积(Java)
  13. ps基础知识学习总结
  14. 最有效的穴位按摩减肥法
  15. Executors-四种创建线程的手段
  16. 【STM32】HAL库 ——DAC
  17. Python-冒泡排序法
  18. JVM调优:卡表(CardTable)简介
  19. python翻译成中文_Python调用有道智云文本翻译API接口实现“智能”伪原创
  20. 音频知识点(12)- P.563 工具编译及使用教程

热门文章

  1. 给测试小姐姐的第三封信 | ORACLE存储过程知识分享和测试说明
  2. 对鸡你太美的字符画绘制
  3. ICML 2023截稿时间
  4. Unit3D打包android时出错 CommandInvokationFailure: Unable to list target platforms. Please make sure the a
  5. c语言 最长单词,c语言求最长公共单词
  6. pygal画世界地图
  7. 天黑请闭眼 杀人游戏 规则
  8. Java ZIP压缩 ZipArchiveEntry实现ZIP高效、Java多线程压缩、可控CPU使用率 Apache commons-compress
  9. 我们不一样!告诉你百度是如何做智能流量异常检测的
  10. 上市十天高管大换血 甘李药业有隐疾?