Java实例讲解多态数组的使用

 更新时间:2022年05月19日 09:17:47   作者:Demo龙  
本文章向大家介绍Java多态数组,主要包括Java多态数组使用实例、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下

多态概述

多态概念:所谓多态就是指程序中定义的引用变量所指向的具体类型和通过该引用变量发出的方法调用在编程时并不确定,而是在程序运行期间才确定,即一个引用变量到底会指向哪个类的实例对象,该引用变量发出的方法调用到底是哪个类中实现的方法,必须在由程序运行期间才能决定。因为在程序运行时才确定具体的类,这样,不用修改源程序代码,就可以让引用变量绑定到各种不同的类实现上,从而导致该引用变量调用的具体方法随之改变,即不修改程序代码就可以改变程序运行时所绑定的具体代码,让程序可以选择多个运行状态,这就是多态性。

多态存在的三个必要条件

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()+"正在上课";
    }
}

运行结果

到此这篇关于Java实例讲解多态数组的使用的文章就介绍到这了,更多相关Java多态数组内容请搜索脚本之家以前的文章或继续浏览下面的相关文章希望大家以后多多支持脚本之家!

相关文章

  • SpringBoot+MyBatis实现登录案例

    SpringBoot+MyBatis实现登录案例

    前端时间在网上看到有朋友在学习springboot项目的搭建过程,今天就抽空给大家分享一个案例帮助大家学习SpringBoot+MyBatis实现登录功能,具体实现代码跟随小编一起看看吧
    2021-06-06
  • mybatis-plus使用@EnumValue处理枚举类型的示例代码

    mybatis-plus使用@EnumValue处理枚举类型的示例代码

    这篇文章主要介绍了mybatis-plus使用@EnumValue处理枚举类型的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-09-09
  • Spring实现对象注入的三种方法详解

    Spring实现对象注入的三种方法详解

    这篇文章主要为大家学习介绍了Spring中实现对象注入的三种常用方法,文中的示例代码讲解详细,具有一定的学习价值,感兴趣的可以了解一下
    2023-07-07
  • WIN10环境 Maven的安装与配置详细教程

    WIN10环境 Maven的安装与配置详细教程

    这篇文章主要介绍了WIN10环境 Maven的安装与配置详细教程,本文分步骤给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-09-09
  • 举例讲解Java中的多线程编程

    举例讲解Java中的多线程编程

    这篇文章主要介绍了举例讲解Java中的多线程编程,线程是Java学习中的重要知识,需要的朋友可以参考下
    2015-09-09
  • MyBatis处理枚举类型的方法详解

    MyBatis处理枚举类型的方法详解

    MyBatis 处理枚举类型的机制相对直接,它提供了一种灵活的方式来处理Java枚举(enum)类型和数据库之间的映射,本文给大家介绍了MyBatis处理枚举类型的两种方法,需要的朋友可以参考下
    2024-07-07
  • Java性能优化之数据结构实例代码

    Java性能优化之数据结构实例代码

    这篇文章主要介绍了Java性能优化之数据结构实例代码,具有一定借鉴价值,需要的朋友可以参考下
    2018-01-01
  • SpringBoot整个启动过程的分析

    SpringBoot整个启动过程的分析

    今天小编就为大家分享一篇关于SpringBoot整个启动过程的分析,小编觉得内容挺不错的,现在分享给大家,具有很好的参考价值,需要的朋友一起跟随小编来看看吧
    2019-03-03
  • Java各种比较对象的方式的对比总结

    Java各种比较对象的方式的对比总结

    比较对象是面向对象编程语言的一个基本特征.在本教程中,我们将介绍Java语言的一些特性,这些特性允许我们比较对象.此外,我们还将研究外部库中的这些特性,需要的朋友可以参考下
    2021-06-06
  • java多线程处理执行solr创建索引示例

    java多线程处理执行solr创建索引示例

    这篇文章主要介绍了java多线程处理执行solr创建索引示例,需要的朋友可以参考下
    2014-02-02

最新评论