关于继承关系中各代码块加载顺序的疑问

NoFun的Exception 2017-04-17 03:31:43
对于这个加载顺序一直不是很清楚,看了smile4lee大神的【深入理解JVM】:Java类继承关系中的初始化顺序文章后明白了很多,但是有个地方还是有一些疑问,代码在下面,可以看到加载完成父类的非静态代码后加载父类的构造函数,但是我记得书上写的在子类构造函数的第一行是隐藏了super()父类的构造函数吗?照我的理解应该是父类构造函数加载后就应该加载的是子类的构造函数呀,就像下面一样:

class Son extends Father{
Son(){
super();
System.out.println("Son构造函数加载");
}
}


但是为什么父类构造函数加载完了之后是加载子类的非静态代码,然后才是子类的构造函数呢?求大神解疑


package com.j2se;

public class InitialOrderWithExtend {
public static void main(String[] args) {
Father ts = new Son();
}
}

class Father {
{
System.out.println("父类 非静态块 1 执行");
}
static {
System.out.println("父类 static块 1 执行");
}
static Sample staticSam1 = new Sample("父类 静态成员 staticSam1 初始化");
Sample sam1 = new Sample("父类 普通成员 sam1 初始化");
static Sample staticSam2 = new Sample("父类 静态成员 staticSam2 初始化");
static {
System.out.println("父类 static块 2 执行");
}

Father() {
System.out.println("父类 默认构造函数被调用");
}

Sample sam2 = new Sample("父类 普通成员 sam2 初始化");

{
System.out.println("父类 非静态块 2 执行");
}

}

class Son extends Father {
{
System.out.println("子类 非静态块 1 执行");
}

static Sample staticSamSub1 = new Sample("子类 静态成员 staticSamSub1 初始化");

Son() {
System.out.println("子类 默认构造函数被调用");
}

Sample sam1 = new Sample("子类 普通成员 sam1 初始化");
static Sample staticSamSub2 = new Sample("子类 静态成员 staticSamSub2 初始化");

static {
System.out.println("子类 static块1 执行");
}

Sample sam2 = new Sample("子类 普通成员 sam2 初始化");

{
System.out.println("子类 非静态块 2 执行");
}

static {
System.out.println("子类 static块2 执行");
}
}

class Sample {
Sample(String s) {
System.out.println(s);
}

Sample() {
System.out.println("Sample默认构造函数被调用");
}
}


父类 static块 1 执行
父类 静态成员 staticSam1 初始化
父类 静态成员 staticSam2 初始化
父类 static块 2 执行
子类 静态成员 staticSamSub1 初始化
子类 静态成员 staticSamSub2 初始化
子类 static块1 执行
子类 static块2 执行
父类 非静态块 1 执行
父类 普通成员 sam1 初始化
父类 普通成员 sam2 初始化
父类 非静态块 2 执行
父类 默认构造函数被调用
子类 非静态块 1 执行
子类 普通成员 sam1 初始化
子类 普通成员 sam2 初始化
子类 非静态块 2 执行
子类 默认构造函数被调用
...全文
229 4 打赏 收藏 举报
写回复
用AI写文章
4 条回复
切换为时间正序
请发表友善的回复…
发表回复
天涯共明月 2017-04-17
  • 打赏
  • 举报
回复
加载顺序: 静态块 ---- 静态方法 ---------- 构造方法 ----------普通方法
lxyscls 2017-04-17
  • 打赏
  • 举报
回复
引用
可以看到加载完成父类的非静态代码后加载父类的构造函数
我觉得您已经回答了自己的问题了,父类子类一个样 父类{} -> 父类<init> ->子类{} ->子类<init> 另外,我觉得这个不是加载过程,而是一个执行过程
NoFun的Exception 2017-04-17
  • 打赏
  • 举报
回复
引用 1 楼 lxyscls 的回复:
引用
可以看到加载完成父类的非静态代码后加载父类的构造函数
我觉得您已经回答了自己的问题了,父类子类一个样 父类{} -> 父类<init> ->子类{} ->子类<init> 另外,我觉得这个不是加载过程,而是一个执行过程
最近看书看得有点头晕了,似乎是我把类的加载和构造对象搞混了,
lxyscls 2017-04-17
  • 打赏
  • 举报
回复
引用 2 楼 mybook201314 的回复:
加载顺序: 静态块 ---- 静态方法 ---------- 构造方法 ----------普通方法
static方法,不调用,还有人帮你调用了? 构造函数,不new对象,还有人帮你调用了?

62,620

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