1. “封装”通过合并特征和行为来创建新的数据类型;
  2. “实现隐藏”通过将细节“私有化”把接口和实现分离开来;
  3. “多态”消除类型之间的耦合关系(多态也称为动态绑定、后期绑定或运行时绑定);

再说 final

Java 中除了 static 方法和 final 方法(private 方法属于 final 方法)之外,其他所有的方法都是后期绑定。也就是说,final 可以“关闭”动态绑定。

多态缺陷一:“覆盖”私有方法

如果子类覆盖了父类的私有方法(其实准确来说并不是覆盖,因为私有方法不会被覆盖,这里说的只是方法签名一致罢了),新创建的子类实例向上转型成父类对象后,再调用该方法,则最终调用的是父类的私有方法,而不是子类的相同签名的方法。

多态缺陷二:域与静态方法

在代码里直接访问某个域(即直接通过实例访问其值属性,而不是通过 getter/setter),那么这个访问就是在编译期进行解析。这样就会导致,如果你把子类向上转型为了父类,然后再直接访问其值属性,那么访问到的就是父类里面的值属性(前提是子类和父类同时拥有一个变量名相同但值不同的值属性)。
如果子类覆盖了父类的静态方法,然后子类实例向上转型为父类时,再调用该静态方法,则最终使用的是父类的静态方法。

构造器和多态

构造器不同于其他种类的方法,实际上它们是隐式的静态方法,所以它们并不具有多态性。

协变返回类型

啥是协变返回类型?其实很简单,就是子类在覆盖父类的方法时,子类中的方法可以返回父类方法返回类型的子类型,也就是更具体的类型,这一点也符合多态的规则。

《Think in Java》(八)多态的更多相关文章

  1. 关于java中多态的理解

    java三大特性:封装,继承,多态. 多态是java的非常重要的一个特性: 那么问题来了:什么是多态呢? 定义:指允许不同类的对象对同一消息做出响应.即同一消息可以根据发送对象的不同而采用多种不同的行 ...

  2. 深入Java核心 Java中多态的实现机制(1)

    在疯狂java中,多态是这样解释的: 多态:相同类型的变量,调用同一个方法时,呈现出多中不同的行为特征, 这就是多态. 加上下面的解释:(多态四小类:强制的,重载的,参数的和包含的) 同时, 还用人这 ...

  3. 个人对Java中多态的一些简单理解

    什么是多态 面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. 多态的定义:指允许不同类的对象对同一消息做出响应.即同一 ...

  4. Java中多态的一些简单理解

    什么是多态 .面向对象的三大特性:封装.继承.多态.从一定角度来看,封装和继承几乎都是为多态而准备的.这是我们最后一个概念,也是最重要的知识点. .多态的定义:指允许不同类的对象对同一消息做出响应.即 ...

  5. Java JVM 多态(动态绑定)

    Java JVM 多态(动态绑定) @author ixenos 摘要:绑定.动态绑定实现多态.多态的缺陷.纯继承与扩展接口.向下转型与RTTI 绑定 将一个方法的调用和一个方法的主体关联起来,称作( ...

  6. Java:多态乃幸福本源

    01 多态是什么 在我刻板的印象里,西游记里的那段孙悟空和二郎神的精彩对战就能很好的解释“多态”这个词:一个孙悟空,能七十二变:一个二郎神,也能七十二变:他们都可以变成不同的形态,但只需要悄悄地喊一声 ...

  7. 从虚拟机指令执行的角度分析JAVA中多态的实现原理

    从虚拟机指令执行的角度分析JAVA中多态的实现原理 前几天突然被一个"家伙"问了几个问题,其中一个是:JAVA中的多态的实现原理是什么? 我一想,这肯定不是从语法的角度来阐释多态吧 ...

  8. java 八种基本数据类型之初始值、取值范围、对应的封装类

      CreateTime--2017年12月6日10:03:53 Author:Marydon 一.java数据类型之基本数据类型 (二)八种基本数据类型的特征 import java.math.Bi ...

  9. java 八种基本数据类型之与对应的封装类之间的相互转化

      迁移时间--2017年5月26日17:47:37 Author:Marydon 一.java数据类型之基本数据类型 UpdateTime--2017年1月9日17:31:14 (三)格式转换 1. ...

  10. 学习博客之Java继承多态接口

    这一篇博客主要是对软工前一阶段学习的总结,主要是对Java的学习总结,包括三部分:Java的继承.多态和接口 Java的继承 继承是面向对象的三大特性之一,能够实现软件的复用. Java子类继承父类的 ...

随机推荐

  1. 记一次服务器inodes数报警的事件

    # df -i 执行以上命令,发现/上的 inodes 占用率为81%,于是开始处理. 首先找出哪个目录底下文件数最多: # cd / # for i in $(ls);do echo ${i} &a ...

  2. $(document).ready() $(window).load 及js的window.onload

    1.$(document).ready()  简写为$(function(){}) DOM结构绘制完成执行,而无需等到图片或其他媒体下载完毕. 2.$(window).load  在有时候确实我们有需 ...

  3. HTML页面布局

    接下来的下面代码,只是给了一个大的前端编写布局,如果你已经是牛人了,就当没看到,如果是一些初学者,不妨拿去用用,里面也写了一些常用的css样式,现在虽然有很多牛逼的前段框架,用起来也非常得心应手,但是 ...

  4. linux下tcpdump命令的使用

    一般情况下linux系统会自带tcpdump工具,如果系统没有安装,直接用命令安装就行了. 安装命令:yum install -y tcpdump 查看安装版本命令:tcpdump --help 查看 ...

  5. 兼容ie的background-size: cover;

    .bg{ background: url() no-repeat; background-size:cover; filter: progid:DXImageTransform.Microsoft.A ...

  6. 我的第一个JSP

    首先在新建一个Webproject 再在WebRoot以下new一个HelloWorld.jsp 改动body里面的内容 <body>     <h1>HelloWorld:& ...

  7. python cookbook第三版学习笔记二十一:利用装饰器强制函数上的类型检查

    在演示实际代码前,先说明我们的目标:能对函数参数类型进行断言,类似下面这样: @typeassert(int, int) ... def add(x, y): ...     return x + y ...

  8. tfboys——tensorflow模块学习(三)

    tf.estimator模块 定义在:tensorflow/python/estimator/estimator_lib.py 估算器(Estimator): 用于处理模型的高级工具. 主要模块 ex ...

  9. 构建Ruby开发环境(Windows+Eclipse+Aptana Plugin)

    1.安装Ruby ①.从http://rubyinstaller.org/downloads/下载安装包:rubyinstaller-2.2.5-x64.exe,直接安装.(so easy) 2.安装 ...

  10. GitHub命名规则

    ● Added ( 新加入的需求 ) ● Fixed ( 修复 bug ) ● Changed ( 完成的任务 ) ● Updated ( 完成的任务,或者由于第三方模块变化而做的变化 )