多态
概念
同一类的不同子类形态。可以声明,父类对象变量保存子类对象的形式
现实生活中存在很多多态的例子。
例如:水在100摄氏度的高温下是气体,在常温下是液体,在0摄氏度以下是固体。这里的多态是指一个对象具有多种形态
OOP中的多态与之类似。
同一个引用类型,使用不同的实例可以执行不同的操作,即父类引用子类对象——向上转型。
java中的多态理解为另一种数据类型转换
//宠物类
public class Pet {
public String name = "无名氏"; // 宠物昵称
public Pet(String name){
this.name=name;
}
public void eat(){ }
}
//狗类
public class Dog extends Pet{
public Dog(String name) {
super(name);
}
@Override
public void eat() {
System.out.println("狗"+name+"吃骨头");
}
}
//猫
public class Cat extends Pet{
public Cat(String name) {
super(name);
}
@Override
public void eat() {
System.out.println("猫"+name+"吃鱼");
}
}
//主人类
public class Master {
public void food(Pet pet) {
pet.eat();
}
}
//测试类
public class Test {
public static void main(String[] args) {
Master m=new Master();//主人对象
//向上转型
//声明父类变量 保存子类对象
//jvm在调用方法时会自动根据实际对象调用方法
Pet dog=new Dog("大黄");
Pet cat=new Cat("花花");
m.food(dog);
m.food(cat);
}
}
多态的使用
1、必须发生继承
只有发生继承多个对象才能进行联系
2、向上转型
声明父类变量保存子类对象,这样才能使用同一个变量表示多个不同相关联的变量,jvm在进行使用时会根据不同对象进行使用
3、子类必须重写父类方法
如果多个子类没有重写父类方法,在使用方法时,如果不重写父类方法,那么调用的还是父类方法,多态没有意义,并且由于声明的是父类变量所以只能调用父类声明过的方法
子类对象存储至父类变量时,与子类一同创建的父类对象可以直接赋值,但子类中额外的属性与方法在声明的父类变量中并没有进行声明,父类变量会帮子类对象进行存储但是,不能使用
向上转型
声明父类变量保存子类对象(类似于自动类型转换)
向下转型
声明子类变量保存父类对象(类似于强制类型转换)
向下转型成功的前提条件:当前父类是由要转换的子类对象向上转型得来的(这个对象曾经就是这个类的对象)
总结:
1、多态发生的条件继承、向上转型、重写
2、只能使用子类重写父类的方法以及父类特有的属性与方法
3、向下转向成功的前提:曾经发生过向上转型
多态的优点与缺点
优点:提高了代码的维护性与扩展性
缺点:只能在继承后的子类中使用,并且只能使用子类重写父类的方法而不能使用子类特有的方法