日期:2014-05-20  浏览次数:20739 次

高手请进:类中奇怪的大括号 和 类实例初始化顺序?
我找到个有趣的例子,自己改了改
有两个问题百思不得其解,高手指点
public   class   Base   {
        int   i   =   10;
        {
                System.out.println( "Base: "+i);
                //问题1:这是什么用法???,i需要在{}之前定义,否则出错,上句什么时候执行?
        }
        Base(int   x){
                f();
        }
        void   f(){System.out.println( "Base   f   "+i);}
}

public   class   BSub   extends   Base{
        int   i   =   30;
        public   BSub()   {
                super(1);//实际调用的方法f是子类的f
        }
        void   f(){System.out.println( "BSub   f   "+i);}
      //问题2:打印的i是0,这是子类还是父类的i?
//这里类实例化的顺序到底是怎样的??
        public   static   void   main(String[]   args){
                new   BSub();
        }
}


------解决方案--------------------
问题2:打印的i是0,这是子类的i
这是覆盖,子类的方法覆盖父类的方法
------解决方案--------------------
回biti509()
“请注意以下,父类的变量(显示赋值的)在其构造函数执行前已经就初始化了,怎么解释?”

这里之所以“搞”,就是因为子类构造函数中多了个super(),这个super()比较特殊,看似是经由子类的构造函数调用的,实则不完全是或者说不是,我那句犯了个错误,我想说明的一个顺序是 父类显式初始化-父类构造函数-子类显式初始化-子类构造函数,有下程序可证:

class Base
{
int i = 10;
{
System.out.println( "Base: " + i);
}

Base(int x)
{
System.out.println( "father 's constructor x= "+1);
f();
}

void f()
{
System.out.println( "Base f " + i);
}
}

public class Test extends Base
{
int i = 30;

{
System.out.println( "Test: " + i);
}

public Test()
{
super(1);
System.out.println( "son 's Test ");
}

void f()
{
System.out.println( "BSub f " + i);
}

public static void main(String[] args)
{
new Test();
}
}