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);
}
}
{
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);
}
}