请大家帮我看一下,为什么不能输出自己的成员变量,急急,等待中..................
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中定义的成员方法