概念
多态(Polymorphism)按字面的意思就是“多种状态”,同一种行为在不同的对象身上有不同的表现形式,它是面向对象程序设计(OOP)的一个重要特征,在面向对象语言中,接口的多种不同的实现方式即为多态。
三个必要条件
1.继承
多态中必须存在有继承关系的子类和父类,通过继承来自父类的方法,对某个方法进行重写,继承父类同一个方法,不同的子类重写可以有多种不同的表现形式。
2.重写
子类对于父类的继承来的方法进行重写,调用时就会调用子类重写过的方法而不会调用父类的方法
3.父类引用指向子类对象
在多态中需要将父类的引用赋给子类对象,只有这样该引用才能够具备父类引用调用子类重写的方法,此时就是多态。
多态的好处
1.减少代码的冗余,提高代码的可复用性
2.代码的可拓展性增强
案例
Dog和Cat两个类都有eat(),猫了饭后喵喵叫,狗吃了饭后汪汪叫,模拟人喂食
//狗具有名字属性和eat()方法
public class Dog {
String name;// 姓名
Dog() {
}
Dog(String name) {
this.name = name;
}
public void eat() {
System.out.println(this.name + "吃了骨头汪汪叫");
}
}
public class Cat {
//猫也具有姓名属性和eat()方法
String name;//姓名
Cat(){
}
Cat(String name){
this.name=name;
}
public void eat(){
System.out.println(this.name+"吃了鱼喵喵叫");
}
}
public class Demo {
public static void main(String[] args) {
Cat c=new Cat("英短");
Dog d=new Dog("拉布拉多");
Person p=new Person("小红");
//小红去喂狗
p.feet(d);
//小红去喂猫
p.feet(c);
}
}
如果此时要加入一只鸭子,然后人也要去喂
public class Duck {
String name;// 姓名
Duck() {
}
Duck(String name) {
this.name = name;
}
public void eat() {
System.out.println(this.name + "吃了米嘎嘎叫");
}
}
// 喂狗
public void feet(Dog dog) {
dog.eat();
}
// 喂猫
public void feet(Cat cat) {
cat.eat();
}
// 喂鸭子
public void feet(Duck duck) {
duck.eat();
}
*如果再领养XXX宠物,就需要给XXX喂食,怎么办?
频繁修改代码,代码可扩展性、可维护性差。解决办法就是使用多态优化。
//添加Animal类,增加eat方法,让Dog,Cat,Duck继承Animal
//重写eat方法
//修改feet的方法
// 喂所有的
public void feet(Animal animal) {
animal.eat();
}
//父类引用指向子类对象
Animal c=new Cat("花花");
Animal d=new Dog("大黄");
Animal duck=new Duck("小黄鸭");
Person p=new Person("李雷");
p.feet(d);
p.feet(c);
p.feet(duck);
向上转型
把子类对象直接赋值给父类引用叫做向上转型,向上转型不用强制转化,会隐藏掉对象本身扩展的内容,意思是向上转型会丢失子类的特有方法和属性
//拆分
Cat c=new Cat();
Animal a=c;
//合并
Animal a=new Cat();
向下转型
父类引用可以指向子类对象,但子类引用指向不了父类对象,意思是子类对象的父类引用赋值给子类叫向下转型,必须要强制类型转换(前提是可以向下转型),怎么样判断是不是可以向下转型,就要求必须要做instanceof判断,instanceof 是用来判断引用所指向的对象是不是某个类型
1.指向父类对象的父类引用不能转换为子类类型
Animal a=new Animal();
Cat c=(Cat)a;
写法是错误的,会报java.lang.ClassCastException一个异常
2.指向子类对象的父类引用能转换为该子类类型
Animal a=new Cat();
//a.upTree();//报错
//当你想拿回子类对象被隐藏的属性和方法时,需要做向下类型转换,(强制类型转换)
Cat c=(Cat) a;
c.upTree();//可以
3.instanceof判断
Animal a= new Cat();
if(a instanceof Cat){
Cat c=(Cat)a;
}else if(a instanceof Dog){
Dog d=(Dog)a;
}
版权声明:本文为Darcy_fx原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。