为什么方法能实现多态,变量就不行呢?调用方法a.fn()打印的20,是调用的B类中的方法,但是a.x却是10,是A类中的变量,不明白.
class A
{
int x=10;
void fn()
{
System.out.println(x);
}
}
class B extends A
{
int x=20;
void fn()
{
System.out.println(x);
}
}
class Test
{
public static void main(String []args)
{
B b=new B();
                A a=b;
System.out.println(a.x);
a.fn();
}
}

解决方案 »

  1.   

    B 继承 A 方法重载...
      A a=b;  被又声明回了A类..
    自然结果就是10和20..
    个人意见...
      

  2.   

    楼主只要记住一句:
        方法可以重写,变量只能覆盖!!所以,如果有一个由父类声明、由子类new出的对象的引用/在调用父类与子类同名的变量和方法时/则调用子类的方法,调用其自身的变量!!!
      

  3.   

    楼上几个的说法真混乱 
    override 有人翻译成重写 ,有人翻译成覆盖,这是对方法而言,static,private,final方法出外
    对于变量,没有override一说,它们的行为成为hiden
      

  4.   

       多态是发生在父子类之间,父类对象 = new 子类()时,其实在堆中存在的还是子类的实例,但是如果子类重写或者是覆盖
    类父类的方法体。在使用父类对象.方法()时,执行的就是子类重写过后的方法的方法体。
       而属性只在这子类中发生了作用域的隐藏。但是在new 子类()的时候,还是对父类中的属性做了初始化。从而用父类的对象就
    只能是访问到父类中的属性值。
       在子类对象中也可以访问父类的属性【注意权限】值。但是要通过类名限定。
      

  5.   

    但a的x能被System.out.println訪問嗎
      

  6.   

    楼主只要记住一句: 
        方法可以重写,变量只能覆盖!! 所以,如果有一个由父类声明、由子类new出的对象的引用/在调用父类与子类同名的变量和方法时/则调用子类的方法,调用其自身的变量!!!