Java实例讲解多态数组的使用
作者:Demo龙 发布时间:2021-08-30 19:34:46
多态概述
多态概念:所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用变量调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。
多态存在的三个必要条件
1.要有继承关系的存在(实现接口也是一种继承关系)
2.要有方法的重写
3.要有父类引用指向子类对象
注:
1. 运行方法看运行类型,属性看编译类型
2.在方法中调用属性,无特殊情况为本类属性
3.若类型中没有调用的方法,遵循向上查询
1.向上转型
1.对象的向上转型,其实就是多态写法:
格式: 父类名称 对象名 = new 子类名称();
含义:右侧创建了一个子类对象,把它当作父类来看待使用。
Person person=new student();
创建了一个学生对象,当作人看待,没有问题。
此时的编译类型为person,运行类型为学生;
注意事项:向上转型一定是安全的。从小范围转向了大范围,从小范围的猫,向上转换成为更大范围的动物
2.向下转型
2.对象的向下转型,其实就是一个还原的动作:
格式: 子类名称 对象名 =(子类名称) 父类对象;
含义:将子类还原,还原成为本来的子类对象
Cat cat =(Cat) animal;//本来是猫,向上转型成为动物,还原回来成为本来的猫 注意事项:
a.必须保证对象本来创建的时候就是猫,才能向下转型成为猫
b.如果对象创建的时候不是猫,现在非要向下转型成为猫,就会报错
多态数组
建立一个polyArr包
Arrtest.java
package com.polyArr;
public class Arrtest {
public static void main(String[] args) {
//父类的引用可以指向子类的对象
Person []p=new Person[5];
p[0]=new Person("aaa",15);
p[1]=new Student("asas",16, 55);
p[2]=new Student("ccc",17, 66);
p[3]=new Teacher("nnn",18, 2000);
p[4]=new Teacher("mmm",19, 6666);
for(int i=0;i< p.length;i++)
{
//动态绑定机制
//person[i]编译类型是Person,运行类型是根据实际情况判断的
System.out.println(p[i].say());
}
}
}
Person.java
package com.polyArr;
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="+name+" age="+age;
}
}
Student.java
package com.polyArr;
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;
}
public String say(){
return super.say()+" score="+score;
}
}
Teacher.java
package com.polyArr;
public class Teacher extends Person {
private int salary;
public Teacher(String name, int age, int salary) {
super(name, age);
this.salary = salary;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public String say(){
return super.say()+" salary="+salary;
}
}
运行结果
多态数组+向下转型
instanceof关键字
运算符是用来在运行时指出对象是否是特定类的一个实例。instanceof通过返回一个布尔值来指出,这个对象是否是这个特定类或者是它的子类的一个实例。
用法: result = object instanceof class
result为boolean类型
参数:
Result:布尔类型。
Object:必选项。任意对象表达式。
Class:必选项。任意已定义的对象类。
说明:
如果 object 是 class 的一个实例,则 instanceof 运算符返回 true。如果 object
不是指定类的一个实例,或者 object 是 null,则返回 false。
但是instanceof在Java的编译状态和运行状态是有区别的;
注:
在编译状态中,class可以是object对象的父类,自身类,子类。在这三种情况下Java编译时不会报错。
在运行转态中,class可以是object对象的父类,自身类,不能是子类。在前两种情况下result的结果为true,最后一种为false。但是class为子类时编译不会报错。运行结果为false。
建立一个polyArr包
Arrtest.java
package com.polyArr;
public class Arrtest {
public static void main(String[] args) {
//父类的引用可以指向子类的对象
Person []p=new Person[5];
p[0]=new Person("aaa",15);
p[1]=new Student("asas",16, 55);
p[2]=new Student("ccc",17, 66);
p[3]=new Teacher("nnn",18, 2000);
p[4]=new Teacher("mmm",19, 6666);
for(int i=0;i< p.length;i++)
{
//动态绑定机制
//person[i]编译类型是Person,运行类型是根据实际情况判断的
System.out.println(p[i].say());
if(p[i] instanceof Student)
{
Student t1=(Student) p[i];
System.out.println(t1.learn());
}
else if(p[i] instanceof Teacher)
{
Teacher t1=(Teacher) p[i];
System.out.println(t1.teach());
}
}
}
}
Person.java
package com.polyArr;
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="+name+" age="+age;
}
}
Student.java
package com.polyArr;
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;
}
public String say(){
return super.say()+" score="+score;
}
public String learn(){
return getName()+"正在听讲";
}
}
Teacher.java
package com.polyArr;
public class Teacher extends Person {
private int salary;
public Teacher(String name, int age, int salary) {
super(name, age);
this.salary = salary;
}
public int getSalary() {
return salary;
}
public void setSalary(int salary) {
this.salary = salary;
}
public String say(){
return super.say()+" salary="+salary;
}
public String teach(){
return getName()+"正在上课";
}
}
运行结果
来源:https://zal321.blog.csdn.net/article/details/124266477


