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 ...
随机推荐
- Linux SSH免登录配置总结(转)
转载请出自出处:http://eksliang.iteye.com/blog/2187265 一.原理 我们使用ssh-keygen在ServerA上生成私钥跟公钥,将生成的公钥拷贝到远程机器Serv ...
- 史上最有魄力公司!20亿主要用于团队建设,要在上海做出一家BAT之外的互联网公司
在去年的创业大军里,有一家公司显得很特别——微鲸科技,背靠华人文化,联合阿里巴巴.腾讯和央广,天使轮就高达20亿,是被誉为互联网电视领域的豪华创业团队. 在上市不到半年的时间里,旗下发布的55吋和43 ...
- PHP双向队列,双端队列代码
<?php /** * User: jifei * Date: 2013-07-30 * Time: 23:12 */ /** * PHP实现双向队列,双端队列 * 双端队列(dequ ...
- Linux下多线程下载工具myget
[root@superdba ~]# mytgetMytget 0.0.99: A download accelerator for GNU/LinuxUsage: mytget [options]. ...
- JS与JAVA数据类型的区别
JavaScript与Java数据类型的区别 阅读目录 Number String Boolean Null Undefined Object 今天开始正式认真学习js,虽然在平常j2ee开发中也 ...
- Spark高级数据分析· 2数据分析
wget https://archive.ics.uci.edu/ml/machine-learning-databases/00210/donation.zip 数据清洗 cd /Users/eri ...
- Python3.x:BeautifulSoup()解决中文乱码问题
Python3.x:BeautifulSoup()解决中文乱码问题 问题: BeautifulSoup获取网页内容,中文显示乱码: 解决方案: 遇到情况也是比较奇葩,利用chardet获取网页编码,然 ...
- flume从log4j收集日志输出到kafka
1. flume安装 (1)下载:wget http://archive.cloudera.com/cdh5/cdh/5/flume-ng-1.6.0-cdh5.7.1.tar.gz (2)解压:ta ...
- 20145302张薇《Java程序设计》第五周学习总结
20145302 <Java程序设计>第五周学习总结 教材学习内容总结 第八章 try catch JVM会先尝试执行try区块中的内容,若发生错误且与catch后面的类型相符,则执行ca ...
- 20145329吉东云 《Java程序设计》 第一周学习总结
一.JAVA平台概述 1.Java诞生于1995年5月23日,java体系架构分为JavaSE.JavaME.JavaEE三大平台,本章重点介绍了JavaSE.JavaSE分为四个主要部分:JVM.J ...