黑马程序员技术交流社区

标题: 非静态成员变量显示初始化是在super( )后构造代码块前 [打印本页]

作者: jauliun    时间: 2015-12-27 19:49
标题: 非静态成员变量显示初始化是在super( )后构造代码块前
非静态成员变量显示初始化是在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( );)
第二行隐含 显示初始化启动符;
        读取方法区内的类的非静态区,逐一显示初始化
        (或者是在编译的时候,把显示初始化的代码代码写到此位置或构造代码块的第一行)
第三行隐含 构造代码块启动符;
        访问构造代码块(或者是在编译的时候就将构造代码块补充到了此处)
第四行开始才是构造方法内容;
*/
小弟才浅,求大神圈点!






欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2