多态:
定义:某一类事物的多种存在形态。
如动物中的猫,狗。
猫对象对应的是猫类
猫 a = new 猫();
同时猫也是动物中的一种,也可以把猫称为动物
动物 b = new 猫();
动物是猫和狗具体事物中抽取出来的父类型
父类或者接口的引用指向了其子类对象
下面定义了一个父类Animal 和继承于Animal的三个子类Dog Cat Pig
abstract class Animal //定义了一个动物类,其方法有吃东西
{
abstract void eat();
}
class Dog extends Animal //定义了一个继承于动物类的狗类,其方法有 吃东西 和 看家
{
void eat()
{
System.out.println("啃骨头");
}
void lookHome()
{
System.out.println("看家");
}
}
class Cat extends Animal //定义了一个继承于动物类的猫类,其方法有 吃东西 和 抓老鼠
{
void eat()
{
System.out.println("吃鱼");
}
void catchMouse()
{
System.out.println("抓老鼠");
}
}
class Pig extends Animal //定义了一个继承于动物类的猪类,其方法有 吃东西
{
void eat()
{
System.out.println("吃饲料");
}
}
当我们分别养了三个动物,狗、猫和猪时。若要对其进行喂食,应该如何编写代码。
class Demo
{
static void method(Dog d) //狗类的吃东西函数
{
d.eat();
}
static void method(Cat c) //猫类的吃东西函数
{
c.eat();
}
static void method(Pig p) //猪类的吃东西函数
{
p.eat();
}
public static void main(String[] args)
{
Dog d = new Dog();
Cat c = new Cat();
Pig p = new Pig();
method(d);
method(c);
method(p);
}
}
我们很明显可以看出,上面代码片的三个进食函数相似度很高,执行的都是同一类操作,那么,我们能不能将这三个进食函数合并为一个,从而提高代码复用性呢?
class A
{
static void method(Animal a) //吃东西的方法,参数为动物类型
{
a.eat();
}
public static void main(String[] args) //此时想要让所有动物都去吃东西。
{
Animal c = new Cat();
Animal d = new Dog();
Animal p = new Pig();
method(c);
method(d);
method(p);
}
}
多态的好处
提高了代码的扩展性,前期定义的代码可以使用后期的内容(如我们以后定义的其他动物类型可以在不改动method函数的情况下,对其进行调用)
多态的弊端
前期定义的代码不能使用后期子类中出现的特有内容
static void method(Animal a)
{
a.eat();
}
如我们不能在此方法中调用Cat类的catchMouse()方法,因为Animal类不具有该方法。
多态的前提:
1,必须有关系(继承/实现)
2,要有覆盖