黑马程序员技术交流社区

标题: 多态问题 [打印本页]

作者: 马如龙    时间: 2014-6-11 20:54
标题: 多态问题
在多态中成员函数的特点:
在编译时期:参阅引用型变量所属的类中是否有调用的方法。如果有,编译通过,如果没有编译失败。
在运行时期:参阅对象所属的类中是否有调用的方法。
简单总结就是:成员函数在多态调用时,编译看左边,运行看右边。


这里的左边 和 右边  你是怎么理解的?子类父类之间调用遵循 什么原则
作者: yanghu    时间: 2014-6-11 21:06
编译看左边,运行看右边这句话是为了使我们记住,在使用多肽是要按照原则去调用方法,和编写类型。
例如:
  1. class fu{
  2.   function1(){}
  3.   function2(){}
  4. }

  5. class extends Zi{
  6.   function3(){}
  7. }
复制代码

对于Fu fu = new Zi();
我理解的编译看左边的意思是,当某个类中调用了fu.function3(),它编译时可以通过的。
运行看右边的意思是,当真正运行起这个类的实例时fu.function3(),它是会出错的。
这就是我的理解,不正确请指正。
作者: 江夷    时间: 2014-6-11 21:09
这里的左边和右边,是指我们创建对象时,等号左边和等号右边代码。
eg:
                Fu f = new Fu();//  Fu f      父类引用  , new Fu();  父类对象
                 
                Zi z = new Zi();//  Zi z      子类引用  ,  new Zi(); 子类对象
                                       
                Fu f = new Zi();      父类引用指向子类对象。

如上例所示:
      假如有Fu和Zi两个类,同时子类继承父类   
     
       Fu f = new Zi();   对象在创建时,如Zi类拥有特有的方法则此时编译时无法通过的,因为父类引用指向了子类对象,在对象初始化时,子类有自己特有方法,父类没有改方法,父类的引用是无法实现的
     此时如果想调用子类方法,则需要对父类对象进行向下转型,
     Zi z = (Zi)f;   向下转型 后,父类对象被转成子类对象,转型后可以调用子类特有方法
   
  希望能帮到你!




作者: 马如龙    时间: 2014-6-11 22:03
江夷 发表于 2014-6-11 21:09
这里的左边和右边,是指我们创建对象时,等号左边和等号右边代码。
eg:
                Fu f = new Fu();//  Fu f       ...

谢谢 , 这样理解太好了




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2