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

请大家帮我看一下,为什么不能输出自己的成员变量,急急,等待中..................
class   A
{
String   name= "张三 ";
public   static   void   main(String   args[])
{
      A   x=new   B();
      System.out.println(x.getClass().getName());   //返回B
      System.out.println(x.age);//不明白,既然x为B类的实例变量,B类中又有成员变量age.些时为什么会出错呢?
      System.out.println(x.name);
}
}
class   B   extends   A
{
int   age=20;
}

------解决方案--------------------
A x=new B();
把A改成B,就可以了,因为如果x是A类型的引用,是不会有访问age的入口的。
------解决方案--------------------
x虽然是子类B的实例,它实现父类,它具有对B类的引用
------解决方案--------------------
System.out.println(((B)x).age);
------解决方案--------------------
继承有两种概念,一种是遗传,一种是变异.
A类中有name该数据,B类继承于A类,所以B类自然就遗传了A类中的name.
而你在B类中,你定义了一个A类中所没有定义过的数据,这就是所谓的变异了.
你使用A类的引用关联到B类对象,那么,你就只能通过A类的引用来调用B类中属于遗传的那部分数据,变异出来的数据是无法调用的.
------解决方案--------------------
同意 malligator(只在此山中)
------解决方案--------------------
可以A x = new B() 但不能B x = new A()!!!!
------解决方案--------------------
A x=new B();

你这么写就是说,x就是A类的对象,那当然就能调用其子类B的成员变量了啊

除非,把A改成B,或则,将其强制转化类型:System.out.println(((B)x).age);
------解决方案--------------------
A x=new B();
在动态编译的过程中,成员变量访问的是 申明类(A)的成员变量,访问的成员方法是B中定义的成员方法