程序及输出如下,问题注释在后面,一共七个,有编号,最后我写出了我认为的输出结果,回答时能说一下问题编号么?谢谢啦:
public class Test {
    
    public static void main(String[] args) {
        A a = new A();
        B b = new B();
        a.s = "[AA]";               //1被赋值么?
        b.s = "[BB]";
        a = b;                      //2此处是将b的值赋给a么?
        System.out.println(a.s);    //3为什么不输出刚赋的值[AA]
        System.out.println(b.s);    //4若上一行输出[A],该行为什么不输出空  
        System.out.println(a.getS());//5得到的是从哪里来的
        System.out.println(b.getS()); 
        System.out.println("====================");
        ((A)b).s = "[AA]";           //6为什么强制类型转换不改变b.s?
        System.out.println(a.s);     //7为什么是[AA]?不是[A]?不是[BB]? 
        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;
    }
}输出
[A]
[BB]
[BB]
[BB]
====================
[AA]
[BB]
[BB]
[BB]我认为的输出结果:
[AA]
[BB]
不知道
不知道
====================
[AA]
[AA]
不知道
不知道

解决方案 »

  1.   

    [A]   //a=b这句,使得a放弃了赋值为"[AA]"的这个对象,a和b指向同一个对象,该对象类型为B,继承A而来。对象的继承有个特点,变量不会被覆盖(即父类的引用只会调用父类的同名属性,绝不会调用子类的同名属性),函数会被覆盖(父类的引用会调用子类的同名方法)。因此,虽然a指向对象B(),但B继承于A,A的构造函数中s="[A]",因此用a来调用s,只可能输出"[A]"[BB]   //道理同上,子类的引用只会调用子类的属性,刚刚赋值为[BB],因此输出之
    [BB]   //道理同上,父类的引用调用子类的函数,输出子类的属性
    [BB]   //道理同上,子类的引用调用子类的方法,输出子类的属性
      

  2.   

    多谢!
    还是有些地方不太明白:
    所有的 .getS();是获得上一行输出么?能不能具体解释一下 同名方法是多态的需要?
      

  3.   

    看你的代码啊
    getS()是获得同级别的s属性上述后三种情况都调用的是子类的getS,因此得到的是子类的s属性
      

  4.   

    能不能具体解释一下 同名方法是多态的需要?
    --------------------------------------------关于多态的用途,要你自己体会,我也说不明白。个人感觉就是接口和实现细节的分离,你将一个子类赋值给父类的引用,然后调用同名方法,那么子类具体是什么,结果就是什么。比如你调用同名方法draw(),如果子类是个正方形,那么就画正方形;如果子类是圆形,那么就画圆形。而你在编程的时候不用管他具体是什么形状,统统交给子类去实现