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

关于多态的一点疑惑
动态绑定是指在执行期间(非编译期)判断所引用对象的实际类型,根据其实际的类型调用其相应的方法。我不理解这句话
例如:
  class Person {
  //没有方法
  }
  Class Stu {
  void study() {
  ........
  }
  }
按照上面的解释,在 Peron p = new Stu(); 并调用 p.study();方法的时候,根据实际类型调用study()方法,实际类型 Stu 中是有study();方法的,但不能通过。所以我觉得这个解释不合理。
 求求各位大神解答我的这个疑惑。

------解决方案--------------------
Person没有study方法,怎么能调用?study方法是Stu才有的,所以要把p强行转换为Stu对象来调用
((Stu)p).study();这样就可以了
LZ要理解动态绑定的意思,就是一个父类的变量,指向一个子类的对象,运行期决定调用子类的方法,但父类本身就没有这样方法,父类变量本身是不知道子类有这样的方法的,所以编译期间就会报错了
Person p; //也就是说,p只能调换用Person的方法,不能调用Stu的方法,要调用就必须强行转换
p = new Stu();因为p指向的是Stu对象,所以当p调用Person的方法的时候,因为Stu重新覆盖了Person的方法,所以调用的就是Stu的方法,这就是所谓的动态绑定,运行期才知道p具体指向什么对象,才决定具体调用什么对象的方法
比如
人是一个类,机器人是一个子类
人 a = new 机器人();
a.说话(); 那么运行期将调用机器人的说法
但是,如果人本身不提供说话这个方法,那么a.说话();就会编译失败,因为编译器在编译期不知道a在运行期会指向机器人,只知道a是个人类,如果a没有说话方法就不能用,而如果强行转换,((机器人)a).说法,因为a被强行转换为机器人类了,编译器知道机器人有说话这个方法,所以编译能通过

------解决方案--------------------
产生多态三个必备条件:
1.要有继承
2.要有方法的重写(注意与重载相区别)
3.要有子类对象赋给父类引用
楼主好好看懂这三条,懂了的话,估计会让你对多态有更多的了解