package test;class Test2
{
int i = 2;
public void sayHello(Test2 test2)
{
System.out.println(test2.i);
}
}class Test3 extends Test2
{
int i = 3;
public void sayHello(Test2 test2)
{
System.out.println(i);
System.out.println(test2.i);
}

}public class Test{
public static void main(String[] args)
{
Test2 test = new Test3();//将此处改为Test3 test = new Test3();结果也是输出3,2
test.sayHello(test);
}
}
结果为什么输出是3和2而不是3和3呢?实参不是对Test3对象的引用吗?请哪位高手帮忙解析一下,谢谢!

解决方案 »

  1.   

    Java中继承时可以覆盖成员方法,但是不会覆盖变量和静态方法。
    即对于成员方法来说,调用哪个方法取决于调用者的实际类型,在这里是Test3对象调用的,所以System.out.println(i)打印的是Test3对象的i。
    对于变量和静态方法,则不会在继承中被覆盖,因此究竟是哪个变量的i取决于变量的声明,这里参数声明为了Test2,所以会调用Test2中定义的i
      

  2.   

    顶楼上。就是说那个变量i在sbuclass中有一份儿,在父类中也有一份儿。你传的是父类的引用,所以看不到子类的那个i,自然打印出来的是3.这个东西挺绕哈,呵呵.
      

  3.   

    public void sayHello(Test3 test2)就是3,3啦