多态:
两种理解方式:
如果类a属于类b 那么类b的指针就可以指向类a的对象
翻译成人类语言就是:类a是类b的一种
或者类a is a 类b
老师的理解方式:
猫既是猫也是动物 相当于具有了猫和动物两种形态 因此叫多态
殊途同归都是父类引用指向子类对象原因是作为子集(超类)父类拥有最共性的内容可以指向所有子类对象
那么这就引出来一个问题:
创建的子类对象实际上属于父类因此只能使用父类的方法你可以理解为创建的对象只能子类中父类的那部分
弊端:
用多态就只能使用父类的方法
用法:
1 利用可以指向所有子类这一特性 将父类引用作为函数的形式参数 这样当参数类型增加但依然属于父类的情况下不用重载函数
2 可以使用转型来使用子类的特有方法
注意:只能建立子类对象从父类向子类转型可以这么干如果建立本身是父类的对象那么这样做就会出现类型转换异常(ClassCastException)
/*
展示多态的两种用法
*/
class Polymophism1
{
publicstatic void main(String[] args)
{
Animalanimal = new Cat();
Catc = (Cat)animal;
c.catchMouse(); //向下转型 这样可以使用子类的特有方法
PlayGamepg = new PlayGame();
pg.run(newCat()); //多态 即使后期增加了动物的种类 也没关系 很方便
}
}
abstract class Animal
{
Stringname;
intage;
voideat()
{}
abstractvoid playcute();
}
class Cat extends Animal
{
voideat()
{
Show.sop("吃鱼");
}
voidplaycute()
{
Show.sop("Meeow");
}
voidcatchMouse()
{
Show.sop("抓老鼠");
}
}
class Dog extends Animal
{
voideat()
{
Show.sop("吃骨头");
}
voidplaycute()
{
Show.sop("bark");
}
voidkeepTheDoor()
{
Show.sop("看家");
}
}
class PlayGame
{
publicvoid run(Animal animal)
{
if(animal instanceof Animal)
{
animal.eat();
animal.playcute();
}
else
Show.sop("不要乱传!");
}
}
class Show
{
publicstatic void sop(Object obj)
{
System.out.println(obj);
}
}