`
凌川__
  • 浏览: 84029 次
  • 性别: Icon_minigender_1
最近访客 更多访客>>
社区版块
存档分类
最新评论

6.1 重载?重写

阅读更多

在Java 中,重载(overload)和重写(override)是用来表现多态性的两种重要方式。override 也有译作“覆盖”、“覆写”。Java 中称作“覆写”比较恰当。
重载方法是指一个类中,方法名相同、参数列表不同的几个方法,调用时根据不同的参数调用不同的方法。方法重载与返回类型无关。
覆写方法是指子类有一个方法,方法名、参数列表、返回类型与父类的某个方法完全一致。调用时会调用子类的方法,而屏蔽掉父类的同名方法。需要注意的是,子类覆写的方法,其可访问性一定要强于或等同于,父类被覆写的同名方法。
覆写发生在子类和父类之间,当然也可以是子类和父类的父类之间。重载不仅仅是发生在子类和父类之间,大多数时候,发生在同一个类中。
4.5节说到:“ Ruby语言,只有重写,没有其它语言具有的严格意义上的重载。” 下面仔细分析 Ruby 为何没有重载,只有重写。
Java 的重载, 参数列表不同有三种形式。
一.参数个数不同
sum(int a)
sum(int a ,int b)
二.参数个数相同,参数类型不同
sum(int a)
sum(float a)
三.参数个数相同,参数类型相同,对应位置不同
sum(int a , float b)
sum(float a ,int b)

Ruby支持缺省参数,我们看程序  E6.1-1.rb :由于缺省参数和可变参数,参数个数不同而产生的重载,在Ruby中不再有效。Ruby语言中,定义方法时,不指定参数类型,因此第二种形式的重载也不存在。第三种形式的重载,实际是第二种形式的演化,所以,也就不存在了。综上所述,Ruby语言,没有方法的重载。

ruby 代码
  1. def  sum( a, b=5 )   
  2.   a+b   
  3. end  
  4. puts sum(3,6)          # => 9   
  5. puts sum(3)             # => 8  

调用sum(3,6) 与 调用sum(3) 在Java中是调用不同的方法,在Ruby中其实是在调用同一个方法。


Ruby还支持可变参数,我们看程序  E6.1-2.rb :

ruby 代码
  1. #  E6.1-2.rb    
  2. def sum( *num )   
  3.   numSum = 0   
  4.   num.each { |i| numSum+=i }   
  5.   return numSum   
  6. end  
  7. puts sum()                  # => 0   
  8. puts sum(3,6)               # => 9   
  9. puts sum(1,2,3,4,5,6,7,8,9)    # => 45  

 


方法的重写,我们在4.4节和4.5节已经看到了。Worker类与Student类继承自Person类,并且各自重写了Person类的talk方法。
这是在子类和父类之间,如果在同一个类中写两个同名方法呢?看程序  E6.1-3.rb :

ruby 代码
  1. #  E6.1-3.rb    
  2. def talk (a)   
  3.     puts "This is talk version 1."       
  4. end     
  5.   
  6. def talk (a,b=1)   
  7.     puts "This is talk version 2."       
  8. end     
  9.   
  10. talk (2)         # =>  This is talk version 2.   
  11. talk (2,7)       # =>  This is talk version 2.  

总是写在后面的方法被执行。
从上面三个小程序可知:在Ruby中,我们说覆写是指重写,我们说重载也是指重写。
Java 和 C++ 是静态语言,程序代码运行中不可以再改变类的属性、方法,为了更好地表现面向对象的多态特征,所以用覆写和重载来加强程序的灵活性,在程序运行的时候,动态地选择要使用的方法, 完成后期绑定。而 Ruby 是动态语言,可以随时改变类的属性、方法,所以覆写和重载的重要性就降低了。仔细体会一下,一者是增大可选择性,一者是随时修改。

完整阅读,请看我写的 Ruby语言中文教程all in one    
 


分享到:
评论

相关推荐

    C#语法全解

    1.6.5.4 虚方法、重写方法和抽象方法 17 1.6.5.5 方法重载 19 1.6.6 其他函数成员 20 1.6.6.1 构造函数 21 1.6.6.2 属性 21 1.6.6.3 索引器 22 1.6.6.4 事件 22 1.6.6.5 运算符 23 1.6.6.6 析构函数 23 1.7 结构 24 ...

    coroutine是一个基于云风的Coroutine库,使用C++11重写的协程库.zip

    C++是一种面向对象的...虚函数(virtual function)、运算符重载(Operator Overloading)、多重继承(Multiple Inheritance)、模板(Template)、异常(Exception)、RTTI、命名空间(Name Space)逐渐被加入标准。

    一个简单的几何图像识别专家系统,基于C++,QT。 根据github中某python项目的重写.zip

    C++是一种面向对象的...虚函数(virtual function)、运算符重载(Operator Overloading)、多重继承(Multiple Inheritance)、模板(Template)、异常(Exception)、RTTI、命名空间(Name Space)逐渐被加入标准。

    MFC实例基础教程 (快速入门)

    - 虚函数允许子类重写父类的函数,从而实现多态性。 **1.7 类的书写规范** - 包括命名约定、注释风格等。 **1.8 小结** - 总结本章所学的关键概念和技术。 #### 二、Windows程序内部运行原理 **2.1 Windows...

    JAVA常见面试问题及答案.docx

    **2.2 重载(Overloading)和重写(Overriding)的区别** - **重载(Overloading)**:发生在同一个类中,指多个方法可以有相同的名称,但它们的参数列表必须不同(包括参数类型、数量或顺序的不同)。重载与返回...

    C#语言规范(4.0版本)

    1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...

    张龙 java se课程笔记

    3.4 方法:方法的定义、调用,以及重载和重写概念。 四、数组与集合 4.1 数组:一维数组和多维数组的理解,以及数组的操作和遍历。 4.2 集合框架:ArrayList、LinkedList、HashSet、HashMap等常用集合类的使用,...

    《C++面向对象程序设计基础》实验报告.pdf

    六、多态性6.1多态性是面向对象编程的关键特性之一,它允许不同的对象对同一消息作出不同的响应。6.2动态多态性通过虚函数实现,虚函数在基类中声明并在派生类中重写,使得调用相同函数名但实现不同的功能。6.3静态...

    疯狂JAVA讲义

    6.1 基本数据类型的包装类 167 6.2 处理对象 170 6.2.1 打印对象和toString方法 170 6.2.2 ==和equals比较运算符 172 6.3 类成员 175 6.3.1 理解类成员 175 6.3.2 单例(Singleton)类 176 6.4 final修饰符 ...

    C++编程思想习题

    1.4.6重写 1.4.7逻辑 1.5其他方法 1.5.1Booch 1.5.2责任驱动的设计(RDD) 1.5.3对象建模技术(OMT) 1.6为向OOP转变而采取的策略 1.6.1逐步进入OOP 1.6.2管理障碍 1.7小结 第2章 数据抽象 2.1声明与定义 2.2一个...

    微软C#语言规范,C#语言教程中文版

    1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...

    C#语言规范(2.0,3.0,4.0合集)

    1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...

    C#_语言规范_4.0_中文版

    1.6.6.4 虚方法、重写方法和抽象方法 18 1.6.6.5 方法重载 20 1.6.7 其他函数成员 21 1.6.7.1 构造函数 22 1.6.7.2 属性 23 1.6.7.3 索引器 23 1.6.7.4 事件 23 1.6.7.5 运算符 24 1.6.7.6 析构函数 25 1.7 结构 25 ...

    java 程序员培训-2

    #### 6.1 作用 - **引用父类对象**:`super` 关键字可以用来引用父类的对象。 - **调用父类构造方法**:使用 `super` 调用父类的构造方法。 - **调用父类方法**:使用 `super` 调用父类中的方法。 #### 6.2 示例 ...

    java面试经典题目和答案

    **6.1 重写 equals() 方法时为什么必须同时重写 hashCode() 方法** 为了确保 Java 中的哈希表(如 `HashSet` 和 `HashMap`)能够正确地存储和检索对象,必须同时重写 `equals()` 和 `hashCode()` 方法。当两个对象...

    Delphi2010语法手册

    - **抽象方法**:未实现的方法,必须在派生类中重写。 **6.4 类字段及类方法** - **类字段**:类级别的变量。 - **类方法**:不依赖于对象实例的方法。 **6.5 属性** - 属性提供了一种更简洁的方式访问和修改类...

    C++高级参考手册 完全自学 内容详细 讲解通俗易懂

    1.4.6 重写 1.4.7 逻辑 1.5 其他方法 1.5.1 Booch 1.5.2 责任驱动的设计(RDD) 1.5.3 对象建模技术(OMT) 1.6 为向OOP转变而采取的策略 1.6.1 逐步进入OOP 1.6.2 管理障碍 1.7 小结 第2章 数据抽象 2.1...

    Programming C#

    #### 6.1 使用operator关键字 C#允许开发者重载大多数内置运算符,这使得自定义类型可以像内置类型一样使用标准运算符。通过使用operator关键字,可以在类中定义运算符的行为,从而提高代码的可读性和表现力。 ###...

    C++ 语言 详细教程电子版

    1.4.6 重写 17 1.4.7 逻辑 17 1.5 其他方法 17 1.5.1 Booch 18 1.5.2 责任驱动的设计(RDD) 19 1.5.3 对象建模技术(OMT) 19 1.6 为向OOP转变而采取的策略 19 1.6.1 逐步进入OOP 19 1.6.2 管理障碍 20 1.7 小结 21...

Global site tag (gtag.js) - Google Analytics