猜你喜欢
- 概述附件,指随同文件发出的有关文件或物品。在PDF文档中,我们可以添加同类型的或其他类型的文档作为附件内容,而PDF中附件也可以分为两种存在
- 为了是java中的对象便于理解,我们可以使用一款比较好用的数据格式,在数据解析的时候也会经常用到,它就是JSON。在这里我们转换对象和字符串
- XSS ,全名:cross-site scripting(跨站点脚本),是当前 web 应用中最危险和最普遍的漏洞之一。攻击者尝试注入恶意脚
- 前言数据库的性能优化行业里面普遍偏少,今天这篇希望给大家带来点帮助SQLite是个典型的嵌入式DBMS,它有很多优点,它是轻量级的,在编译之
- 一、原文翻译WorkManager API 可以很容易的指定可延迟的异步任务。允许你创建任务,并把它交给WorkManager来立即运行或在
- 首先我们先创建项目 注意:创建SpringBoot项目时一定要联网不然会报错项目创建好后我们首先对 application.yml 进行编译
- 今天使用mybatis-plus自动填充插入和更新时间有8小时时差后来发现只需要修改一下mybaits连接的url即可原先我是用的datas
- 说明:在填写表数据时当输入完一个文本框后,输入下一个文本框时需要用Tab键切换,但是有的人喜欢用Enter键切换下一个,此方法是Enter取
- 1介绍MVC框架是什么MVC全名是Model View Controller,是模型(model)-视图(view)-控制器(control
- 1.先看源码文档/** * Indicates that an annotation type is automatically inher
- java解决动态配置字段需求是否在开发中遇到有像下图一样管理员配置多个字段让用户填写的需求我的实现方式是通过数据库存储动态json的显示实现
- mybatis3中增加了使用注解来配置Mapper的新特性,本篇文章主要介绍其中几个@Provider的使用方式,他们是:@SelectPr
- FileOutPutStream:子类,写出数据的通道步骤:1.获取目标文件2.创建通道(如果原来没有目标文件,则会自动创建一个)3.写入数
- 1) async / await使用 async / await 模式,可以在执行代码块操作的时候不会阻塞 UI 或者当前的线程。即使该操作
- MyBatis查询数据赋值给List集合数据缺少今天在使用MyBatis查询数据时,发现查出来的数据和List集合的大小不一致,如下图所示,
- 1、基础知识:Java解析XML一般有四种方法:DOM、SAX、JDOM、DOM4J。2、使用介绍1)、DOM(1)简介由W3C(org.w
- 本文实例为大家分享了java实现猜字母游戏的具体代码,供大家参考,具体内容如下案例需求:StepOne:系统随机生成一组随机的字符数组(不重
- 本教程源码https://github.com/bestaone/HiAuth源码比较全面,教程我就只介绍关键代码了,喜欢的点个star,谢
- 在java的开发中,java开发人员建议,尽量少用内部类,要把内部类提出他所处的那个类,单独生成一个类。直接来代码:package com.
- 在Android开发中,我们经常会遇到这样一种情况:在UI界面上进行某项操作后要执行一段很耗时的代码,比如我们在界面上点击了一个”下载“按钮