虽然,我也经常用到java动态绑定的特性,但老实说,我还是对这一特性一知半解,请求谁能简单通俗的解释下哦 public class Father {     
     public void method() {     
        System.out.println(" 父类方法,对象类型:" + this.getClass());     
     }     
 } public class Son extends Father {     
    public void method() {     
       System.out.println(" 子类方法,对象类型:" + this.getClass());     
   }     
        
 public static void main(String[] args) {     
       Father sample = new Son();// 向上转型     
      sample.method();     
    }     
}     运行结果大家很清楚,但是,我还是不明白,java到底是怎么动态绑定到Son对应的方法中,而不是Father哦?

解决方案 »

  1.   

    动态绑定满足三个条件:
    1。需要有继承的存在。
    2。需要有方法的重写
    3。父类引用指向子类对象。
    你的程序都满足这三点。当父类引用指向子类对象时。就像你的代码Father sample = new Son();// 向上转型   
     sample.method();   
     sample是不能调用子类的方法的。那么为什么程序的结果是子类的方法呢???这就是方法的覆盖。我们看到的是假象。其实sample还是调用的是父类的method()方法。但是它已经被覆盖了。原来的methoed()就变成我们看到的子类的method()。这下,你应该懂了吧。
      

  2.   

    我觉得这个不是覆盖··而是说··Father sample = new Son()这句话··创建的是一个子类对象··但是被当作父类对象来使用··也就是说··这个命名是一个儿子,但被当作是他爸爸来使用··当你调用方法的时候,其实调用的是当前对象的方法··也就是儿子的方法··自然··输出的就是子类重写了父类的方法之后的方法的内容··
      

  3.   

    这个程序不足以让你了解多态··你可以看看我的博客里的··我有一个Java多态随堂笔记··那里写的很清楚··
      

  4.   

    所谓动态绑定,是这个概率搞复杂了,说白了就是,
    你定义了有一个"类型" A, 这个A可能是个接口,也可能是个抽象类或是普通类,如  public class Test  {
          A a;    //
          public void setA (A aa){
               this.A=aa;
          }
      }这样,你开始new这个Test对象是,是不是a是null (没有实例化)? 然后在程序运行中,你可以随时调用 setA给 a赋个值, 比如ccc。  这就是所谓的动态绑定。注意这个ccc一定是A的实现,或子类.注意:这里的setA方法,只是我想说明动态绑定的一种实现方法,并不是唯一的方法。
    故:动态绑定就是,在程序运行中实例化某个"类型".
      

  5.   

    http://topic.csdn.net/u/20101010/17/76b449c3-916e-41a2-91e8-a7ba932df906.html?23225
      

  6.   


    你说sample不能调用子类的方法,是因为覆盖,意思是非继承来的方法都丢了吗,只有Father里的方法吗,
    可如果是这样,那sample强制转换为Sun类型后不是还能用非继承来的方法吗
      

  7.   


    对,sample强制转换为Sun类型后是可以用非继承来的方法的。但是没强制转换的话就不能调用子类的方法。
      

  8.   

    sample 虽然是父类的对象  但是程序实际new的是子类 程序是访问你实际new什么对象而调用什么方法的
      

  9.   

    哥们··这是动态绑定吗?是不是搞错了?
    Java多态的内容真有这么难吗?还不结贴撒··