1. 多态数组

  • 数组的定义类型为父类类型,里面保存的实际元素类型为子类类型

  • 应用实例:现有一个继承结构如下:要求创建 1 个 Person 对象、2 个 Student 对象和 2 个 Teacher 对象, 统一放在数组中,并调用每个对象say方法。

public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String say(){return name + "\t" + age;}
}
public class Student extends Person {private double score;public Student(String name, int age, double score) {super(name, age);this.score = score;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}//重写父类say方法@Overridepublic String say() {return super.say() + " score=" + score;}
}
public class Teacher extends Person {private double salary;public Teacher(String name, int age, double salary) {super(name, age);this.salary = salary;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}//重写父类 say 方法@Overridepublic String say() {return super.say() + " salary=" + salary;}
}
public class PloyArray {public static void main(String[] args) {Person[] person = new Person[5];person[0] = new Person("jack", 20);person[1] = new Student("mike", 21, 90);person[2] = new Student("smith", 18, 100);person[3] = new Teacher("scott", 30, 20000);person[4] = new Teacher("king", 50, 30000);//循环遍历多态数组,调用 say() 方法for (int i = 0; i < person.length; i++) {//提示:Person[i]编译类型是 person,运行类型是根据实际情况JVM来判断System.out.println(person[i].say()); //动态绑定机制}}
}

  • 应用实例升级:如何调用子类特有的方法,比如:Teacher 有一个 teach()方法, Student 有一个 study() 方法,怎么调用?
public class Person {private String name;private int age;public Person(String name, int age) {this.name = name;this.age = age;}public String getName() {return name;}public void setName(String name) {this.name = name;}public int getAge() {return age;}public void setAge(int age) {this.age = age;}public String say(){return name + "\t" + age;}
}
public class Student extends Person {private double score;public Student(String name, int age, double score) {super(name, age);this.score = score;}public double getScore() {return score;}public void setScore(double score) {this.score = score;}//重写父类say方法@Overridepublic String say() {return super.say() + " score=" + score;}//特有方法public void study(){System.out.println("学生 " + getName() + " 正在学Java课程");}
}
public class Teacher extends Person {private double salary;public Teacher(String name, int age, double salary) {super(name, age);this.salary = salary;}public double getSalary() {return salary;}public void setSalary(double salary) {this.salary = salary;}//重写父类 say 方法@Overridepublic String say() {return super.say() + " salary=" + salary;}//特有方法public void teach(){System.out.println("老师 " + getName() + " 正在讲Java课程");}
}
public class PloyArray {public static void main(String[] args) {Person[] person = new Person[5];person[0] = new Person("jack", 20);person[1] = new Student("mike", 21, 90);person[2] = new Student("smith", 18, 100);person[3] = new Teacher("scott", 30, 20000);person[4] = new Teacher("king", 50, 30000);//循环遍历多态数组,调用 say() 方法for (int i = 0; i < person.length; i++) {//提示:Person[i]编译类型是 person,运行类型是根据实际情况JVM来判断System.out.println(person[i].say()); //动态绑定机制//使用类型判断 + 向下转型if (person[i] instanceof Student){//判断 person[i]运行类型是不是StudentStudent student = (Student) person[i];//向下转型student.study();//也可以使用  (Student) person[i].study();}else if (person[i] instanceof Teacher) {Teacher teacher = (Teacher) person[i];teacher.teach();}else if (person[i] instanceof Person){}else{System.out.println("你的类型有误,请自行检查");}}}
}

【JavaSE】多态数组的使用相关推荐

  1. 虚析构函数? vptr? 指针偏移?多态数组? delete 基类指针 内存泄漏?崩溃?...

    五条基本规则: 1.如果基类已经插入了vptr, 则派生类将继承和重用该vptr.vptr(一般在对象内存模型的顶部)必须随着对象类型的变化而不断地改变它的指向,以保证其值和当前对象的实际类型是一致的 ...

  2. Java数组讲解(数组,字符串数组,多态数组)

    数组的定义 数组是相同类型数据的有序集合. 数组描述的是相同类型的若干个数据,按照一定的先后次序排列组合而成. 其中,每一个数据称作一个数组元素,每个数组元素可以通过一个下标来访问它们. 数组的四个基 ...

