【面试题】Java中子类和父类静态代码块、非静态代码块、构造函数的执行顺序总结一览表
在面试的时候,有时候我们会被问到这样的问题:子类A继承父类B,A a = new A();则父类B的构造函数、父类B静态代码块、父类B非静态代码块、子类A构造函数、子类A静态代码块、子类A非静态代码块执行的先后顺序是什么?

我们先根据上面的题目,可以写出如下代码:
父类B代码如下:
public class B {
public B(){
System.out.println("父类B的构造函数");
}
static {
System.out.println("父类B的中的静态代码块");
}
{
System.out.println("父类B的中的非静态代码块 sya()");
}
}
子类A代码如下:
public class A extends B{
public A(){
System.out.println("子类A的构造函数");
}
static {
System.out.println("子类A的中的静态代码块");
}
{
System.out.println("子类A的中的非静态代码块 sya()1");
}
public static void main(String[] args) {
A a = new A();
System.out.println("A!");
A a2 = new A();
System.out.println("启动完成");
}
}
请问控制台打印的顺序是什么?
在回答这个问题前,我们要抓住几个关键的点:
①:静态代码块;②:非静态代码块;③构造函数;④:父类与子类;⑤:类的加载、初始化及实例化
上面这几个就是本题的考点,我们要弄清楚每个考点在类的生命周期中执行的时机。我们来分开介绍:
先来说说的类生命周期:

此图来源于凯哥之前写的文章。
一:静态代码块
静态代码块是被static修饰的代码块。被static修饰的代码块,是属于当前类的信息,是用来初始化类的信息。我们知道类加载过程是先将编译后的class文件加载到内存中,一个类只会被加载到内存中一次。而static修饰的代码块属于类的信息的,所以,静态代码块中的代码有且只有一次被执行。执行的时机:类被加载的时候。
二:非静态代码块
非静态代码块是用来初始化类实例信息的。当我们new关键字创建一个对象的时候,就会被执行,而且每使用一个new关键字创建出一个新对象的时候就会被执行一次的。非静态代码块也可以叫作:非静态初始化代码块的运行时机:会在构造函数执行时候,在构造函数代码执行之前被运行的
三:构造函数
构造函数或者构造方法不用多说了吧,就是用来创建对象的。
我们来看下父类B编译成class文件的时候,非静态代码块和构造函数相关的代码如下:

从代码中,我们可以看出非静态代码块的执行顺序优先于构造函数的。
四:父类与子类
父类与子类的加载时机:父类在子类前面
需要注意的是:子类的构造方法,不管是无参构造还是有参构造,默认都会先去寻找父类的无参构造方法。如果父类中,没有无参构造,那么子类必须使用supper这个关键字来调用父类带参数的构造方法,否则在编译期都不能通过。如下图:

五:类的加载、初始化及实例化
类的加载、初始化及实例化过程,还有类在运行的时候,变量在JVM中怎么分布的,凯哥之前也写过文章详细介绍了。如果想了解更多,可以看看这几篇文章《JVM学习第一篇思考:一个Java代码是怎么运行起来的-上篇》、《JVM学习第二篇思考:一个Java代码是怎么运行起来的-下篇》和《一个Java类在运行时候,变量是怎么在JVM中分布的呢?》

总结:
好了,通过上面分析,我们可以得到以下总结:
1:如果在同一个类中静态代码块、非静态代码块、构造函数的执行顺序如下:
静态代码块→非静态代码块→构造函数
这个过程,我们反编译class文件也可以看到。如下图:

2:父类和子类中静态代码块、非静态代码块、构造函数的执行顺序:
父类中的静态代码块→子类中的静态代码块→父类非静态代码块→父类构造函数→子类非静态代码块→子类构造函数
具体加载如下图:

所以,根据上面的分析,我们可以知道运行的结果:
父类B的中的静态代码块
子类A的中的静态代码块
父类B的中的非静态代码块 sya()
父类B的构造函数
子类A的中的非静态代码块 sya()1
子类A的构造函数
A!
父类B的中的非静态代码块 sya()
父类B的构造函数
子类A的中的非静态代码块 sya()1
子类A的构造函数
启动完成

总之一句话总结:
父类早于子类、静态早于非静态、非静态早于构造函数

