`
凌川__
  • 浏览: 82287 次
  • 性别: 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 ...

    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 ...

    J2EE学习笔记

    3.5:面向对象、重载和重写、构造函数和返回类型 121 3.6:Java.lang-----Math类、字符串和封装类 121 3.7:对象和集合 121 3.8:内部类 125 3.9:线程 125 第四章:面向对象基本概念 155 4.1:统一建模语言UML 155 ...

    传智播客_C++基础课程讲义_v1.0.7

    面试题3:谈谈你对重写,重载理解 6 #include <cstdlib> 6 #include <iostream> 6 using namespace std; 6 class Parent01 6 { 6 public: 6 Parent01() 6 { 6 cout()..do"; 6 } 6 public: 6 virtual void func() 6 {...

    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讲义

    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#语言规范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#语言规范(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 ...

    C#本质论(第3版)

    6.1 派生 6.1.1 基类型和派生类型之间的转型 6.1.2 private访问修饰符 6.1.3 protected访问修饰符 6.1.4 扩展方法 6.1.5 单一继承 6.1.6 密封类 6.2 基类的重写 6.2.1 virtual修饰符 6.2.2 new修饰符 ...

    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...

    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...

    C++编程思想

    6.1 为什么要用输入输出流 83 6.2 解决输入输出流问题 86 6.2.1 预先了解操作符重载 86 6.2.2 插入符与提取符 87 6.2.3 通常用法 88 6.2.4 面向行的输入 90 6.3 文件输入输出流 91 6.4 输入...

    C编程思想--chinapub书籍--文本PDF

    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...

    c++学习经典图书:C++ 编程思想(全).rar

    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...

    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