Java多态性的理解2
多态的基础理解请参考:http://www.cnblogs.com/liujinhong/p/6003144.html
Java的多态一直是我们理解的一个难点。在读过《深入理解Java虚拟机》和《Java编程思想》以后,感觉理解更深刻了。
我们知道,当父类引用指向子类对象,并且子类覆盖父类中的接口时,当用父类引用调用此接口,则实际上是调用子类对象中的接口。
其实要理解这一点并不难,首先要明确下面两点:
1. 父类引用为何能指向子类对象?
子类是由父类继承而来,所以子类包含了父类中所有的接口。他们的关系是is-a关系,在任何使用父类的地方都可以用一个子类来代替,这也就是里氏替换原则。
里氏代换原则(Liskov Substitution Principle, LSP):所有引用基类(父类)的地方必须能透明地使用其子类的对象。
2. 对象的方法是如何被调用的?
在Java中将一个方法调用和一个方法主体关联起来被称作绑定。若能在程序执行前进行绑定,叫做前期绑定。如果在运行时根据对象的具体类型进行绑定就是后期绑定,也叫作动态绑定或者运行时绑定。
误区:以为只有实现多态是后期绑定,而不满足多态条件的方法调用是前期绑定。(这也是我之前的理解)
在Java中只有static和final修饰的方法是前期绑定,而其他所有方法都是后期绑定!也就是说后期绑定是自然而然发生的,对一个对象发送的消息必须是根据对象的实际类型来寻找该类中定义的方法。这是如何实现的呢?我的简单理解如下:在JVM中,我们通过一个引用来定位一个对象,而对象中同样也存储了该对象本身的类型信息(指向了方法区中的Class对象),这也就是我们可以用getClass()方法来获取对象的class的原因。那么对一个对象发送消息的时候,我们必然也能找到该对象的类型信息,然后再找到该类中合适的方法。
3. 多态的缺陷。私有方法,域和静态方法不适用于多态。
a. 不能覆盖基类中的私有方法

由于private方法自动认为是final的,而且对子类是屏蔽。
子类中的print()方法是一个全新的方法,而没有覆盖父类中的方法。
b. 不能覆盖域与静态方法

output:
father
I am:son
son
I am:son
I am:father
只有普通方法的调用是多态的,如果直接访问某个域,这个访问就是在编译期间进行解析的,因此不是多态的。在上例中,为Father.name和Son.name分配了不同的存储空间。这样Son实际上包含两个称为name的域:它自己的和它从父类中得到的。
如果某个方法是静态的,它的行为就不具有多态性。

output:
father
father static
son
son static
静态方法是与类而不是单个对象相关联的。
Java多态性的理解2的更多相关文章
- [转载]深入理解java多态性
FROM:http://blog.csdn.net/thinkGhoster/article/details/2307001 昨天看到一个关于多态性的帖子,参考了回帖者的理解,加入了一些自己的看法,整 ...
- [java面试]关于多态性的理解
执行时多态性是面向对象程序设计代码重用的一个最强大机制.Java多态性的概念也能够被说成"一个接口.多个方法".Java实现执行时多态性的基础是动态方法调度,它是一种在执行时而不是 ...
- Java多态性举例说明
Java多态性的概念也可以被说成“一个接口,多个方法”. (一)相关类 class A ...{ public String show(D obj)...{ return ("A and D ...
- Java六大必须理解的问题
Java六大必须理解的问题 对于这个系列里的问题,每个学Java的人都应该搞懂.当然,如果只是学Java玩玩就无所谓了.如果你认为自己已经超越初学者了,却不很懂这些问题,请将你自己重归初学者行列.内容 ...
- Java多态性详解 (父类引用子类对象)
面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实现机制,从而可以在不影响使用者的前提下改变类的内部结构,同时保护了数据. 继承是为了重用父类代码,同时为实现多态性作准备.那么什么是多 ...
- Java:泛型的理解
本文源自参考<Think in Java>,多篇博文以及阅读源码的总结 前言 Java中的泛型每各人都在使用,但是它底层的实现方法是什么呢,为何要这样实现,这样实现的优缺点有哪些,怎么解决 ...
- Java多态性详解——父类引用子类对象
来源:http://blog.csdn.net/hikvision_java_gyh/article/details/8957456 面向对象编程有三个特征,即封装.继承和多态. 封装隐藏了类的内部实 ...
- Java基础之理解Annotation(与@有关,即是注释)
Java基础之理解Annotation 一.概念 Annontation是Java5开始引入的新特征.中文名称一般叫注解.它提供了一种安全的类似注释的机制,用来将任何的信息或元数据(metadata) ...
- Java 集合深入理解(8):AbstractSequentialList
点击查看 Java 集合框架深入理解 系列, - ( ゜- ゜)つロ 乾杯~ 今天有点无聊,来学学 AbstractSequentialList 解解闷 吧! AbstractSequentialLi ...
随机推荐
- mysql数据库从删库到跑路之mysql表操作
表介绍 表相当于文件,表中的一条记录就相当于文件的一行内容,不同的是,表中的一条记录有对应的标题,称为表的字段 id,name,qq,age称为字段,其余的,一行内容称为一条记录 内容: 1 创建表 ...
- Writing a device driver for Windows
Writing a device driver for Windows In order to write a device driver for windows, one needs ...
- appium不同姿势安装
一 桌面版(打开很慢,常用于辅助元素定位) 1.官网下载window版本: 2.直接点击图标即可打开
- zookeeper curator客户端之增删改查
zookeeper curator客户端之增删改查 zookeeper安装:https://www.cnblogs.com/zwcry/p/10272506.html curator客户端是Apach ...
- FFmpeg 入门(4):线程分治
本文转自:FFmpeg 入门(4):线程分治 | www.samirchen.com 概览 上一节教程中,我们使用 SDL 的音频相关的函数来支持音频播放.SDL 起了一个线程来在需要音频数据的时候去 ...
- GIT使用—提交的查找与变更
一.查找提交 (1)git bisect(二分搜索法) 基于任意搜索条件查找特定的错误提交.在排查某个提交版本导致的错误时非常有用. [root@localhost public_html]# git ...
- CSS Dimension(尺寸)
CSS Dimension(尺寸) 一.简介 CSS 尺寸 (Dimension) 属性允许你控制元素的高度和宽度.同样,它允许你增加行间距. 二.Dimension(尺寸)属性值 三.示例 (1)示 ...
- 20145307陈俊达《信息安全系统设计基础》第5周学习总结PT1
20145307陈俊达<信息安全系统设计基础>第5周学习总结 教材学习内容总结 X86寻址方式经历三代: DOS时代的平坦模式,不安全,原因是没有区分用户空间和内核空间 8086的分段模式 ...
- 20145327 《Java程序设计》第六周学习总结
20145327 <Java程序设计>第六周学习总结 教材学习内容总结 父类中的方法: 流(Stream)是对「输入输出」的抽象,而「输入输出」是相对程序而言的. 标准输入输出: Syst ...
- 20145109 《Java程序设计》第九周学习总结
JDBC 1 . DriverManager Class.forName("oracle.jdbc.driver.OracleDriver").newInstance(); 2 . ...