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 ...
随机推荐
- PAT 1145 Hashing - Average Search Time [hash][难]
1145 Hashing - Average Search Time (25 分) The task of this problem is simple: insert a sequence of d ...
- php int 与 datetime 转换
数据库日期类型是int类型的,该查询结果是datetime类型的 select from_unixtime( `dateline` ) from cdb_posts 如果原来类型是datetime类型 ...
- javascript 对象 原型
- java jdom 解析CDATA内容
package com; import java.io.IOException; import java.io.StringReader; import java.util.List; import ...
- ruby中的链式访问和方法嵌套
先看一道题,这道题是codewars上的一道题,我很早就看到了,但是不会写.等到又看到这道题的时候,我刚看完元编程那本书,觉得是可以搞定它的时候了.废话不多说,先看这道题,题目最开始是为JavaScr ...
- 清晰讲解LSB、MSB和大小端模式及网络字节序
时隔一个月又回到了博客园写文章,很开心O(∩_∩)O~~ 今天在做需求的涉及到一个固件版本的概念,其中固件组的人谈到了版本号从MSB到LSB排列,检索查阅后将所得整理如下. MSB.LSB? MSB( ...
- iOS 大批量弹幕小论(粒子弹幕)
一.现状 如今直播类.视频播放器等基本都有弹幕模式. 为了保持性能和内存可控,基本是在初始化的时候生成一个Pool(Pool的容量是设定好的), 也就是利用重用机制(可以想象一下UITableView ...
- 让div水平垂直居中的几种方法
最近,公司招了一批新人,吃饭的时候恰好碰到一个新同事,就跟他聊了起来.听他说了主管面试的时候出的一些问题,其中一个问题我印象特别深刻,因为,我当年进来的时候,也被问到这个问题.虽然这个问题已经问烂了, ...
- web.xml<context-param>与<init-param>的作用与区别
<context-param>的作用:web.xml的配置中<context-param>配置作用1. 启动一个WEB项目的时候,容器(如:Tomcat)会去读它的配置文件we ...
- 如何用纯 CSS 创作一个跳动的字母 i
效果预览 在线演示 按下右侧的"点击预览"按钮可以在当前页面预览,点击链接可以全屏预览. https://codepen.io/comehope/pen/pZbrpJ 可交互视频 ...