JAVA初始化顺序验证

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);
}
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值