Java概念:动态绑定机制,多态数组

java的动态绑定机制

  1. 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型绑定
  2. 调用对象属性时,没有动态绑定机制,哪里声明,哪里使用

多态数组

多态数组配合类型判断instanceof再加上向下转型可以解决子类特殊方法的调用在这里插入图片描述

代码案例:

package com.hspedu.poly_.polyarr_;

public class PloyArray {
    
    
    public static void main(String[] args) {
    
    
        //应用实例:现有一个继承结构如下:要求创建1个Person对象、
        // 2个Student 对象和2个Teacher对象, 统一放在数组中,并调用每个对象say方法

        Person[] persons = new Person[5];
        persons[0] = new Person("jack", 20);
        persons[1] = new Student("mary", 18, 100);
        persons[2] = new Student("smith", 19, 30.1);
        persons[3] = new Teacher("scott", 30, 20000);
        persons[4] = new Teacher("king", 50, 25000);

        //循环遍历多态数组,调用say
        for (int i = 0; i < persons.length; i++) {
    
    
            //老师提示: person[i] 编译类型是 Person ,运行类型是是根据实际情况有JVM来判断
            System.out.println(persons[i].say());//动态绑定机制
            //这里大家聪明. 使用 类型判断 + 向下转型.
            if(persons[i]  instanceof  Student) {
    
    //判断person[i] 的运行类型是不是Student
                Student student = (Student)persons[i];//向下转型
                student.study();
                //小伙伴也可以使用一条语句 ((Student)persons[i]).study();
            } else if(persons[i] instanceof  Teacher) {
    
    
                Teacher teacher = (Teacher)persons[i];
                teacher.teach();
            } else if(persons[i] instanceof  Person){
    
    
                //System.out.println("你的类型有误, 请自己检查...");
            } else {
    
    
                System.out.println("你的类型有误, 请自己检查...");
            }

        }

    }
}


====================================================================
 package com.hspedu.poly_.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 + "\t" + age;
    }
}

=================================================================
package com.hspedu.poly_.polyarr_;

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方法

    @Override
    public String say() {
    
    
        return "老师 " + super.say() + " salary=" + salary;
    }
    //特有方法
    public void teach() {
    
    
        System.out.println("老师 " + getName() + " 正在讲java课程...");
    }
}
=================================================================
package com.hspedu.poly_.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;
    }
    //重写父类say

    @Override
    public String say() {
    
    
        return "学生 " + super.say() + " score=" + score;
    }
    //特有的方法
    public void study() {
    
    
        System.out.println("学生 " + getName() + " 正在学java...");
    }
}

猜你喜欢

转载自blog.csdn.net/weixin_44199207/article/details/118597090