class Asuper{
      String s="class:Asuper";
      public void test(){
            System.out.println("我是父类的方法");
}
}class Bsub extends Asuper{
      String s="class:Bsub";
       
       public void test(){
            System.out.println("我是子类的方法");
}}public class TestExtends{
     public static void main(String[] args){
             Asuper a1,a2;
            Bsub b=new Bsub();
              a1=b;
               a2=b;
             System.out.println(b.s);
              System.out.println(a1.s);
              System.out.println(a2.s);
              
              b.test();
              a1.test();
              a2.test();}
}输出结果如下:class:Bsuper
                             class:Asuper
                             class:Asuper
                             我是子类的方法
                             我是子类的方法
                              我是子类的方法问题:既然a1=b;   a2=b,     test()方法子类重了父类的方法,输出的结果都为我是子类的方法,这个可以理解,但是为什么a1.s和a2.s的输出结果都还是父类中的 class:Asuper ,实在没明白!求解!

解决方案 »

  1.   

    这个东西是规则,是人为制定的,其实追根到底就是为什么java要制定这样的规则。首先,java中所有的方法都是后期绑定(final方法除外),也就是代码运行到这里才知道(去判断)真正去调用哪个对象的方法。那这样后期绑定的运行效率自然会比编译时绑定效率会低上一些。其次,对于属性来说,Java的规则就是早期绑定,没有玩什么编译时再去判断的艺术。早期绑定的效率更高,毫无疑问。
    那么结论,首先,假若变量也搞后期绑定,那也就是说,首先必须判断变量,然后再根据变量所属的对象去判断方法,完成指令,那java的这个运行效率会再降一截。其次,再来说,让java来再次降低效率去实现变量的后期绑定是否有必要?我想,这才是关键。后期绑定的目的是多态,是代码的简洁、可重用性。而这些对于变量来说,你需要少定义变量来实现代码的简洁或者是可重用性吗,意义微乎其微的。所以结论就是上面说的,属性就是早期绑定,这是SUN规定好的,没有道理可言。