  3. java 多态的应用——多态数组和多态参数详解

    多态数组 概述 使用 演示 多态参数 定义 举栗 旅行者请吃饭 骑士团发工资 关于接口的多态参数和多态数组 接口的多态参数 接口的多态数组 一.多态数组 1.概述 : 多态数组,需要满足数组类型定义为 ...

  4. JavaSE(三)——数组及继承

    文章目录 1. 数组定义 1.1 一维数组 1.1.1 实例 1.1.2 冒泡排序 1.2 二维数组 1.3 数组和链表的区别 2. Arrays工具类 3. 继承 3.1 类的继承格式 3.2 继承 ...

  5. Javase多态(对多态的理解、多态的体现)

    前言 刚开始学Java的时候对多态这个概念一直没弄太明白,随着后面的学习无意中都在用着多态,又看了一些文章决定整理一下! 参考文章: https://www.cnblogs.com/zhai1997/ ...

  6. javase(数组练习)

    ①统计数组{20,45,78,34,16,3,99,56}中大于50的有多少个.小于50的有多少个并打印输出. 解析:首先需要定义一个数组并初始化,将{20,45,78,34,16,3,99,56}存 ...

  7. javaSE复习--数组

    宋红康老师 01-数组概述与一维数组的基本使用 1. 数组的理解(Array)概念:是多个相同类型数据按一定顺序排列的集合,并使用一个名字命名,并通过编号的方式对这些数据进行统一管理.简称:多个数据的 ...

  8. JavaSE 多态 抽象类 接口

    day09目录: 多态(动态绑定机制)多态的概述多态的成员访问特点多态的好处和弊端向上转型和向下转型多态内存图 抽象类抽象类的概述抽象类的成员特点抽象类的案例 接口接口的概述接口的成员特点类与类,类与 ...

  9. JavaSE面向对象:继承、多态、Super、Object类、重写、static、final、静态成员、懒汉式、饿汉式、单例设计模式、初始化块、抽象类、抽象方法、接口

    感谢尚硅谷免费提供的视频 继承 ** 理解 ** 生活中的继承:子女继承了父母的财产或相貌或才华 java中的继承:一个类不用自己定义属性或方法,就已经具备了另一个类的属性和方法 把这种现象称为jav ...

最新文章

  1. thymeleaf+layui加载页面渲染时,TemplateProcessingException: Could not parse as expression:
  2. 会话的清除与建立网络磁盘
  3. 全面了解HTTP和HTTPS(开发人员必备)
  4. JAVA入门级教学之(package和import)
  5. linux判断redis是否启动成功_087、Redis
  6. BZOJ4591 SHOI2015超能粒子炮·改(卢卡斯定理+数位dp)
  7. java正则 链接_Java使用正则表达式匹配获取链接地址的方法示例
  8. 【C】define宏展开 typedef类型重命名
  9. web端跨域调用webapi
  10. js 处理 cookie的存储与删除
  11. 基于PHP+MySQL图书管理系统的设计与实现
  12. 短视频标题自动生成工具,助你打造爆款标题
  13. java ssh 连接mysql数据库_Java通过ssh连接访问数据库
  14. macOS多版本虚拟机镜像免费下载(及教程)
  15. 基于单片机控制的程控有源滤波器电路
  16. 基于JPVideoPlayerKit的小视频播放
  17. Django 文档 -- 记录我的Django学习之旅
  18. selenium登录豆瓣网
  19. Java基于ssm的超市多商家系自提系统
  20. 那些容易被忽视但又非常重要的安全知识

热门文章

  1. 什么是真正的架构设计?某厂十年Java经验让我总结出了这些,不愧是我
  2. 腾讯云运维工程师认证模拟题
  3. 关于腾讯云域名访问问题的几个可能解决方案
  4. f5负载mysql_F5 LTM 负载均衡理论 | 奕中世界
  5. 工业强国之路任重道远,制造业乘“疾风”突出重围
  6. 一只喵的西行记-3 唱斑马斑马的黑马
  7. SDR软件移步BG1ICA.vicp.net:8888
  8. sql server数据库练习
  9. Android-如何自定义crash处理器
  10. 2016..8.25 切题总结