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;
}

解决方案 »

  1.   

    A x=new B();
    把A改成B,就可以了,因为如果x是A类型的引用,是不会有访问age的入口的。
      

  2.   

    x虽然是子类B的实例,它实现父类,它具有对B类的引用
      

  3.   

    继承有两种概念,一种是遗传,一种是变异.
    A类中有name该数据,B类继承于A类,所以B类自然就遗传了A类中的name.
    而你在B类中,你定义了一个A类中所没有定义过的数据,这就是所谓的变异了.
    你使用A类的引用关联到B类对象,那么,你就只能通过A类的引用来调用B类中属于遗传的那部分数据,变异出来的数据是无法调用的.
      

  4.   

    同意 malligator(只在此山中)
      

  5.   

    可以A x = new B() 但不能B x = new A()!!!!
      

  6.   

    A x=new B();你这么写就是说,x就是A类的对象,那当然就能调用其子类B的成员变量了啊除非,把A改成B,或则,将其强制转化类型:System.out.println(((B)x).age);
      

  7.   

    A x=new B();  
    在动态编译的过程中,成员变量访问的是 申明类(A)的成员变量,访问的成员方法是B中定义的成员方法