本文讲述有关一个类的静态代码块,构造代码块,构造方法的执行流程问题。首先来看一个例子

/**
* Created by lili on 15/10/19.
*/ class Person{
static {
System.out.println("执行Person静态代码块");
} {
System.out.println("执行Person构造代码块");
}
public Person(){
System.out.println("执行Person构造方法");
}
} class Student extends Person{
static {
System.out.println("执行Student静态代码块");
} {
System.out.println("执行Student构造代码块");
}
public Student(){
System.out.println("执行Student构造方法");
}
}
public class ExtendsStaticConstruct {
public static void main(String args[]){
Student student = new Student();
} }

执行结果如下:

执行Person静态代码块
执行Student静态代码块
执行Person构造代码块
执行Person构造方法
执行Student构造代码块
执行Student构造方法 Process finished with exit code 0

说明程序的执行顺序是:

  静态代码块 ---》    构造代码块 ----》  构造方法

执行流程解释:
  new的是Student类,但是Student是继承子Person类,所以在加载Student类时先要加载Person类,而静态的内容是随着类的加载而加载的,所以先打印“执行Person静态代码块”,后执行Student的静态代码块。

  加载完类后,开始走main方法,执行Student构造方法上,即初始化Student,但是Student是继承自Person,必须先初始化Person,所以先调用Person类的空参构造方法进行初始化,但是Person类的构造代码块优先于构造方法执行,所以Person类的构造代码块先执行,构造方法后执行。然后再执行Student类的构造代码块和构造方法。

  这里的执行顺序同子类构造中有一个默认的父类构造super()无关,不是执行到隐藏的super()才开始初始化父类的,类的初始化是分层初始化,即先初始化父类,再初始化子类,初始化每个类的过程中,进行类的初始化工作,先进性成员变量的初始化,成员变量的初始化顺序是:默认初始化,即int为0这种--》显示初始化,例如给int型显示初始化了值--》构造方法初始化,所以是这里执行到了构造方法。

      但是一定要注意,父类初始化选择的构造方法却和子类中super 选择的构造相关,下面代码很好的解释了这点。

/**
* Created by lili on 15/10/19.
*/ class Person{
static {
System.out.println("执行Person静态代码块");
} {
System.out.println("执行Person构造代码块");
} public Person(){
System.out.println("执行Person无参构造方法");
} public Person(String name){
System.out.println("执行Person构造方法"+ name);
}
} class Student extends Person{ static {
System.out.println("执行Student静态代码块");
}
{
System.out.println("执行Student构造代码块");
}
public Student(String name){
super(name);
System.out.println("执行Student构造方法" + name);
}
public Student(){
super();
System.out.println("执行Student无参构造方法");
} }
public class ExtendsStaticConstruct {
public static void main(String args[]){
Student student1 = new Student("lili"); System.out.println("--------------------");
Student student2 = new Student(); } }

结果:

执行Person静态代码块
执行Student静态代码块
执行Person构造代码块
执行Person构造方法lili
执行Student构造代码块
执行Student构造方法lili
--------------------
执行Person构造代码块
执行Person无参构造方法
执行Student构造代码块
执行Student无参构造方法 Process finished with exit code 0

  

