Java 多肽的理解

1. 概念: 多态,该名称来本来自于生物学中的一个专有名词,表示生物在不同阶段的不同形态。在哲学层面,该词也可以很好的描述Java 中提高类的丰富度的技术,因此借用了该词。

2. 多态技术产生的原因:

Java 放弃 C++ 中的多继承,采用了单继承。从而导致了类的丰富度不够。

多肽的出现是为了弥补丰富度的问题。

3. 多态的分类:

静态多态 ,动态多态

注意:此处的静态,指在程序运行前,程序员就能够清楚的明白程序即将调用的是哪段代码;

      反之,在程序执行后才能知道调用的具体代码的则为 动态多态。

3.1  静态多态典型技术(此处不详述):

方法的重载;

方法的重写;

3.2 动态多态:

3.2.1   类的继承实现;

3.2.2   接口的实现;

4 动态多肽的实现

4.1 类的继承

实现手段:动态绑定 和 重写实现 进行组合。

4.1.1 动态绑定 底层实现:

          《Think in Java》 第四版原文:

To perform late binding, Java uses a special bit of code in lieu of the absolute call. 
This code calculates the address of the method body, 
using information stored in the object
(this process is covered in great detail in the Polymorphism chapter). 
Thus, each object can behave differently according to the contents of that 
special bit of code. 
When you send a message to an object, 
the object actually does figure out what to do with that message.

-------------------翻译-------------------------

为了执行延迟绑定,Java使用一个特殊的代码位来代替唯一路径调用。
这段代码计算出被调用方法体的位置(address),
运用 information 将其存储到 对象中。
(多态一章将会详细介绍这个过程)
因此, 每个对象可以通过该特殊代码段中存储的信息区分不同的行为。
当你发送一条消息给对象时,该对象可以通过接收到的消息判断出应该做什么的。

在 传统的非面向对象编程语言中 ,实现多态,采用的 early binding 模式。

但是面向对象编程语言不能如此实现,  Java 采取了 late binding (延迟绑定)模式 。

为了实现这种模式,如上文所述, 在对象中存储了被调用方法的 address,在运行时,根据 address 寻找对应的方法。 

且 “动态绑定模式” 在 Java 中是默认的(C++ 中需要 运用 virtual 进行标识)。

4.1.2 基础技术准备:数据转型

设计关键点:

  1. 动态绑定:父类引用 各种子类对象(动态绑定方式 一)
  2. 调用的是定义在父类中,又被子类重写的方法
  3.  定义在父类中,是为了保证:父类的引用可以调用到这个方法
  4. 用子类去重写,是为了体现不同子类对象的相同行为,不同实现的多态性

     注意:如此设计满足了开闭原则设计,利用动态绑定技术,实现多态行为

        特殊情况:

         在设计之初,我们都是将 子类的对象装进 父类的引用,这样只能访问到父类中定义的属性和方法,如果一定要访问子类的特有属性和方法,就不可以了。

解决办法只有一个,即 将该引用 强制转换 成子类类型的引用,然后调用其中的特有属性和方法。

又会产生一个问题:父类有很多子类,要是传进来的子类并不是你强制转换的子类,由于不同子类中的特有属性和方法肯定是不同的,程序会报异常:ClassCastException(类型转换异常)。

为了解决该问题,只能在强转前,先 运用 instanceof关键字 进行判断:强转的子类是我所需要的,就强转,不是,咱就不操作了。从而保证程序的运行正常。

Father father = new Son();

该行代码会生成一个引用变量: father;

该变量编译时类型为 Father, 运行时类型为 Son;

4.2 接口的实现

运用接口类型的变量, 指向其实现类的对象

编译时, 接口变量调用接口中的抽象方法, 运行时调用的是实现类中的内容, 也是多肽的一种实现方式。

接口可以相互继承组装, 实现类可以同时实现多个接口, 提高了代码的丰富度。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值