一、什么是多态
多态就是指一个事物具备了多种表现形态
二、多态的体现
①父类的引用指向了自己的子类对象
②父类的引用也可以接受自己的子类对象
二、多态的前提
①必须是类与类之间有关系,要么被继承,要么被实现
②通常存在覆盖(重写)
三、多态的好处
大大的提高了程序的扩展性
例:
//定义一个Animal类描述动物的共性
class Animal {
private String name;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public void eat(){
System.out.println("动物吃饭....");
}
protected void sound(){
System.out.println("动物的声音....");
}
}
//Cat类继承Animal类
class Cat extends Animal {
public void eat(){ //重写父类eat方法
System.out.println("猫吃鱼");
}
public void sound(){
System.out.println("喵喵喵");
}
public void showCat(){
System.out.println("I am a cat");
}
}
//Dog类继承Animal类
class Dog extends Animal {
public void eat(){
System.out.println("狗吃骨头");
}
public void sound(){
System.out.println("汪汪汪");
}
public void showDog(){
System.out.println("I am a dog");
}
}
//动物类测试类
class AnimalTest
{
public static void main(String[] args){
//没有使用多态的写法
Cat c = new Cat();
c.eat();
c.sound();
Dog d = new Dog();
d.eat();
d.sound();
/*
当有了一个新的动物老鼠时,需要重新实例化一个对象,调用老鼠的方法
使得代码变得麻烦。
*/
//使用多态的写法,只要是动物就可以调用function()实现功能,
//大大的提高了程序的扩展性
function(new Cat());
function(new Dog());
}
public static void function(Animal a){
a.eat();
a.sound();
}
}
四、多态的弊端
①只能使用父类的引用访问父类中的成员
Animal a = new Cat(); //类型提升,向上转型
这意味着对象a只能访问父类Animal类中存在的成员,而不能访问自己特有的成员。
②如果想要调用猫的特有方法,强制将父类的应用转成子类类型 向下转型
Cat c = (Cat)a;
//将对象a转成Cat型后就可以访问Cat特有的方法
a.showCat();
五、在多态中成员的特点
①成员函数
在编译时期:参阅引用型变量所属的类中是否有调用的方法,如果有,编译通过,如果没有,编译失败
Animal a = new Cat();
a.eat();
编译时,a对象调用的方法只能是Animal中存在的方法,否则编译失败
在运行时期:参阅对象所属的类中是否有调用的方法。
Animal a = new Cat();
a.eat();
运行时,a调用的方法是Cat类中重写后的eat()方法
简单总结:成员函数在多态调用时,编译看左边,运行看右边
②成员变量
无论编译还是运行,都参阅引用型变量所属的类中是否存在该成员变量。
即成员变量在多态调用时,都看左边。
③静态成员
在多态中,静态成员函数和变量的调用都看左边。
六、instanceof 关键字
a instanceof b //判断a是否为b的对象
例:
Animal a = new Cat();
//判断对象a是否为Cat的实例,若是强制将a转成Cat型,调用Cat特有的方法showCat().
if(a instanceof Cat){
Cat b = (Cat)a;
b.showCat();
}