【Java基础】继承中的代码块和构造方法的执行顺序探索的更多相关文章

  1. No.4.测试子类继承父类各代码块和构造方法的执行顺序

    Son子类 public class Son extends Parent { static String y ="son的static属性"; public static voi ...

  2. Java(静态)变量、(静态)代码块、构造方法的执行顺序

    Java(静态)变量.(静态)代码块.构造方法的执行顺序 总结 1.父类静态变量和静态代码块(先声明的先执行); 2.子类静态变量和静态代码块(先声明的先执行); 3.父类的变量和代码块(先声明的先执 ...

  3. 静态代码块 2.构造代码块3.构造方法的执行顺序是1>2>3;明白他们是干嘛的就理解了。

    1.静态代码块 2.构造代码块3.构造方法的执行顺序是1>2>3;明白他们是干嘛的就理解了.1.静态代码块:是在类的加载过程的第三步初始化的时候进行的,主要目的是给类变量赋予初始值.2.构 ...

  4. Java子父类间静态代码块、非静态代码块、构造方法的执行顺序

    子类A继承父类B,A a=new A(); 正确的执行顺序是:父类B静态代码块->子类A静态代码块->父类B非静态代码块->父类B构造函数->子类A非静态代码块->子类A ...

  5. 夯实Java基础(八)——代码块

    在Java中代码块指的是使用”{}”括起来的代码称为代码块.代码块一共分为4种:局部代码块,静态代码块,同步代码块,构造代码块. 1.局部代码块 局部代码块就是定义在方法体内部的代码块. public ...

  6. 编写Java程序,观察类启动时静态代码块和main()的执行顺序

    返回本章节 返回作业目录 需求说明: 观察类启动时静态代码块和main()的执行顺序 在Book类中定义静态代码块. 在Book中分别定义一个普通实例方法和静态方法. 在Book类的静态代码块中调用静 ...

  7. 1.7Oob封装 继承 访问修饰符 静态和构造方法的执行顺序

    1:访问修饰符 private     同类中 默认        同类        同包 protect    同类         同包      子类 public     同类        ...

  8. java静态代码块、初始化块和构造方法的执行顺序

    分析:当执行new Child()时,它首先去看父类里面有没有静态代码块,如果有,它先去执行父类里面静态代码块里面的内容,当父类的静态代码块里面的内容执行完毕之后,接着去执行子类(自己这个类)里面的静 ...

  9. Java基础8-多线程;同步代码块

    作业解析 利用白富美接口案例,土豪征婚使用匿名内部类对象实现. interface White{ public void white(); } interface Rich{ public void ...

随机推荐

  1. Razor语法小记

    1.代码块中,<text>标签用来输出,如: @{ <text>sdfsdf</text> } 输出Html: sdfsdf

  2. 洛谷 P1052 过河

    题目描述 在河上有一座独木桥,一只青蛙想沿着独木桥从河的一侧跳到另一侧.在桥上有一些石子,青蛙很讨厌踩在这些石子上.由于桥的长度和青蛙一次跳过的距离都是正整数,我们可以把独木桥上青蛙可能到达的点看成数 ...

  3. jquery , find the event handler,找到jquery中的event handler

    找到 dispatch: function (e) { e = b.event.fix(e); var n, r, i, s, o, u = [], a = d.call(arguments), f ...

  4. 领域驱动设计和实践(转:http://kb.cnblogs.com/page/112298/)

    引言 软件系统面向对象的设计思想可谓历史悠久,20世纪70年代的Smalltalk可以说是面向对象语言的经典,直到今天我们依然将这门语言视为面向对象语言的基础.随着编程语言和技术的发展,各种语言特性层 ...

  5. Automotive Security的一些资料和心得(7):AUTOSAR和Security

    1. 密码模块[1] 密码模块在Services Layer Configurable and common access to 密码子程序 硬件支持密码模块 2. 应用 应用和密码子程序分离 Cry ...

  6. 【产品体验】eyepetizer开眼

    第一次写博客,内心还有点小激动呢~~本人产品新人,学习中,希望大家多多指教!  先来两张开眼的界面图坐镇——         开眼简介: appetizer for eyes 即 eyepetizer ...

  7. Hadoop Datanode节点无法启动(All directories in dfs.data.dir are invalid)

    Hadoop Datanode节点无法启动(All directories in dfs.data.dir are invalid) java.io.IOException: All director ...

  8. range([start], stop[, step]):产生一个序列,默认从0开始

    range([start], stop[, step]):产生一个序列,默认从0开始 >>> l = range(10) >>> l [0, 1, 2, 3, 4, ...

  9. codeforces 390D Inna and Sweet Matrix

    几个小结论: 1.路径长度=i+j-1; 2.最简单的走法是先横走再竖着走或者先竖着走再横着走 #include<cstdio> #include<cstring> using ...

  10. javascript pattern

    bing:javascript pattern baidu:module pattern javascript高级程序设计 姊妹篇:ajax高级程序设计 http://wenku.baidu.com/ ...