Java面向对象程序设计三大支柱--多态
面向对象程序设计的三大支柱是封装、继承和多态。本篇文章主要讲述多态的相关知识。
一、概述
1.定义
多态意味着父类的变化可以指向子类对象;它是同一行为具有不同表现形式或形态的能力。
ps:一个类实际定义了一种类型。子类定义的类型称为子类型;父类定义的类型称为父类型。
2.要实现多态需要满足一下几个条件:
- 有继承关系
- 有方法重写(抽象方法)
- 有父类引用指向子类对象
3. 多态的优点
- 消除类型之间的耦合关系
- 可替换性
- 可扩充性
- 接口性
- 灵活性
- 简化性
4. 多态的弊端
(1)不能使用子类的特有功能
如果想使用,一种方法就是创建子类对象调用方法(可以但是很多时候不合理,而且太占内存),另一种方式把父类的引用强制转换为子类的引用(向下转型)
(2)对象间的转型问题
向上和向下,其实就是父和子的关系,父为上,子为下。
向上转型
Fu f = new Zi();
向下转型
Zi z = (Zi)f; // 要求f必须能够转为Zi
举例说明
class Fu {public void show() {System.out.println("show Fu");}
}class Zi {public void show() {System.out.println("show Zi");}public void method() {System.out.println("method Zi");}
}class DuoTaiDemo2 {public static void main(String[] args) {Fu fu = new Zi();fu.show();// fu.method(); 错误,不能使用子类特有功能// 通过转型可以使用子类特有功能// 创建子类对象// 可以但是不推荐Zi zi = new Zi();zi.show();zi.method();// 要求f必须能够转为Zi// 推荐()Zi zi2 = (Zi)fu;}
}
5.与生活中的实例进行类比
现实中,比如我们按下 F1 键这个动作:
- 如果当前在 Flash 界面下弹出的就是 AS 3 的帮助文档;
- 如果当前在 Word 下弹出的就是 Word 帮助;
- 在 Windows 下弹出的就是 Windows 帮助和支持。
同一个事件发生在不同的对象上会产生不同的结果。
二、格式
parent p = new Chile();
- 把子的对象赋值给父
- 当使用多态方式调用方法时,首先检查父类中是否有该方法,如果没有,则编译错误;如果有,再去调用子类的同名方法。
这里先举几个例子帮助大家理解:
例1
public class PolymorphismDemo{public static void main(String[] args){displayObject(new CircleFromSimpleGeometricObject(1,"red",false));displayObject(new RectangleFromSimpleGeometricObject(1,"red",true));}public static void displayObject(SimpleGeometricObject object){System.out.prinyln("Created on"+object.getDateCreaded()+".Color is"+object.getColor());}
}
运行结果:
Created on Mon Mar 09 19:25:20 EDT 2011.Color is red
Created on Mon Mar 09 19:25:20 EDT 2011.Color is black
方法displayObject 具有GeometricObject类型的参数。可以通过传递任何一个GeometricObject的实例和new CircleFromSimpleGeometricObject(1,"red",false)来调用displayObject 。使用父类对象的地方都可以使用子类对象。这就是通常所说的多态。
例2
public class Test {public static void main(String[] args) {show(new Cat()); // 以 Cat 对象调用 show 方法show(new Dog()); // 以 Dog 对象调用 show 方法Animal a = new Cat(); // 向上转型 a.eat(); // 调用的是 Cat 的 eatCat c = (Cat)a; // 向下转型 c.work(); // 调用的是 Cat 的 work} public static void show(Animal a) {a.eat(); // 类型判断if (a instanceof Cat) { // 猫做的事情 Cat c = (Cat)a; c.work(); } else if (a instanceof Dog) { // 狗做的事情 Dog c = (Dog)a; c.work(); } }
}abstract class Animal { abstract void eat();
} class Cat extends Animal { public void eat() { System.out.println("吃鱼"); } public void work() { System.out.println("抓老鼠"); }
} class Dog extends Animal { public void eat() { System.out.println("吃骨头"); } public void work() { System.out.println("看家"); }
}
运行结果:
吃鱼 抓老鼠 吃骨头 看家 吃鱼 抓老鼠
三、多态中成员的访问方法
在学习多态时,有一句广为流传的口诀:编译看左边,运行看右边。但其实它是针对非静态方法说的,而成员变量、静态方法都是只看左边。
下面举一个例子来证明上述结论:
父类
public class Father {int num = 520;static void staticMethod() {System.out.println("父类静态方法");}void normalMethod() {System.out.println("父类普通方法");}
}
子类
class Son extends Father {int num = 1314;static void staticMethod() {System.out.println("子类静态方法");}@Overridevoid normalMethod() {System.out.println("子类普通方法");}
}
测试类
class Test {public static void main(String[] args) {Father f = new Son();// 与父类一致System.out.println(f.num);// 与父类一致f.staticMethod();// 编译时与父类一致,运行时与子类一致f.normalMethod();Son z = new Son();System.out.println(z.num);z.staticMethod();z.normalMethod();}
}
运行结果
520
父类静态方法
子类普通方法
1314
子类静态方法
子类普通方法
四、多态的实现形式
1.重写
2.接口
- 生活中的接口最具代表性的就是插座,例如一个三接头的插头都能接在三孔插座中,因为这个是每个国家都有各自规定的接口规则,有可能到国外就不行,那是因为国外自己定义的接口类型。
- java中的接口类似于生活中的接口,就是一些方法特征的集合,但没有方法的实现。
3.抽象类和抽象方法
Java面向对象程序设计三大支柱--多态相关推荐
- 允许使用抽象类类型 isearchboxinfo 的对象_Java面向对象编程三大特征 - 多态
Java面向对象编程三大特征 - 多态 本文关键字:Java.面向对象.三大特征.多态 多态是面向对象编程的三大特征之一,是面向对象思想的终极体现之一.在理解多态之前需要先掌握继承.重写.父类引用指向 ...
- Java学习笔记二十五:Java面向对象的三大特性之多态
Java面向对象的三大特性之多态 一:什么是多态: 多态是同一个行为具有多个不同表现形式或形态的能力. 多态就是同一个接口,使用不同的实例而执行不同操作. 多态性是对象多种表现形式的体现. 现实中,比 ...
- Day55-每日一道Java面试题-Java 面向对象编程三大特性: 封装 继承 多态
Java 面向对象编程三大特性: 封装 继承 多态 封装 封装把一个对象的属性私有化,同时提供一些可以被外界访问的属性的方法,如果属性不想被外界访问,我们大可不必提供方法给外界访问.但是如果一个类没有 ...
- 面向对象的三大支柱:继承,封装,多态
/* 面向对象的三大支柱:继承,封装,多态. */ 下面我就对面向对象的三大支柱简单的谈一谈,自己在学习过程中的一些领悟. 封装: 封装时指隐藏对象的属性和实现细节,仅仅对外提供公共的访问方式.在封装 ...
- 20155328 《Java程序设计》 实验二(Java面向对象程序设计) 实验报告
20155328 <Java程序设计> 实验二(Java面向对象程序设计) 实验报告 单元测试 一.单元测试和TDD 编程时需理清思路,将编程需求等想好,再开始编.此部分可用伪代码实现. ...
- java面向对象程序设计第三版_JAVA面向对象程序设计之创建型设计模式
[本文详细介绍了JAVA面向对象程序设计中的创建型设计模式,欢迎读者朋友们阅读.转发和收藏!] 1 基本概念 1.1 什么是设计模式 设计模式( Design pattern )是一套被反复使用.多数 ...
- 20175333曹雅坤 实验二 Java面向对象程序设计
实验二 Java面向对象程序设计 实验内容 1. 初步掌握单元测试和TDD 2. 理解并掌握面向对象三要素:封装.继承.多态 3. 初步掌握UML建模 4. 熟悉S.O.L.I.D原则 5. 了解设计 ...
- 20145122《Java面向对象程序设计》实验二实验报告
实验名称: Java面向对象程序设计 实验内容: 初步掌握单元测试和TDD 理解并掌握面向对象三要素:封装.继承.多态 初步掌握UML建模 熟悉S.O.L.I.D原则 了解设计模式 PSP时间 步骤 ...
- Java第二次实验报告——Java面向对象程序设计
北京电子科技学院(BESTI) 实 验 报 告 课程名称:java程序设计实验 班级:1352 姓名:洪韶武 学号:20135219 成绩: ...
最新文章
- Java面试题大汇总,2021年附答案解析
- python定义变量并赋值_Python 变量类型及变量赋值
- 开源免费的HTML5游戏引擎
- 手绘风格的数据可视化 (萌萌风)Sketchify,及其他可视化工具(商业风)
- beetl 时间输出格式化
- web容器(02):tomcat配置监控
- java openmp库_OpenMP的环境变量及库函数
- 弹载计算机的上市公司,基于无线通信的弹载计算机系统BIT设计
- Lambda表达式将数组/字符串列表转换为数组/整数列表
- 今日花生价格多少钱一斤?
- “Java引领技术人生”专题讲座——Java畅销书作者李刚巡讲活动
- java p2p实例_java文件p2p传输
- Java后端技术概览
- html5shiv源码,前端开发必配置:html5shiv.js和respond.min.js的作用说明!
- oracle12c分片应用场景,Oracle 12cR2数据库(Oracle12.2)新特性之四:Sharding 的增强...
- 中小企业成本的会计核算方法
- 更改已生成的exe文件的ico图标
- 让Fireball CodeEditor控件支持中文
- 超分辨率重建——关于YIQ空间
- codeforces 730 A Toda 2
热门文章
- 你真的会用搜索引擎吗?
- AIQ - deeplearning.ai 全套吴恩达老师的深度学习课程笔记及资源在线阅读
- Double-checked locking should not be used
- 看电影(C++结构体练习题)
- 不懂数据库索引的底层原理?那是因为你心里没点b树
- 滤波器原理及其作用计算机网络,滤波器的种类/作用/原理
- Educoder--Java面向对象(第八章) - 文件类
- Mac 电脑启动的快捷键
- intel 服务器芯片组 c6,Intel 10nm至强主板偷跑:型号“IMB700” 基于C621A芯片组
- 张量分析入门笔记 (Tensor For Beginner)