代码:
class B extends A
 {
public  int a;
public B()
{
a=8;
}
public int addFive()
{
a+=5;
return a;
}
public static void main(String[] args) throws Exception
{
                   A a=new B();
a.addFive();
System.out.println(a.addFive());//此处打印出18,为什么?
                  System.out.println(a.a);//此处打印出3,为什么?
}
 }
class A
{
public int a;
public A()
{
a=3;
}
public int addFive()
{
a+=5;
return a;
}


}

解决方案 »

  1.   

    在继承的时候,如果子类重新声明了实例变量,就会发生所谓的变量隐藏。
    意思就是子类的实例变量会隐藏掉父类的变量从你上面的例子来说,B 继承了 A
    A a = new B();
    这样创建了一个B的实例,但却用父类来引用这个对象。
    当调用a.addFive()时,实际上调用的是B类定义的addFive方法。
    因为Java的方法调用是在运行时根据类型来选择的,也就是所谓的多态
    B类的addFive方法当然是使用B类里定义的a变量
    调用两次,8+5+5自然得到18的结果了。而对于a.a来说,a虽然是B的实例,但使用a.a的时候,由于a是用A来引用的,Java会使用
    A类自己声明的实例变量a,因为父类对子类的内部是一无所知的总之最重要的就是Java对于a.a和a.addFive,也就是使用实例变量和调用方法的机制是不一样的