非静态成员变量显示初始化是在super( )后构造代码块前;并非默认初始化后就立刻显示初始化;请看下列代码:
class Demo {
public static void main(String[] args) {
new Zi( );
}
}
class Fu {
String name = "Fu";
int i = 1;
{
System.out.println("----------------------------" );
System.out.println("Fu构造代码块:"+ name+"-"+ i );
i = 11;
fun( );
}
public Fu( ) {
System.out.println("----------------------------" );
System.out.println("Fu构造方法:"+ name+"-"+ i);
i = 111;
fun( );
}
public void fun( ) {
System.out.println("Fu的fun:"+name+"-"+i);
i = 1111;
}
}
class Zi extends Fu {
String name = "Zi";
int i = 2;
{
System.out.println("----------------------------" );
System.out.println("Zi构造代码块:"+ name+"-"+ i );
i = 22;
fun( );
}
public Zi( ) {
super( );
System.out.println("----------------------------" );
System.out.println("Zi构造方法:"+ name+"-"+ i );
i = 222;
}
public void fun( ) {
System.out.println("Zi的fun:"+name+"-"+i);
i = 2222;
}
}
/*
运行结构
----------------------------
Fu构造代码块:Fu-1 <--可以看到父类的name和i已经显示初始化
Zi的fun:null-0 <--fun方法重写了,访问了子类fun,还有子类的name和i为null和0
说明子类已经默认初始化还未显示初始化
----------------------------
Fu构造方法:Fu-11
Zi的fun:null-2222 <--上面访问fun时子类的i被赋值为2222
----------------------------
Zi构造代码块:Zi-2 <--子类的i显示初始化了 并且覆盖了2222
Zi的fun:Zi-22
----------------------------
Zi构造方法:Zi-2222
请按任意键继续. . .
*/
/*
构造方法:
public 类名 ( ){
super( );
显示初始化;
构造代码块;
构造方法内容;
}
************************ 成 果 ************************
构造方法:
第一行隐含 super( );
访问无参父类构造方法(或者是在编译的时候就补充了super( );)
第二行隐含 显示初始化启动符;
读取方法区内的类的非静态区,逐一显示初始化
(或者是在编译的时候,把显示初始化的代码代码写到此位置或构造代码块的第一行)
第三行隐含 构造代码块启动符;
访问构造代码块(或者是在编译的时候就将构造代码块补充到了此处)
第四行开始才是构造方法内容;
*/
小弟才浅,求大神圈点!
|
|