[think in java] 第8章 多态
多态
“封装”通过合并特征和行为来创建新的数据类型。
“多态”的作用则是消除类型之间的耦合关系。
方法调用绑定
定义:将一个方法调用同一个方法主题关联起来被称为绑定。
若在程序执行前进行绑定(假设有的话,由编译器和链接程序实现),叫前期绑定。在执行时依据对象的类型进行绑定称为后期绑定,或执行时绑定。java中的多态就是通过动态绑定实现的。
java中除了static方法和final方法(private 方法属于final方法)之外,其它全部方法都是后期绑定。
缺陷:域与静态方法
一旦你了解了多态机制,你可能会觉得全部事物都是能够多态的发生的。然而,仅仅有普通的方法调用是能够多态的。假设你訪问某个域field,这个訪问将在编译期进行解析。看以下的样例:
class Super{
public int filed = 0;
public int getFiled(){
return filed;
}
} class Sub extends Super{
public int filed = 1;
public int getFiled(){
return filed;
} public int getSuperFiled(){
return super.filed;
}
}
public class FiledAccess { public static void main(String [] agrs){
Super sup = new Sub();
System.out.println("sup.field = " + sup.filed + ", sup.getField() = "+
sup.getFiled()); Sub sub = new Sub();
System.out.println("sub.field = " + sub.filed + ", sub.getField() = "+
sub.getFiled() + ", sub.getSuperField() = " + sub.getSuperFiled()); } }
sup.field = 0, sup.getField() = 1
sub.field = 1, sub.getField() = 1, sub.getSuperField() = 0
当Sub转型为Super引用时,不论什么域訪问操作都将由编译器解析,因此不是多态的。在本例中,为Super.field和Sub.field分配了不同的存储空间。这样,Sub实际上包括两个成为field的域:他自己的和它从Super处得到的。然而在引用Sub中的filed时所产生的默认域并不是Super版本号的field域。因此,为了得到Super.filed,必须显示的指明super.field。
这个问题看起来非常easy令人混淆,可是实际中却并不常发生。由于依据设计原则,我们经常将全部的域设置为private的,因此不能直接訪问他们,仅仅能通过方法来訪问。
总结:方法多态,域不多态訪问。
静态方法相同不具有多态性。由于静态方法是与类相关联的,而不是与单个对象相关联。看以下的样例消化一下^.^~:
class StaticSuper{
public static String staticGet(){
return "Base staticGet()";
} public String dynamicGet(){
return "Base dynamicGet()";
}
} class StaticSub extends StaticSuper{
public static String staticGet(){
return "Derived staticGet()";
} public String dynamicGet(){
return "Derived dynamicGet()";
}
}
public class StaticPolymorphism {
public static void main(String [] args){
StaticSuper sup = new StaticSub();
System.out.println(sup.staticGet());
System.out.println(sup.dynamicGet());
}
} output:
Base staticGet()
Derived dynamicGet()
參考:《thinking in java》
[think in java] 第8章 多态的更多相关文章
- Java 第18章 多态
18 章 --> 多态 继承: extends 抽象类 abstract (限制类的实例化) 抽象方法 public abstract void show(); //抽象方法只有方法的声明,没 ...
- java第三章多态
多态: 多态不仅可以减少代码量,还可以提高代码的扩展和可维护性 (通过一个方法可以对所有所需方法一个运用)多态具体表现多种形态能力的特征,同一个实现接口使用不同实例而执行不同的操作 实现多态的三个条件 ...
- JAVA基础第二章-java三大特性:封装、继承、多态
业内经常说的一句话是不要重复造轮子,但是有时候,只有自己造一个轮子了,才会深刻明白什么样的轮子适合山路,什么样的轮子适合平地! 我将会持续更新java基础知识,欢迎关注. 往期章节: JAVA基础第一 ...
- “全栈2019”Java第九十一章:内部类具有多态特性吗?
难度 初级 学习时间 10分钟 适合人群 零基础 开发语言 Java 开发环境 JDK v11 IntelliJ IDEA v2018.3 文章原文链接 "全栈2019"Java第 ...
- Java入门第二季——第4章 多态
第4章 多态 多态性是允许你将父对象设置成为和一个或更多的他的子对象相等的技术,赋值之后,父对象就可以根据当前赋值给它的子对象的特性以不同的方式运作 4-1 Java 中的多态 注意:不能通过父类的引 ...
- java面向对象编程--第九章 多态和抽象
9.1多态 在生物学中,是指一个生物或物种可以有多种不同的形式或阶段: 在OOP中,多态是指一个对象有多种形式的能力. 多态可以说是面向对象编程的精髓所在.java中之所以引入多态的概念,原因之一是它 ...
- 20190819 On Java8 第九章 多态
第九章 多态 向上转型回溯 可扩展性 由于多态机制,在一个设计良好的面向对象程序中,许多方法,只与基类接口通信.这样的程序是可扩展的,因为可以从通用的基类派生出新的数据类型,从而添加新的功能.那些操纵 ...
- java提高篇之理解java的三大特性——多态
面向对象编程有三大特性:封装.继承.多态. 封装隐藏了类的内部实现机制,可以在不影响使用的情况下改变类的内部结构,同时也保护了数据.对外界而已它的内部细节是隐藏的,暴露给外界的只是它的访问方法. 继承 ...
- Java基础学习小记--多态
题外话:总结了多年的学习心得,不得不说,睡眠是一个学习者的必需品!所谓"早起毁一天"不是没有道理哪,特别对Coders来说,有几天不是加班到夜里.好吧,我承认对于初学Java的我, ...
随机推荐
- 多校连萌15-8-12#A
#include <cstdio> #include <iostream> #include <algorithm> #include <queue> ...
- js进阶 14-2 如何用ajax验证登陆状态(这里用load方法)
js进阶 14-2 如何用ajax验证登陆状态(这里用load方法) 一.总结 一句话总结:$('#test').load('test.php?password=1234560'),这样就get方式提 ...
- Php无限层级并显示层级数
今天在处理递归无限层级菜单时,遇到一个稍微烧脑的问题,如何显示当前节点所在的层级数.废话不多说,我们先看个直观的无限层级: <?php // 这里的arr是直接从数据库取出的,仅作为测试数据 $ ...
- [D3] Select DOM Elements with D3 v4
Before you can create dazzling data driven documents, you need to know how D3 accesses the DOM. This ...
- SourceInsight打开的工程中中文字体显示乱码的问题
1.在ubuntu下进入文件所在目录执行指令“file *”来查看文件的编码方式,sourceinsight有些版本只支持GB2312和ascil码,所以需要编码转换: 2.在ubuntu下可以通过i ...
- Qt浅谈之一:内存泄露(总结),对于QWidget可以setAttribute(Qt::WA_DeleteOnClose),而且绝对不能手动删除栈上的对象
一.简介 Qt内存管理机制:Qt 在内部能够维护对象的层次结构.对于可视元素,这种层次结构就是子组件与父组件的关系:对于非可视元素,则是一个对象与另一个对象的从属关系.在 Qt 中,在 Qt 中,删除 ...
- js进阶 12-5 jquery中表单事件如何使用
js进阶 12-5 jquery中表单事件如何使用 一.总结 一句话总结:表单事件如何使用:可元素添加事件监听,然后监听元素,和javase里面一样. 1.表单获取焦点和失去焦点事件有哪两组? 注意是 ...
- MongoDB 管理
1.给数据库增加分片功能 mongos> use admin mongos> db.runCommand({enablesharding:"cipnet"}) mong ...
- 【a101】高精度实数加法
Time Limit: 1 second Memory Limit: 2 MB 问题描述 给出两个高精度正实数(可以含有小数点或没有),最长200位,字符串读入 求它们的和,小数部分末尾的0要舍去. ...
- LVS负载均衡+动静分离+高可用(nginx+tomcat+keepalived)
文章目录 [隐藏] 一.环境介绍 二.环境安装 1.安装JDK 2.两台服务器安装tomcat 3.nginx安装 4.keepalive安装 三.负载均衡 四.动静分离 五.keepalive高可用 ...