多态的定义:将参数定义为一个父类,各子类中都重写了父类的方法,在方法中用传入的父类对象调用这个方法,当传入什么子类时就会调用相应的各子类的方法。
多态存在的条件:有继承,有重写,父类引用指向子类对象。一旦满足,当父类里被重写的方法时,实际new的哪个子类对象,就调用子类对象方法。
父类引用指向子类对象解释:
A a = new B() ;
A是我们的引用类型,他是父类,B是子类。
a是一个子类对象,但是引用的是父类的类型。
举例:
//定义父类
abstract class Animal {
private String name;
Animal(String name) {
this.name = name;
}
public void enjoy(){
System.out.println("叫声......");
}
// public abstract void enjoy();
}
//定义Cat类继承Animal
class Cat extends Animal {
private String eyesColor;
Cat(String n,String c) {
super(n);
eyesColor = c;
}
public void enjoy() {
System.out.println("猫叫声......");
}
//public abstract void enjoy();
}
//定义dog类继承Animal
class Dog extends Animal {
private String furColor;
Dog(String n,String c) {
super(n);
furColor = c;
}
public void enjoy() {
System.out.println("狗叫声......");
}
}
//定义Bird类继承Animal
class Bird extends Animal {
Bird() {
super("bird");
}
public void enjoy() {
System.out.println("鸟叫声......");
}
}
//定义一个人物类
class Lady {
private String name;
private Animal pet;
Lady(String name,Animal pet) {
this.name = name; this.pet = pet;
}
public void myPetEnjoy(){
pet.enjoy();
}
}
//测试类
public class Test {
public static void main(String args[]){
Cat c = new Cat("catname","blue");
Dog d = new Dog("dogname","black");
Bird b = new Bird();
Lady l1 = new Lady("l1",c);
Lady l2 = new Lady("l2",d);
Lady l3 = new Lady("l3",b);
l1.myPetEnjoy();
l2.myPetEnjoy();
l3.myPetEnjoy();
}
}
//上面程序人的构造方法中传的参数是Animal类型,但是我们在测试类中传入的参数分别是Cat,Dog还有Bird
//对象,每个人l1,l2,l3在调用自己的myPetEnjoy()方法时候,会根据自己宠物的不同而输出不同的叫声;
//此列中有继承(Cat,dog,bird都是继承animal),有重写(都重写了enjoy()方法),有父类的引用指向子类对象(Lady的构造方法中
//参数是父类的引用,实际传入的参数是子类对象) |