学习总结-Thinking In Java Chapter 8 polymorphism
来源:互联网 发布:淘宝名店 编辑:程序博客网 时间:2024/05/16 09:23
学习总结
本篇是对学习【Java编程思想 第 8 章 多态】的学习总结。
在面向对象的程序设计中,多态是继抽象和继承之后的第三种基本特征
多态的作用是消除类型之间的耦合关系
多态方法调用允许一种类型表现出与其他相似类型之间的区别,只要它们是同一级基类导出来的。这种区别是根据方法行为的不同而表现出来的,虽然这些方法都可以通过同一个基类来调用
多态:同一个符号在不同语义环境下具有不同的解释
多态是通过
- 类继承接口并覆盖(重写)接口中的方法
- 子类继承父类并覆盖(重写)父类中的方法
多态性:发送消息给某个对象,让该对象自己决定响应何种行为。
向上转型
对某个对象的引用视为其对基类类型的引用的做法称为向上转型
写这样一个方法,它仅接受基类作为参数,而不是那些导出类,编写的代码只是与基类打交道。这正是多态允许的。
后期绑定
在运行时根据对象的类型进行绑定,这就是后期绑定(动态绑定或者运行时绑定)。
方法调用机制能够找到正确的方法体,并加以调用,想一下就会得知,不管怎样都必须在对象中安置某种“类型信息”。
Java中除了static
方法和final
方法(private
方法属于final
方法)之外,其他所有的方法都是后期绑定。这意味着通常情况下,我们不必判定是否应该进行后期绑定——它会自动发生。
所以私有方法是不能覆盖的。
调用对象的过程
- 编译器查看对象的声明类型和方法名。假设调用
x.f(param)
,且隐式参数的x的声明为C类的对象。可能存在方法f(int)
和f(String)
。编译器会一一列举C类中名为f的方法和其基类中的除了static
方法和final
方法且名为f的方法。 - 接下来,编译器将查看调用方法时提供的参数。如果所有的名为f的方法中存在一个与提供的参数类型相匹配,就选择这个方法。这个过程称为重载解析(overloading resolution)。由于允许类型转换,对于调用
x.f(int)
,如果编译器没有完全匹配到这个,可能挑选存在的x.f(double)
。如果没有找到匹配,或者经过类型转换后有多个方法与之匹配,就会抱一个警告。 - 如果是
static
方法和final
方法或者构造器,编译器将可以准确地找到这个方法,我们将这种调用方式称为静态绑定。相对应地,调用的方法依赖隐式参数的实际类型,并且在运行时实现动态绑定。 - 每次动态调用都要进行搜索,时间开销相当大。由此,虚拟机预先为每个类创建了一个方法表(method table),其中列出了所有方法的签名和实际调用的方法。这样一来,在真正调用方法的时候,虚拟机仅查找这个表就行了。如果调用
super.f(param)
,编译器将对基类的方法表查找。
构造器与多态
通常,构造器不同于其他种类的方法。在涉及多态也也是如此。
构造器并不具备多态性(它们实际上是static
方法,只不过该声明是隐式的)。
- 在其他事物发生之前,将分配给对象的存储空间初始化成二进制的零
- 调用基类构造器
- 按声明顺序调用成员的初始方法
- 调用导出类构造器的主体
class Glyph { void draw() { print("Glyph.draw()"); } Glyph() { print("Glyph() before draw()"); draw(); print("Glyph() after draw()"); }} class RoundGlyph extends Glyph { private int radius = 1; RoundGlyph(int r) { radius = r; print("RoundGlyph.RoundGlyph(), radius = " + radius); } void draw() { print("RoundGlyph.draw(), radius = " + radius); }} public class PolyConstructors { public static void main(String[] args) { new RoundGlyph(5); }} /* Output:Glyph() before draw()RoundGlyph.draw(), radius = 0Glyph() after draw()RoundGlyph.RoundGlyph(), radius = 5
调用被覆盖的draw方法,由于存储空间被初始化为0,我们发现radius的值为0.
多态与覆盖
多态总是和覆盖联系在一起。
覆盖的条件是:
1. 方法名相同
1. 方法参数相同
1. 子类返回类型<=父类返回类型
方法签名是方法名和参数列表
- 学习总结-Thinking In Java Chapter 8 polymorphism
- Thinking in java : polymorphism
- 学习总结-Thinking In Java Chapter 16 arrays
- 学习总结-Thinking In Java Chapter 19 enumerated
- 学习总结-Thinking In Java Chapter 13 strings
- 学习总结-Thinking In Java Chapter 15 generics
- 学习总结-Thinking In Java Chapter concurrency(1)
- thinking in java(VI)--polymorphism
- Thinking in java-24 Polymorphism 多态
- Thinking in java(chapter 2)
- 【学习笔记】Thinking in java (第三版)第七章 多态性(Polymorphism)
- Thinking in java (第三版)第七章 多态性(Polymorphism)
- Thinking in java Chapter 1 笔记
- thinking in java chapter 10 exercises
- 《Thinking in Java》总结
- Chapter 8 Polymorphism
- 学习 thinking in java
- Thinking in java 异常总结
- 欢迎使用CSDN-markdown编辑器
- [Noi2008]假面舞会
- elasticsearch集群管理工具head插件
- python的魔法方法
- centos7下yum安装mysql
- 学习总结-Thinking In Java Chapter 8 polymorphism
- 各种编程语言简介
- Python 3.X重新加载模块
- OSG数学基础:坐标系统
- Blue Jeans POJ 3080 (串)
- Git Basic
- 创建型模式前奏之简单工厂模式
- [机房练习赛7.11]graph
- 剑指offer--复杂链表的赋值