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 )

  1. 基本数据类型的Casting:

    • 自动类型转换:小的数据类型可以自动转换成大的数据类型

如long g=20;           double d=12.0f

  • 强制类型转换:可以把大的数据类型强制转换(casting)成小的数据类型

如 float f=(float)12.0;   int a=(int)1200L

  1. 对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. 面向对象第七章,内存的管理,面向对象三大特征封装、继承、多态

    ###1.内存管理:由JVM来管理的------了解 1)堆: 1.1)存储new出来的对象(包括实例变量) 1.2)垃圾:没有任何引用指向的对象 垃圾回收器(GC)不定时到内存中清扫垃圾, 回收过程 ...

  2. 【JAVA SE】第六章 面向对象、对象和类以及封装

    第六章 面向对象.对象和类以及封装 文章目录 第六章 面向对象.对象和类以及封装 一.面向对象 1.概念 2.面向对象的三大特征 二.对象和类 1.基本概念 2.Java中的对象 3.Java 中的类 ...

  3. java笔记:第6章 面向对象程序设计

    第6章 面向对象程序设计 6.1面向对象技术基础 面向对象三大特征:封装性, 继承性,多态性 封装性:1. 把属性和方法都放在一起  2.实现信息隐藏 类和对象的关系:类是对象的抽象描述.对象是类的实 ...

  4. Java基础编程\第四-六章(面向对象编程)

    Java面向对象学习的三条主线: (第4-6章) 文章目录 面向对象的举例 属性(成员变量)和局部变量 类中方法的声明和使用 Train(圆面积) ==Train(对象数组)== ==对象数组的内存解 ...

  5. 第五章 面向对象(上)

    Java是面向对象的程序设计语言,Java语言提供了定义类.成员变量.方法等最基础的功能,类可被认为是一种自定义的数据类型,可以使用类来定义变量,所有使用类定义的变量都是引用变量,它们将引用到类的对象 ...

  6. Java基础学习——第六章 面向对象编程(下)

    Java基础学习--第六章 面向对象编程(下) 一.关键词:static 1. static关键字的引入 当我们编写一个类时,其实就是在描述其对象的属性和行为,而并没有产生实质上的对象,只有通过new ...

  7. 第3章 面向对象设计基础

    第3章  面向对象设计基础 第二章介绍了C#的基本语法,以及使用方法.C#同Java.C++一样是面向对象的编程语言,同时C#更强化了面向对象的概念.本章将介绍面向对象的基础知识并介绍使用C#编写面向 ...

  8. JavaSE:第5章 面向对象编程(中)

    文章目录 JavaSE:第5章 面向对象编程(中) 5.1 OOP特征二:继承性 5.2 方法的重写(override) 5.3 四种访问权限修饰符 5.4 关键字:super 5.5 子类对象实例化 ...

  9. 第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 静态类 ...

  10. c++局部对象是什么_面向对象三大特征: 封装

    今日内容 面向对象概述 类和对象的关系 面向对象内存图 private.this关键字和封装 面向对象之构造方法 面向对象三大特征 封装 继承 多态 01. 面向过程和面向对象思想概述 什么是面向过程 ...

最新文章

  1. 深度丨2018年AI依然要面临解决的的技术难题
  2. python 比较两个字符串
  3. 拼音表大全图_一年级语文26个汉语拼音字母表读法+写法+笔顺,孩子现在正需要...
  4. Linux——Linux C语言编程基础知识
  5. java nio 文件_Java nio 的文件处理
  6. C++Breadth First Search 广度优先搜索(附完整源码)
  7. python爬虫机器_Python常用的机器学习库|python爬虫|python入门|python教程
  8. 学习Java的相关知识
  9. 常见三种存储方式DAS、NAS、SAN的架构及比较
  10. 教你进入有密码 Windows XP 系统的方法
  11. 95-864-040-源码-HDFS-Flink 和 HDFS 的交互
  12. 简练软考知识点整理-管理沟通
  13. weblogic t3协议配置_WebLogic远程Blind XXE高危漏洞,网御星云提供解决方案
  14. 金山软件遭遇“35岁危机”,曾经风光无限,如今谁能养老?
  15. win10外接显示器频繁休眠
  16. MOS管在开关电路中的使用
  17. ​秋招上岸,机械转码经历和面经​
  18. 多张图片截取相同位置相同大小
  19. iOS 访问网络权限
  20. testDirector如何对软件测试过程进行管理

热门文章

  1. 英语六级翻译整理【未更新完】
  2. Python爬虫实现isbn查询豆瓣书籍详细信息
  3. easy_ui之搭建后台界面(一)
  4. 校园导航系统课程设计,#校园管理系统
  5. java计算机毕业设计网上图书销售系统源程序+mysql+系统+lw文档+远程调试
  6. excel 复制到mysql_excel导入数据到mysql
  7. 2015最新移动App设计尺寸视觉规范【图文版】(转)
  8. 数据网络卡顿怎么处理_电信数据网络卡顿怎么办 电信iptv卡顿解决方法
  9. linux直接点击iso安装win10,iso安装win10,win10iso直接解压安装
  10. UltraEdit文本编辑器-UE