您的位置:首页 > 其它

坑【2】父类子类以及静态块,方法中的加载顺序

2016-12-12 17:34 411 查看
public class Test {
public static void main(String[] args) {
new Son();
new Father();
}
}

class Father {
static {
System.out.println("父类静态代码块初始化");
}
{
System.out.println("父类代码块初始化");
}
private static String s = print();

public static String print() {
System.out.println("父类静态方法");
return "父类静态成员变量的初始化";
}

public Father() {
System.out.println("父类无参构造函数初始化完成");
show();
}

public void show() {
System.out.println("父类show()方法。。。");
}
}

class Son extends Father {
static {
System.out.println("子类静态代码块初始化");
}
{
System.out.println("子类代码块初始化");
}
private static int i = 1;
private String s = "子类私有成员变量";

public void show() {
System.out.println("子类成员变量初始化完成:s=" + s);
System.out.println("子类show()方法:i=" + i);
}

public Son() {
System.out.println("子类构造函数初始化完成");
show();
}
}

/**
* 颠倒这俩效果不同
* new Son();  new Father();
*
*
父类静态代码块初始化
父类静态方法
子类静态代码块初始化
父类代码块初始化
父类无参构造函数初始化完成
子类成员变量初始化完成:s=null
子类show()方法:i=1
子类代码块初始化
子类构造函数初始化完成
子类成员变量初始化完成:s=子类私有成员变量
子类show()方法:i=1
父类代码块初始化
父类无参构造函数初始化完成
父类show()方法。。。

从结果可以看出类中各成员初始化的顺序是:
1.如果类中存在继承关系(像 Son 继承 Father)  则首先会初始化导出类(Son)的基类(Father),然后再是导出类
2.在基类首先会初始化静态 的东西  静态块>静态变量  而且只初始化一次 (因为静态的东西都是跟着类的加载而加载的)
3.随后就是初始化导出类的静态东西  跟基类的静态初始化一样(同上)
4.非静态代码块
5.初始化基类无参构造器(调用有参就初始化有参构造器)
6.初始化导出类无参构造器(注意:导出类的成员变量和代码块都是是比构造函数的初始化要早。。看输出结果可知)*/
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