我们先进行了解Java的动态绑定机制
1. 当调用对象方法的时候,该方法会和该对象的内存地址/运行类型进行绑定
2. 当调用对象属性的时候,没有动态绑定机制,在哪里声明就在哪里使用。属性没有动态绑定机制
现在定义三个类 Person作为父类 Student类和Teacher类是子类 两个子类都有自己特有的属性和方法 并且重写父类say()方法
package www.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"+getName()+"age"+getAge();
}
}
package www.polyarr;
public class Student extends Person{
private double scores;
public Student(String name, int age, double scores) {
super(name, age);
this.scores=scores;
}
public double getScores() {
return scores;
}
public void setScores(double scores) {
this.scores = scores;
}
public String say() {
return "学生"+super.say()+"scores="+getScores();
}
public void student() {
System.out.println("学生"+getName()+"正在学习");
}
}
package www.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="+getSalary();
}
public void 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[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());
if (person[i] instanceof Student) {
((Student)person[i]).student();
} else if(person[i] instanceof Teacher){
((Teacher)person[i]).teacher();
}else {
System.out.println("类型不正确");
}
}
}
}
name张三age16
类型不正确
学生name小明age18score=100.0
学生小明正在学习
学生name小强age19score=80.0
学生小强正在学习
老师name张兰age28salary=6000
老师张兰正在教书
老师name王明age32salary=8000
老师王明正在教书