zoukankan      html  css  js  c++  java
  • 动态绑定

    在doStuff()的代码里,最让人吃惊的是尽管我们没作出任何特殊指示,采取的操作也是完全正确和恰当 的。我们知道,为 Circle 调用draw()时执行的代码与为一个 Square或 Line 调用draw()时执行的代码是不 同的。但在将draw()消息发给一个匿名 Shape时,根据 Shape句柄当时连接的实际类型,会相应地采取正确 的操作。这当然令人惊讶,因为当 Java 编译器为doStuff()编译代码时,它并不知道自己要操作的准确类型 是什么。尽管我们确实可以保证最终会为Shape 调用erase(),为Shape 调用draw(),但并不能保证为特定 的Circle,Square或者Line 调用什么。然而最后采取的操作同样是正确的,这是怎么做到的呢? 将一条消息发给对象时,如果并不知道对方的具体类型是什么,但采取的行动同样是正确的,这种情况就叫 作“多形性”(Polymorphism)。对面向对象的程序设计语言来说,它们用以实现多形性的方法叫作“动态 绑定”。编译器和运行期系统会负责对所有细节的控制;我们只需知道会发生什么事情,而且更重要的是, 如何利用它帮助自己设计程序。 有些语言要求我们用一个特殊的关键字来允许动态绑定。在C++中,这个关键字是 virtual。在Java 中,我 们则完全不必记住添加一个关键字,因为函数的动态绑定是自动进行的。所以在将一条消息发给对象时,我 们完全可以肯定对象会采取正确的行动,即使其中涉及上溯造型之类的处理。

     1 package Com.TomTest;
     2 
     3 
     4 class Father {
     5        private int money;
     6        float weight,height;
     7        String head;
     8        void speak(String s) {
     9        System.out.println(s);
    10        }
    11     }
    12     class Son extends Father {
    13         String hand,foot;
    14     } 
    15     public class TomTest_24 {
    16       public static void main(String args[]){
    17        Son boy;
    18           boy=new Son();
    19           boy.weight=1.80f; 
    20           boy.height=120f;
    21           boy.head="一个头"; 
    22           boy.hand="两只手 ";
    23           boy.foot="两只脚";
    24           boy.speak("我是儿子");
    25           System.out.println(boy.hand+boy.foot+boy.head+boy.weight+boy.height);
    26        }
    27     }    
  • 相关阅读:
    强化学习基础:蒙特卡罗和时序差分
    强化学习基础:基本概念和动态规划
    EM算法和高斯混合模型GMM介绍
    使用Tensorflow搭建自编码器(Autoencoder)
    神经网络介绍:梯度下降和正则化
    神经网络介绍:算法基础
    K均值聚类和DBSCAN介绍
    Zabbix安装过程中遇到的问题
    Docker容器操作基础命令(二)
    Docker的安装及基本用法(一)
  • 原文地址:https://www.cnblogs.com/borter/p/9438472.html
Copyright © 2011-2022 走看看