动态绑定是不是只有在继承上才有的?
动态绑定是如何实现的?
动态绑定说是在运行的时候确定调用的方法,为什么不能在编译的时候出现?
在继承上如何实现动态绑定?例:
class Employee
{
   public void first()
   {
      System.out.println("Super.first");
   }
   public void second()
   {
       System.out.println("Super.second");
   }
}class Manager extends Employee
{
   public void first()
   {
      System.out.println("Child.first");
   }
   public void third()
   {
       System.out.println("Child.third");
   }
}public class Test
{
   public static void main(String[] args)
   {
      Employee parent = new Manager();
      parent.first();
      parent.second();
      parent.third();//error
   }
}上面的例子好像说明:使用超类引用变量引用子类对象,这个变量调用的方法必须在超类中存在。请问是不是这样

解决方案 »

  1.   

    动态绑定是不是只有在继承上才有的? 
    -----
    就java语言来说,好像说的没错。
    动态绑定是如何实现的? 
    -----
    通过类的虚函数表实现的。建议你看看《深入java虚拟机》一书,里面有对此的详细描述。
    动态绑定说是在运行的时候确定调用的方法,为什么不能在编译的时候出现? 
    -----
    编译/连接时能绑定的,那就叫静态绑定了。比如继续楼主的例子:public class Tester : Employee {    public void first() {
            System.out.println("Tester.first()");
        }
    }public class Test2 {
        public static void callFirst(Employee e) {
            e.first();
        }    public static void main(String[] args) {
            Employee joe = new Manager();
            callFirst(joe);
            Employee michael = new Tester();
            callFirst(michale);
        }
    }
    callFirst() 方法在编译时,并不能确定参数e传进来的真实类型是什么,所以无法确定e.first()该执行哪段代码,所以要用到动态绑定。
    在继承上如何实现动态绑定?
    -----
    动态绑定不用程序员去实现,jvm给你做了。
      

  2.   

    parent虽然是子类Manager类型的对象,但对于子类Manager类型的方法是不可见的,因为是用父类Employee类型声名的。只有经过强制类型转换(Manager)parent操作后,才可以用Manager类的方法,即所谓的多态。
      

  3.   

    正是这样
    如果要调用子类的方法,必须强行转换
    ((Manager)parent).third();
    parent是Employee类型,所以parent只能访问Employee的方法,但是parent引用的是Manager的实例,所以可以把parent进行强行转换后访问Manager的方法。