我是个刚接触JAVA的新手,下面这段代码的打印结果是10,为什么不是20呢?
class A
{
int x=10;
}
class B extends A
{
int x=20;
}
class Test
{
public static void main(String []args)
{
B b=new B();
    A a=b;
System.out.println(a.x);
}
}

解决方案 »

  1.   

    因为你把b赋值给了基类A 所以a只能看到A对象里面的x=10 所以是10啊 
      

  2.   

    你主函数里的语句相当与A a=new B(),所以还是a的实例!!
      

  3.   

    就是把b向上转型为a,a还是A类的引用
      

  4.   


    有一个疑惑:如果我在System.out.println(a.x)前.然后看对象a,发现其下面有两个变量.一个x(a) = 10; 一个x(b) = 20;
    谁能给解释解释..
      

  5.   

    为什么方法能实现多态,变量就不行呢?调用方法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();
    }
    }
      

  6.   

    这个可能是它的一种表示形式吧  其实它的意思就是a.x = 10, b.x = 20就像Thinking in Java里面说到函数一样  你的A类下面有一个方法f(),他的参数是一个int型的i,A的实例有a和b,那么他们分别调用f时的现象就是f(a, i)和f(b, i)  其实和你的这个是一个意思  不知道你懂了没...我猜测是不是为了节省资源  在JVM里变量也是有自己的一个指针的  指向不同的引用的  这样就不用每个对象创建一个变量的引用了  仅仅是猜测啊  
      

  7.   

    构造一个子类的时候,其父类也被构造。
    在构造B的时候,也构造了一个A。内存中有两个x,分别是B类里的20和A类里的10.在调用的时候,如果采用方法调用,如
    public int getX(){
      return x;
    }
    则调用子类的方法,这个时候a.getX()返回的是20.如果直接调用类成员变量,则调用当前对象的申明类型的成员变量。如例子里面的a.x和((A)b).x都会返回10.我们发现访问成员变量和访问方法的起始点不同,容易造成混淆,所以最好不要直接访问类的成员变量,要用方法来访问。
      

  8.   

    你那样写是定义了两个不同的属性,在B中的x并不是继承于A的,
    而是B自己的属性,所以a在B中找不到x,只有使用A中的x。
    就像你重写方法的时候,又在把方法名其中一个小写字母写成大写了,
    并没有重写到,在子类中找不到,自然就去父类找。
      

  9.   

    你的X只是局部变量
    并不是全局变量```
    A a = b;
    并不能把b.x赋值给a.x
    所以结果还是10;
      

  10.   

    A a =(A)b;
    b在这里进行了转换。 
      

  11.   

    在继承中,用对象或者this.调方法与调用属性是不同的,楼主你只要熟记:
    父引用(此时必须是子对象)调 重写的member方法时,是调子类的member方法,
    父引用(此时必须是子对象)调 重写的static方法时,是调父类的static方法,
    父引用(此时必须是子对象)调 属性(不管是member属性还是static属性),是调父类的属性。父引用(装父对象)调方法和属性时就只能调父类的,不能调子类的。this.   member方法时 也是找子类的重写方法,
    this.   static方法时  调的是书写这个 "this." 类区的static方法,
    this.  属性(不管是member还是static)都是调的是书写这个 "this." 类区的static方法,static不能实现多态比较容易理解,属性不能实现多态,我也不知道为什么,我想对于初学者,能够熟练运用就暂时够了,LZ要能查到告诉我下,我也很想知道。