您的位置:首页 > 编程语言 > Java开发

JAVA初始化顺序验证

2016-02-17 17:00 267 查看
class InitDemo 

{
public static void main(String[] args) 
{
//System.out.println(ABC.ID);
//new ABC("xiaowang");
new EFG("xiaoli",20);

/* 输出结果:
D:\EditPlusJava>java InitDemo
ABC静态代码块static{}numABC
EFG静态代码块static{}numEFG
ABC非静态代码块{}abc
ABC构造函数xiaoli
EFG非静态代码块{}efg
EFG构造函数xiaoli20

//测试静态语句块,和静态赋值语句是同等的权重,所以必须让静态赋值语句放到语句块的前面。

否则就会报下面的错误:

//D:\EditPlusJava>javac InitDemo.java

//InitDemo.java:32: 错误: 非法前向引用

//                System.out.println("ABC静态代码块static{}"+ID);

通过执行顺序可以看到:

先执行父类的静态语句,静态代码块;然后是子类的静态语句块静态代码块。 --》初始化2个类。

然后第二步,执行对象的初始化;首先执行父类的非静态赋值语句,和非静态代码块;然后执行父类的构造函数;然后执行子类的非静态赋值语句,非静态
代码块,然后再执行子类的构造函数。

//为什么构建子类对象一定要构建父类对象,是因为子类要继承父类对象的属性;这些属性,必须在生产对象之前初始化。调用构造函数之前默认会初始化;
所以子类继承过来后,就可以直接调用已经被初始化后的值。
*/
}

}

class ABC

{

String name="abc";

public static String ID="numABC";

static {
System.out.println("ABC静态代码块static{}"+ID);
}

ABC(String name){
this.name=name;
System.out.println("ABC构造函数"+name);
}

{
System.out.println("ABC非静态代码块{}"+name);
}

}

class EFG extends ABC

{
String name1="efg";
int age=20;

{
System.out.println("EFG非静态代码块{}"+name1);
}

public static String ID1="numEFG";
static {
System.out.println("EFG静态代码块static{}"+ID1);
}

EFG(String name1,int age){
super(name1);
this.age=age;
System.out.println("EFG构造函数"+name+age);
}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息