为什么要使用多态(使用举例)
例子一:
上代码:
public class AnimalTest {
public static void main(String[] args) {
AnimalTest test = new AnimalTest();
test.func(new Dog());
test.func(new Cat());
}
public void func(Animal animal)
{
animal.eat();
animal.shout();
}
}
class Animal
{
public void eat()
{
System.out.println("动物进食");
}
public void shout()
{
System.out.println("动物叫唤");
}
}
class Dog extends Animal
{
@Override
public void eat() {
System.out.println("狗吃骨头");
}
@Override
public void shout() {
System.out.println("汪汪汪");
}
}
class Cat extends Animal
{
@Override
public void eat() {
System.out.println("猫吃猫粮");
}
@Override
public void shout() {
System.out.println("喵喵喵");
}
}
其中,func(new Dog())
等价于
Animal animal = new Dog(); func(animal);
如果没有多态性,还需要声明func(Dog dog)
和func(Cat cat)
两个函数。
有了多态性,省去了多次重载方法。
例子二:
class Order
{
public void method(Object obj)
{
// 这里的形参只要继承了Object类即可
}
}
多态性能提高代码的泛用性。
多态不适用于属性
先上结论:对象的多态性,只适用于方法,不适用于属性。
// 在Person中定义int id = 1001
// 在Person的子类Man中定义int id = 1002
// 在测试类中
Person p1 = new Man();
System.out.println(p1.id);
// 输出的是1001,即父类中定义的id
也就是说针对对象的属性,不存在什么编译看左运行看右;
调用的属性一律属于左边的类型中定义的属性。