第6章 面向对象基本特征
6.8.4多态的应用场景
1. 多态数组
当创建多个不同的子类对象, 而又想统一处理这批对象时, 就可以使用多态数组.
Person[] arr = {new Student(), new Teacher()};
public class Person { private String name; private int age; private String gender; public Person(String name, int age, String gender) { this.name = name; this.age = age; this.gender = gender; } public void setName(String name) { this.name = name; } public String getName() { return name; } public void setAge(int age) { this.age = age; } public int getAge() { return age; } public void setGender(String gender) { this.gender = gender; } public String getGender() { return gender; } public String say() { return "姓名:" + name + ",年龄:" + age + ",性别:" + gender; } public void sayHello() { System.out.println("打个招呼"); } } |
public class Chinese extends Person { private String shuxiang; public Chinese(String name, int age, String gender, String shuxiang) { super(name, age, gender); this.shuxiang = shuxiang; } public void setShuxiang(String shuxiang) { this.shuxiang = shuxiang; } public String getShuxiang() { return shuxiang; } public void spring() { System.out.println("过大年"); } @Override public String say() { return super.say() + ",属相:" + shuxiang; } @Override public void sayHello() { System.out.println("吃了吗?"); } } |
public class American extends Person { private boolean hasGun; public American() {} public American(String name, int age, String gender, boolean hasGun) { super(name, age, gender); this.hasGun = hasGun; } public void setHasGun(boolean hasGun) { this.hasGun = hasGun; } public boolean isHasGun() { return hasGun; } public void christmas() { System.out.println("Merry Christmas!!"); } @Override public void sayHello() { System.out.println("How are you?"); } } |
public class PersonTest { public static void main(String[] args) { Person[] ps = new Person[5]; // 多态数组, 可以保存任意类型的子类对象 ps[0] = new Chinese("张三", 30, "男", "牛"); ps[1] = new American("Jack", 25, "male", true); ps[2] = new Person("某人", 15, "未知"); ps[3] = new American("Rose", 32, "female", false); ps[4] = new Chinese("李四", 40, "女", "羊"); for (Person p : ps) { System.out.println(p.say()); } System.out.println("-------------------------"); // 因为在同一个数组中, 并且所有对象都有age属性, 所以就可以对所有元素进行冒泡排序 for (int i = 0; i < ps.length - 1; i++) { for (int j = 0; j < ps.length - 1 - i; j++) { if (ps[j].getAge() > ps[j + 1].getAge()) { Person tmp = ps[j]; ps[j] = ps[j + 1]; ps[j + 1] = tmp; } } } for (Person p : ps) { System.out.println(p.say()); } } } |
2. 多态参数
在设计方法时, 有的方法内部需要用到另外的类的对象, 但是在设计方法时, 又不需要关心究竟是哪个对象, 只关心这些实参对象都是某个类型的, 此时, 方法的参数的类型就可以写成父类类型的参数,这样的方法的参数就是多态参数.
public void test(Person p) { // 这个方法的参数p的具体类型未知
System.out.println(p.say());
}
main() {
test(new Chinese()); // 在实际调用多态参数方法时, 可以传入任意本类或子类类型的对象
test(new American());
}
x instanceof A:检验x是否为类A的对象,返回值为boolean型。
- 要求x所属的类与类A必须是子类和父类的关系,否则编译错误。
- 如果x属于类A的子类B,x instanceof A值也为true。
public class Person extends Object {…} public class Student extends Person {…} public class Graduate extends Person {…} ------------------------------------------------------------------- public void method1(Person e) { if (e instanceof Person) // 处理Person类及其子类对象 if (e instanceof Student) //处理Student类及其子类对象 if (e instanceof Graduate) //处理Graduate类及其子类对象 } |
|
- 基本数据类型的Casting:
- 自动类型转换:小的数据类型可以自动转换成大的数据类型
如long g=20; double d=12.0f
- 强制类型转换:可以把大的数据类型强制转换(casting)成小的数据类型
如 float f=(float)12.0; int a=(int)1200L
- 对Java对象的强制类型转换称为造型
- 从子类到父类的类型可以自动进行
- 从父类到子类的类型转换必须通过造型(强制类型转换)实现
- 无继承关系的引用类型间的转换是非法的
- 在造型前可以使用instanceof操作符测试一个对象的类型
较高级的基本数据类型 |
较低级的基本数据类型 |
自动类型转化 |
强制类型转化 |
父类(如:Person) |
子类(如:Student) |
向下转型 |
使用instanceof进行判断 |
向上转型 |
class PersonTest5 { public static void test(Person p) { // 多态参数, 提高了兼容性!! p.sayHello(); //方法中父类中定义,所以直接调用, //p.spring(); // 多态副作用, 子类特有成员不能访问 // 必须对对象的真实身份进行检测 if (p instanceof Chinese) { // 造型有风险, 使用须谨慎!!! Chinese ch = (Chinese)p; // 造型: 对象是什么类型还原成什么类型 ch.spring(); // 子类特有的成员的访问,必须要经过造型. } else if (p instanceof American) { ((American)p).christmas(); } else if (p instanceof Person){ System.out.println("普通人一枚"); } } public static void main(String[] args) { Person[] ps = new Person[5]; // 多态数组, 可以保存任意类型的子类对象 Chinese c1 = new Chinese("张三", 30, "男", "牛"); American a1 = new American("Jack", 25, "male", true); Person p1 = new Person("某人", 15, "未知"); American a2 = new American("Rose", 32, "female", false); Chinese c2 = new Chinese("李四", 40, "女", "羊"); ps[0] = c1; ps[1] = a1; ps[2] = p1; ps[3] = a2; ps[4] = c2; System.out.println("-------------------------"); for (Person p : ps) { test(p); // 不同的子类对象作为实参调用方法, 方法的执行也不一样. } } } |
本教程由尚硅谷教育大数据研究院出品,如需转载请注明来源。
第6章 面向对象基本特征相关推荐
- 面向对象第七章,内存的管理,面向对象三大特征封装、继承、多态
###1.内存管理:由JVM来管理的------了解 1)堆: 1.1)存储new出来的对象(包括实例变量) 1.2)垃圾:没有任何引用指向的对象 垃圾回收器(GC)不定时到内存中清扫垃圾, 回收过程 ...
- 【JAVA SE】第六章 面向对象、对象和类以及封装
第六章 面向对象.对象和类以及封装 文章目录 第六章 面向对象.对象和类以及封装 一.面向对象 1.概念 2.面向对象的三大特征 二.对象和类 1.基本概念 2.Java中的对象 3.Java 中的类 ...
- java笔记:第6章 面向对象程序设计
第6章 面向对象程序设计 6.1面向对象技术基础 面向对象三大特征:封装性, 继承性,多态性 封装性:1. 把属性和方法都放在一起 2.实现信息隐藏 类和对象的关系:类是对象的抽象描述.对象是类的实 ...
- Java基础编程\第四-六章(面向对象编程)
Java面向对象学习的三条主线: (第4-6章) 文章目录 面向对象的举例 属性(成员变量)和局部变量 类中方法的声明和使用 Train(圆面积) ==Train(对象数组)== ==对象数组的内存解 ...
- 第五章 面向对象(上)
Java是面向对象的程序设计语言,Java语言提供了定义类.成员变量.方法等最基础的功能,类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量,它们将引用到类的对象 ...
- Java基础学习——第六章 面向对象编程(下)
Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...
- 第3章 面向对象设计基础
第3章 面向对象设计基础 第二章介绍了C#的基本语法,以及使用方法.C#同Java.C++一样是面向对象的编程语言,同时C#更强化了面向对象的概念.本章将介绍面向对象的基础知识并介绍使用C#编写面向 ...
- JavaSE:第5章 面向对象编程(中)
文章目录 JavaSE:第5章 面向对象编程(中) 5.1 OOP特征二:继承性 5.2 方法的重写(override) 5.3 四种访问权限修饰符 5.4 关键字:super 5.5 子类对象实例化 ...
- 第7章 面向对象编程(OOP) 《Kotin 编程思想·实战》
第7章 面向对象编程(OOP) 7.1 面向对象思想 7.2 类与继承 7.2.1 类 7.2.1.1 抽象类 7.2.1.2 接口 7.2.1.3 枚举 7.2.1.4 注解 7.2.1.5 静态类 ...
- c++局部对象是什么_面向对象三大特征: 封装
今日内容 面向对象概述 类和对象的关系 面向对象内存图 private.this关键字和封装 面向对象之构造方法 面向对象三大特征 封装 继承 多态 01. 面向过程和面向对象思想概述 什么是面向过程 ...
最新文章
- 深度丨2018年AI依然要面临解决的的技术难题
- python 比较两个字符串
- 拼音表大全图_一年级语文26个汉语拼音字母表读法+写法+笔顺,孩子现在正需要...
- Linux——Linux C语言编程基础知识
- java nio 文件_Java nio 的文件处理
- C++Breadth First Search 广度优先搜索(附完整源码)
- python爬虫机器_Python常用的机器学习库|python爬虫|python入门|python教程
- 学习Java的相关知识
- 常见三种存储方式DAS、NAS、SAN的架构及比较
- 教你进入有密码 Windows XP 系统的方法
- 95-864-040-源码-HDFS-Flink 和 HDFS 的交互
- 简练软考知识点整理-管理沟通
- weblogic t3协议配置_WebLogic远程Blind XXE高危漏洞,网御星云提供解决方案
- 金山软件遭遇“35岁危机”,曾经风光无限,如今谁能养老?
- win10外接显示器频繁休眠
- MOS管在开关电路中的使用
- ​秋招上岸,机械转码经历和面经​
- 多张图片截取相同位置相同大小
- iOS 访问网络权限
- testDirector如何对软件测试过程进行管理
热门文章
- 英语六级翻译整理【未更新完】
- Python爬虫实现isbn查询豆瓣书籍详细信息
- easy_ui之搭建后台界面(一)
- 校园导航系统课程设计,#校园管理系统
- java计算机毕业设计网上图书销售系统源程序+mysql+系统+lw文档+远程调试
- excel 复制到mysql_excel导入数据到mysql
- 2015最新移动App设计尺寸视觉规范【图文版】(转)
- 数据网络卡顿怎么处理_电信数据网络卡顿怎么办 电信iptv卡顿解决方法
- linux直接点击iso安装win10,iso安装win10,win10iso直接解压安装
- UltraEdit文本编辑器-UE