标题:Java中继承的赋值过程
- 1.先加载主类的最上层的父类【假设有多个父类的情况】,执行静态初始化动作
- 再加载下层的父类,同上,直到加载完主类
本例题是:eg:AA,HH,AboutExtends
见输出如下:
AA静态代码块中
HH静态代码块中
AboutExtends静态代码块中
- 2.为此对象以及所有的父类对象分配空间【先父对象,默认创建子对象时,会为父类分配空间】,
- 执行初始化成员变量动作【包括直接赋值,代码块,构造器(父类则看子类调用的是父类的哪个构造器)】,(若不清楚初始化的顺序可以参见blog:Java测试构造器,代码块,变量的初始化先后顺序包括静态的)
AA代码块中
AA
HH代码块中
HH i=666
AboutExtends代码块中
AboutExtends
输出:
AA静态代码块中
HH静态代码块中
AboutExtends静态代码块中
AA代码块中
AA
HH代码块中
HH i=666
AboutExtends代码块中
AboutExtends
完整代码:
/**
* 带有继承的赋值的过程
*
* 1.先加载主类的最上层的父类【假设有多个父类的情况】,执行静态初始化动作
* 再加载下层的父类,同上,直到加载完主类
* 2.为此对象以及所有的父类对象分配空间【先父对象】,
* 执行初始化成员变量动作【包括直接赋值,代码块,构造器(父类则看子类调用的是父类的哪个构造器)】,
* @author dell
*
*/
public class AboutExtends extends HH{
private static int a;
public AboutExtends() {
super(666);
System.out.println("AboutExtends");
}
{
System.out.println("AboutExtends代码块中");
}
static {
System.out.println("AboutExtends静态代码块中");
}
public static void main(String[] args) {
new AboutExtends();//执行类初始化后,为此对象以及所有的父类对象分配空间【先父对象】,执行初始化成员变量动作【包括直接赋值,代码块,构造器(父类则看子类调用的是父类的哪个构造器)】,
// System.out.println(AboutExtends.a);//执行类初始化--》加载主类以及所有的父类【先父类再主类】,还有执行静态初始化动作
}
}
class HH extends AA{
public HH() {
System.out.println("HH");
}
public HH(int i) {
System.out.println("HH i="+i);
}
{
System.out.println("HH代码块中");
}
static {
System.out.println("HH静态代码块中");
}
}
class AA{
public AA() {
System.out.println("AA");
}
{
System.out.println("AA代码块中");
}
static {
System.out.println("AA静态代码块中");
}
}