动态绑定是指在“执行”期间(而非编译期间)判断引用对象的实际类型,根据其实际的类型调用其相应的方法。
个人认为理解起来类似于方法的重载,根据具体情况调用具体方法。
多态的3个条件:
1、要有继承。
2、要有重写。
3、父类引用指向子类对象。
//父类Animal
class Animal{
public void voice(){
System.out.println("动物的叫声");
}
}
//子类Cat,重写了父类中的voice方法
class Cat extends Animal{
public void voice(){
System.out.println("猫的叫声:喵喵");
}
}
//子类Dog,重写了父类中的voice方法
class Dog extends Animal{
public void voice(){
System.out.println("狗的叫声:汪汪");
}
}
//girl类,类的对象指向Animal的对象
class girl{
private Animal pet;
//构造方法中的变量为父类Animal类型
girl(Animal pet){
this.pet = pet;
}
//访问构造方法中指定的对象变量所属类的voice方法
public void myPetVoice(){
pet.voice();
}
}
public class testPolp{
public static void main(String[] args){
Animal a = new Animal();
Dog d = new Dog();
Cat c = new Cat();
girl pet1 = new girl(a);
girl pet2 = new girl(d);
girl pet3 = new girl(c);
pet1.myPetVoice();//访问Animal中的voice()方法
pet2.myPetVoice();//访问Dog中的voice()方法
pet3.myPetVoice();//访问Cat中的voice()方法
}
}
输出:
动物的叫声
狗的叫声:汪汪
猫的叫声:喵喵