【面试题】Java中子类和父类静态代码块、非静态代码块、构造函数的执行顺序总结一览表的更多相关文章
- java中子类继承父类程序执行顺序
java中子类继承父类程序执行顺序 FatherTest.java public class FatherTest { private String name; public FatherTest() ...
- java中子类继承父类程序执行顺序问题
Java中,new一个类的对象,类里面的静态代码块.非静态代码.无参构造方法.有参构造方法.类的一般方法等部分,它们的执行顺序相对来说比较简单,用程序也很容易验证.比如新建一个测试父类. public ...
- 关于JAVA中子类和父类的构造方法
本篇文章总结了一些关于Java构造方法的常见问题. 为什么创建了一个子类对象会调用其父类的构造方法 如下代码示例: package simplejava; class Super { String s ...
- java中子类与父类中隐含的this引用的分析
/* 看一下下面的程序,看是否你的答案和运行的答案是否一致! */ class Parent{ public int x; public Parent p; public Parent(){} pub ...
- Java中子类和父类相关方法的执行顺序
无意中看到下面一个题目,大家一起来看看最后的输出结果是什么.反正我看完之后,用IDE测试后感觉知识点得到巩固了. /** * 函数执行顺序测试 * Created by 萌小Q on 2017/5/1 ...
- Java中子类覆盖父类方法所必须满足的条件
因为太喜欢,所以转来,侵删! 参考自:http://www.it165.net/pro/html/201504/39284.html 一.描述 子类重写(覆盖)父类的方法必须满足的条件:1.父类中的方 ...
- [转]Java中子类调用父类构造方法的问题分析
在Java中,子类的构造过程中,必须调用其父类的构造函数,是因为有继承关系存在时,子类要把父类的内容继承下来,通过什么手段做到的? 答案如下: 当你new一个子类对象的时候,必须首先要new一个 ...
- java中子类继承父类什么?
1.继承public和protected修饰的属性和方法,不管子类和父类是否在同一个包: 2.继承默认权限修饰符修饰的属性和方法,前提是子类和父类在同一个包.
- java中子类继承父类时是否继承构造函数
来源:http://www.cnblogs.com/sunnychuh/archive/2011/09/09/2172131.html --------------------- java继承中对构造 ...
- 关于Java中子类调用父类方法
当一个类继承于另一个类,子类中没有父类的方法时.用子类的对象调用方法时,会首先在子类中查找,如果子类中没有改方法,再到父类中查找. 当一个方法只在父类中定义时,调用该方法时会使用父类中的属性. 如果该 ...
随机推荐
- Linux的访问权限详解
题目 解读访问权限 rw-r--r--分别代表什么东西 r:代表可读 w:可写 e:可执行 方便起见进行拆分 rw- 代表文件所属用户的权限 r-- 代表同组用户的权限 r-- 代表其他用户的权限 同 ...
- Js 中的数组
在js 中,数组就是对象,除了可以使用字面量语法[...]来声明数组外,它和其它对象没有什么区别.当创建一个数组['a', 'b', 'c']时,内部的实现形式如下: { length: 3, ...
- Task异步多线程
不废话,直接贴上要实现的效果和代码... [1]直接使用Lambda表达式是实现多线程: using System; using System.Collections.Generic; using S ...
- Python 潮流周刊#60:Python 的包管理工具真是多啊(摘要)
本周刊由 Python猫 出品,精心筛选国内外的 250+ 信息源,为你挑选最值得分享的文章.教程.开源项目.软件工具.播客和视频.热门话题等内容.愿景:帮助所有读者精进 Python 技术,并增长职 ...
- IDEA之调试或运行的小助手日志插件Grep Console:不同颜色区分,查看日志看方便【工欲善其事必先利其器】
简介 Grep Console是一款方便开发者对idea控制台输出日志进行个性化管理的插件.这个插件还是很用的,在满屏的日志中,迅速找到自己关注的内容,调试程序的绝佳工具. 功能特性 Grep Con ...
- [oeasy]python0098_个人计算机浪潮_IBM5100_微软成立_苹果II_VisCalc
个人计算机浪潮 回忆上次内容 个人电脑(PC) 在爱好者之间疯传 人人都有一台计算机 从attair-8800到apple-1 个人电脑 离普通人 更近了 如果 人人都有 自己的电脑 谁还去 用终端连 ...
- oeasy教您玩转vim - 43 - # 替换模式
替换模式 回忆上节课内容 上次我们学到的最有用的就是c 他和d的区别就是删除之后进入到插入模式 c可以配合motion 可以用ciw来快速删除当前光标所在的单词 可i和a 配合的文字块 w wor ...
- 机器学习:详解迁移学习(Transfer learning)
详解迁移学习 深度学习中,最强大的理念之一就是,有的时候神经网络可以从一个任务中习得知识,并将这些知识应用到另一个独立的任务中.所以例如,也许已经训练好一个神经网络,能够识别像猫这样的对象,然后使用那 ...
- CSP2023
坐标HA 背景 NOIP都打完了,CSP-S都没写游记,所以来补一篇(逃-- 正文 Day 7*-1 考前一周停课集训,被whk老师怒斥不务正业,悲QWQ. Day 0 周五得到年级第一zyx的鼓励, ...
- 数据结构:Deuque
#include <iostream> #include <stdio.h> #include <string> using namespace std; stru ...