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

java 有关动态绑定的理解
虽然,我也经常用到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。需要有继承的存在。
2。需要有方法的重写
3。父类引用指向子类对象。
你的程序都满足这三点。

当父类引用指向子类对象时。就像你的代码Father sample = new Son();// 向上转型
 sample.method();
 sample是不能调用子类的方法的。那么为什么程序的结果是子类的方法呢???这就是方法的覆盖。我们看到的是假象。其实sample还是调用的是父类的method()方法。但是它已经被覆盖了。原来的methoed()就变成我们看到的子类的method()。这下,你应该懂了吧。
------解决方案--------------------
我觉得这个不是覆盖··而是说··Father sample = new Son()这句话··创建的是一个子类对象··但是被当作父类对象来使用··也就是说··这个命名是一个儿子,但被当作是他爸爸来使用··当你调用方法的时候,其实调用的是当前对象的方法··也就是儿子的方法··自然··输出的就是子类重写了父类的方法之后的方法的内容··
------解决方案--------------------
所谓动态绑定,是这个概率搞复杂了,说白了就是,
你定义了有一个"类型" A, 这个A可能是个接口,也可能是个抽象类或是普通类,如
Java code

  public class Test  {
      A a;    //
      public void setA (A aa){
           this.A=aa;
      }
  }