Java 多态 后链接(late binding)与前链接(early binding) 向上转型(upcast)
来源:互联网 发布:c语言和java区别 编辑:程序博客网 时间:2024/06/10 16:47
使用过面向对象编程(OPP)的都知道,多态是OPP的一个主要特性之一。Java做为一种OPP语言,其也有多态特性。
那么什么是多态呢?
多态
指允许不同类的对象对同一消息做出响应。即同一消息可以根据发送对象的不同而采用多种不同的行为方式。(发送消息就是函数调用)
先举个例子,我们定义Shape类,Square和Circle继承Shape类,并重载其draw方法。
public class Shape { public void draw() { System.out.println("draw in Shape!"); }}class Square extends Shape { public void draw() { System.out.println("draw in Square!"); }}class Circle extends Shape { public void draw() { System.out.println("drwa in Circle!"); }}
测试代码如下,
public static void main(String[] args) { Shape square = new Square(); square.draw(); Shape circle = new Circle(); circle.draw(); }
测试结果为,
draw in Square!drwa in Circle!
以上代码就涉及到多态现象。当我们调用draw方法时,Java会根据运行时对象的类型来判断调用谁的方法。比如square在运行时是Square类型,就会调用其draw方法;circle也类似。
或许你会疑问,square的类型命名是Shape,为什么能赋值为Square类型的呢。这就是向上转型了。
向上转型(upcast)
继承最重要的不是给子类提供了方法,而是父类与子类的关系。该关系可以概括为子类是父类的一种(The new class is a type of the existing class)。
由于继承意味着,父类的方法,在子类中也存在,所以向父类发送的消息(父类的方法调用),也可以发送给子类。
这样我们可以理解,Shape square = new Square();该语句为什么可以通过编译。
另外,向上转型是安全的,这是由于,向上转型是由特定的类转为一般的类。也就是,子类是父类的超级(superset),子类包含所有父类的方法。
后链接(late binding)
上面提到Java会根据运行时对象的类型来判断调用的方法,这就是后链接。与链接接相对的是,前链接。
将方法与方法的对象联系起来叫链接。在程序执行前完成链接的(由编译器或链接器完成),叫前链接,C语言就是一个例子。
然而,Java中,由于多态,在编译的时候,编译器仅仅知道一个引用,无法知道调用哪个方法。后链接解决了该问题,在运行时根据对象的类型来链接方法。后链接也称为动态链接(dynamic binding)、运行时链接(run-time binding)。
Java中,所有的方法都是后链接,除非,该方法声明为final方法。很容易理解,因为final方法无法被重写,所以编译器可以知道该方法属于哪个类型。
- Java 多态 后链接(late binding)与前链接(early binding) 向上转型(upcast)
- C++的Early Binding和Late Binding
- java中转型(upcasting)与动态绑定(dynamic binding)或者后期(late binding)细节
- java中转型(upcasting)与动态绑定(dynamic binding)或者后期(late binding)细节
- Late binding
- java中向上转型(upcast)和向下转型(downcast)
- java中向上转型(upcast)和向下转型(downcast)
- java中向上转型(upcast)和向下转型(downcast)
- C#的late binding
- Linux动态链接库函数加载之GOT与Lazy Binding
- JS中的very late binding
- Late static binding....sorta :/ - Digital Sandwich - PHP
- late-binding, Compile time, run-time, polymorphism
- python 延迟绑定(late binding)
- java -多态--向上转型
- JAVA多态(向上转型)与RTTI向下转型
- Java多态——向上转型与向下转型
- Binding
- 10大需要注意的web app问题
- 【IOS学习】IOS开发之视图和视图控制器
- Navicat Premium实现mysql数据库备份 还原
- Cocos2D中屏幕分辨率解释
- 身份证验证、字符串删除、扩展字母、空格转化、位运算
- Java 多态 后链接(late binding)与前链接(early binding) 向上转型(upcast)
- 黑马程序员——反射
- 黑马程序员——多线程
- iis8.5配置wcf
- Python图片中的缩放实现,以及多种尺寸icon的生成
- C++与Matlab混合编程之:矩阵数据结构
- android微信支付(问题总结)
- Android沉浸式状态栏攻略
- js-Node对象属性