日期:2014-05-20  浏览次数:20708 次

关于多肽的问题
程序及输出如下,问题注释在后面,一共七个,有编号,最后我写出了我认为的输出结果,回答时能说一下问题编号么?谢谢啦:
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]
不知道
不知道



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

[BB] //道理同上,子类的引用只会调用子类的属性,刚刚赋值为[BB],因此输出之
[BB] //道理同上,父类的引用调用子类的函数,输出子类的属性
[BB] //道理同上,子类的引用调用子类的方法,输出子类的属性