class A
{
A()
{ this.test(); }
void test()
{
System.out.println("aa");
}
}
class B extends A
{
int i=10; void test()
{
System.out.println(i);
}
}
public class  TestA
{
public static void main(String[] args) 
{
A a=new B();
}

这个输出的结果是0;
搞不懂这个0是怎么来的?为什么不是输出B中的10呢?
在线等啊!!

解决方案 »

  1.   

    适用父类引用子类时,将调用父类的方法而不是子类中被覆盖的方法,尝试class A
    {
        A()
        { this.test();    }
        void test()
        {
            System.out.println("aa");
        }
    }
    class B extends A
    {
        int i=10;    void test()
        {
            System.out.println(i);
        }
    }
    public class  TestA
    {
        public static void main(String[] args) 
        {
            A a=new B();
            B b = new B();
        }
      

  2.   


    引用父类方法,那i是在子类中声明的啊,没报错,能找到i,那i怎么讲?在子类中的i,也能在父类中调用?
      

  3.   

    很简单 java规定 碰到这种情况就把这个看来不该存在的变量赋值为0 就是这样
      

  4.   

    子类重写了父类的test()方法,而你new 的是子类的实体,所以构造方法是父类的,调用的TEST()方法还是子类的
      

  5.   

    class A
    {
        int i=10;
        A()
        { this.test();    }
        void test()
        {
            System.out.println("aa");
        }
    }
    class B extends A
    {
        //int i=10;    void test()
        {
            System.out.println(i);
        }
    }
    public class  TestA
    {
        public static void main(String[] args) 
        {
            A a=new B();
        }

    这就可以输出10了,原理楼上几位说的已经够了
      

  6.   

    这道题主要考察Java类的初始化顺序!父类static变量--》父类static代码块--》父类本地变量--》父类初始化块--》父类构造方法--》子类static变量--》子类static代码块--》子类本地变量--》子类初始化块--》子类构造方法。
      

  7.   

    虽然覆盖了B类中的方法,但是并没有使用B类中声明的i=10,所以就用默认值0
      

  8.   

    如果把int i = 10;这条语名放在test()中就能输出10了
      

  9.   

    学会用Eclipse中的Debug调试,可以单步执行,查看程序流程!
      

  10.   

    test()方法被重写,而在A类中构造器中调用B类的test()方法,而此时B类中的i还未初始化,只好是默认的是0!
      

  11.   

    这个题就是考察初始化顺序的题。当你this.test()时它会动态绑定到子类中的test()方法。但是此时子类的域还没有得到
    初始化,但编译器会将域置零的,i的值即为零,所以最终输出的结果是零
      

  12.   

    支持9楼看法   --------------------------------------------
    http://www.pkwutai.cn
      

  13.   

    如果在子类里面声明 static int i = 88;结果是多少呢,怎么解释呢?
      

  14.   


    我感觉这个同学说的不对,建议大家 把 jvm装载 连接 初始化类的过程搞清楚,其中的clinit()和init()方法在什么时间调用搞清楚!
      

  15.   


    static是在类加载的时候就初始化了。
      

  16.   

    B b = new B();
    也是0,何解
      

  17.   


    先执行static 中的,然后执行其它,所以结果是88
    9楼写的顺序并不是全部正确的!
      

  18.   


    因为B类继承了A类,所以虚拟机还是调用的A类中的构造方法!