多态的优点在于,通过使用父类引用,屏蔽了不同子类之间的差异,能实现通用编程,对扩展功能支持良好(新功能的实现只需要新增相关的类,而无需修改老代码)。
多态从代码上的表现是,在方法调用时,看起来调用的是父类的方法。但是实际在运行的时候,却是运行的子类方法的逻辑。
多态的实现,有3个前提:
继承;在子类中重写父类方法;父类引用指向子类对象(方法的参数或者返回值类型不使用具体子类的类型,而使用父类的类型)。
父类Pet:
public abstract class Pet {
public int color=0;
public abstract void run();
/*{
System.out.println("宠物跑");
}*/
public void jiao()
{
System.out.println("宠物叫");
}
}
中间层类RunAnimal,避免不必要的编码,可以更好地实现多态:
public abstract class RunAnimal extends Pet{ //abstract不能与final并列修饰同一类
public abstract void run(); //更好的实现多态,abstract不能与private、static、final并列修饰同一方法
public void jiao() {} //做中间层,避免不必要的编码
public RunAnimal()
{
}
}
子类Cat:
public class Cat extends RunAnimal{
public void run()
{
System.out.println("猫跑");
}
}
子类Dog:
public class Dog extends RunAnimal {
public void run()
{
System.out.println("狗跑");
}
}
子类Tiger:
public class Tiger extends RunAnimal{
public void run()
{
System.out.println("老虎要吃你");
}
}
Person类:
public class Person {
public void playwith(Pet pet)
{
pet.run();
}
}
测试类PetTest:
public class PetTest {
public static void main(String[] args) {
Dog dog = new Dog();
Cat cat = new Cat();
//Pet pet = new Pet();
dog.color=1;
//dog.run();
//cat.run();
Person per = new Person();
per.playwith(dog);
per.playwith(cat);
Tiger t = new Tiger();
per.playwith(t);
}
}