JAVA父类对象中调用子类方法 JAVA多态数组

我们先进行了解Java的动态绑定机制

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

现在定义三个类 Person作为父类 Student类和Teacher类是子类 两个子类都有自己特有的属性和方法 并且重写父类say()方法

  • 分别是 Person类
package www.polyarr;
//创建Person类
public class Person {
    private String name;//设置两个成员变量 name 和 age 并增加get set方法
    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() {//say方法 返回name和age值
        return "name"+getName()+"age"+getAge();
    }
    
} 
  • Student类
package www.polyarr;

public class Student extends Person{//继承Person类
    private double scores;//定义成员变量 scores(成绩)
    public Student(String name, int age, double scores) {//继承父类构造器 并加入自己的变量
        super(name, age);
        this.scores=scores;
        // TODO Auto-generated constructor stub
    }
    public double getScores() {
        return scores;
    }
    public void setScores(double scores) {
        this.scores = scores;
    }
    public String say() {//重写父类say()方法
        return "学生"+super.say()+"scores="+getScores();
    }
    public void student() {//写入student方法 
        System.out.println("学生"+getName()+"正在学习");
    }
}
  • Teacher类
package www.polyarr;

public class Teacher extends Person{//继承Person类
    private int salary;//定义成员变量 salary(薪水)
    public Teacher(String name, int age,int salary) {//继承父类构造器 并加入自己的变量
        super(name, age);
        this.salary=salary;
        // TODO Auto-generated constructor stub
    }
    public int getSalary() {
        return salary;
    }
    public void setSalary(int salary) {
        this.salary = salary;
    }
    public String say() {//重写父类say()方法
        return "老师"+super.say()+"salary="+getSalary();
    }
    public void teacher() {//写入teacher方法 
        System.out.println("老师"+getName()+"正在教书");
    }
}
  • 在主类中定义一个Person类的数组 存入一个Person类对象 两个Student类对象 和两个Teacher类对象循环调用say()方法 在运行是调用运行类型的方法 依次输出信息
name张三age16
学生name小明age18score=100.0
学生name小强age19score=80.0
老师name张兰age28salary=6000
老师name王明age32salary=8000
  • 此时 如果我想调用两个子类特有的方法 是无法被调用到的 此时我们使用if判断 使用instanceof 比较当前类是否等于Students类
  • 如果等于的话 将当前类向下转型并调用它特有的方法 Teahcer类同理
package www.polyarr;

public class Polyarr {
    public  static void main(String[]arge) {
        Person person[]=new Person[5];//定义一个Person数组  进行赋值
        person[0]=new Person("张三",16);
        person[1]=new Student("小明",18,100);
        person[2]=new Student("小强",19,80);
        person[3]=new Teacher("张兰",28,6000);
        person[4]=new Teacher("王明",32,8000);
        for (int i = 0; i < person.length; i++) {
            System.out.println(person[i].say());//循环输出say方法  此时输出的say()方法是按照引用类型 就是进行new的实例化类型调用的
            if (person[i] instanceof Student) {//进行判断 是否为Student类
                ((Student)person[i]).student();//对Person数中的对象 进行向下转型 并调用student方法
            } else if(person[i] instanceof Teacher){//进行判断 是否为Teacher类
                ((Teacher)person[i]).teacher();//对Person数中的对象 进行向下转型 并调用teacher方法
            }else {
                System.out.println("类型不正确");
            }
        }
    }
}
  • 最后输出
name张三age16
类型不正确
学生name小明age18score=100.0
学生小明正在学习
学生name小强age19score=80.0
学生小强正在学习
老师name张兰age28salary=6000
老师张兰正在教书
老师name王明age32salary=8000
老师王明正在教书
  • 11
    点赞
  • 39
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值