public class ploytest {public static void main(String[] args) {
A a = new A();
B b = new B();
a.s = "[AA]";
b.s = "[BB]";
a = b;
System.out.println(a.s);
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
System.out.println("====================");
((A)b).s = "[AA]";
System.out.println(a.s);
System.out.println(b.s);
System.out.println(a.getS());
System.out.println(b.getS());
}
}class A {
String s = "[A]";
String getS() {
return s;
}
}class B extends A{
String s = "";
String getS() {
return s;
}
}输出结果 我就是看不明白阿 怎么回事呢

解决方案 »

  1.   

    这段程序的输出是这样的
     [A]
    [BB]
    [BB]
    [BB]
    ====================
    [AA]
    [BB]
    [BB]
    [BB] 为什么一开始是[A]呢 我觉得全是[BB] 如果按照healer_rx说的 a不通过方法就是不能调用b里面的属性了么
      

  2.   

    a = b的语义是a变量指向了b变量指向的对象了。现在,a和b指向了同一个对象。
      

  3.   

    http://blog.csdn.net/Slugfest/archive/2008/01/10/2034305.aspx
    看这章。
      

  4.   

    应该是这个样的!
    你可以在 这儿加b.s = "[BB]";    System.out.println(a.s); //这个显示的结果是[AA]a = b; System.out.println(a.s); 
    //说明,a=b,因为b 是继承a 的所以 
    a = b; 
    System.out.println(a.s);  //这个结果就因该是A 类中的结果了[A]
    System.out.println(b.s); //显然这个结果是 [BB]
    System.out.println(a.getS()); //这个b 的指向已经转给了a 所以 
    System.out.println(b.getS()); //这个应该是 同上了 [BB]((A)b).s = "[AA]"; 
    System.out.println(a.s); //已经被转型了,所以都是[AA] 
    System.out.println(b.s); 
    System.out.println(a.getS()); //这个地址和上面的a.getS() 地址都没有改变,所以都是[BB]
    System.out.println(b.getS()); //这个地址和上面的b.getS() 地址都没有改变,所以都是[BB]
      

  5.   

    楼主可以这么来理解,实际上a = b; 
    其实就是A a=new B();在这个语句执行时,其实是生成了一个A类的对象.(先生成父类对象,在生成子类对象)
    这个a 指向了在生成b之前生成的A对象,A的s初始化是[A],所以a.s=[A];多态是针对方法说的,不是针对成员变量.
      

  6.   

    我单步执行了一下 发现 变量a和b是一样的 而且他们都有两个变量s。一个是A类的 一个是B类的  a.s和b.s不一样 可能就是他们的类型不同 当a.s时jvm发现是A类型的变量 它就去找A的s,B也是一样。getS方法正是面向对象式的多态性的体现,派生类是什么方法就去执行什么方法。和自己的类型没有关系
      

  7.   

    a好像不通过方法就是不能调用b里面的属性了,但是b可以不通过方法能够调用a里面的属性了
    ((A)b).s=[A];
      

  8.   

    回去好好 看看对象是怎么生成的,你就不难理解的
    具体的是
    A a = new A(); 
    a = b; 看看他们内存和堆栈中是怎么分配的,
    这才是这个问题的根源,,弄明白了就解决了
      

  9.   

    8楼说的  A a = new B();
    是生成了A 的对象还是生成了B 的对象?
    具体什么意思啊
      

  10.   

    这涉及到java的动态绑定机制:
    1.静态方法与所声明的类型的方法绑定;
    2.实例方法与所引用的对象的方法绑定;
    3.成员变量与所声明的类型的成员属性进行绑定;(这道题属于第3种情况)