多态的优势
- 在多态形式下,右边对象可以实现解耦合,便于扩展和维护
Person p = new Student();
p.look;//业务逻辑发生改变时,后续代码无需修改
业务逻辑发生变化时,只需要修改创建对象的语句,将 Student() 改为 Person 的子类来实现
- 定义方法的时候,使用父类型作为参数,可以接收所有子类对象,体现多态的扩展性与便利
public class Main {
public static void main(String[] args) {
ArrayList list = new ArrayList();
list.add("aa");
}
}
在利用方法的时候可以直接用父类型的参数。以 ArrayList 为例,ArrayList 作为一个容器可以直接不用泛型直接创建对象,表示所有类型都可以添加,添加内容是调用 add 方法时,直接用的是父类 Object 的 add 方法
多态的弊端
public class Main {
public static void main(String[] args) {
Animal a = new Dog();
a.eat();
a.lookhome();
}
}
class Animal {
public void eat() {
System.out.println("动物在吃东西");
}
}
class Dog extends Animal {
@Override
public void eat() {
System.out.println("狗在吃骨头");
}
public void lookhome() {
System.out.println("狗在看家");
}
}
class Cat extends Animal {
@Override
public void eat() {
System.out.println("猫在吃小鱼干");
}
public void catchMouse() {
System.out.println("猫在抓老鼠");
}
}
不能去调用子类的特有功能
原因:当调用方法的时候,编译看左边,运行看右边,在变异的时候会先检查左边的父类中有没有这个方法,如果没有直接报错
解决方案:进行类型转换,变成合适的子类类型
public class Main {
public static void main(String[] args) {
Animal a = new Dog();
a.eat();
Dog d=(Dog)a;
d.lookhome();
}
}
用类型转换的方式将其转化为合适的类型,然后就可以正常输出了
但是进行类型转换的时候也要注意装换后的类型
public class Main {
public static void main(String[] args) {
Animal a = new Dog();
a.eat();
Cat d=(Cat) a;
d.catchMouse();
}
}
如果转换的类型发生错误,就会让代码直接报错
Exception in thread “main” java.lang.ClassCastException: class Dog cannot be cast to class Cat (Dog and Cat are in unnamed module of loader ‘app’)
at Main.main(Main.java:7)
该错误意味着类型转化错误,要转化为合适的类型
if (a instanceof Dog) {
Dog d = (Dog) a;
d.lookhome();
} else if (a instanceof Cat) {
Cat c=(Cat) a;
c.catchMouse();
}else {
System.out.println("类型不存在,转化失败");
}
在类型较多的时候可以利用 if 判断语句进行判断,判断条件成立后将其转化为合适的类型
在JDK 14以后的版本中可以简化
// 先判断 a 是否为 Dog 类型,如果是,则强转成 Dog 类型,转换之后变量名为 d
// 如果不是,则不强转,结果直接是 false
if (a instanceof Dog d) {
d.lookhome();
} else if (a instanceof Cat c) {
c.catchMouse();
} else {
System.out.println("类型不存在,转化失败");
}
总结
- 多态的优势
方法中,使用父类作为参数,可以接收所有子类对象
- 多态的弊端是什么
不能使用子类的特有功能
- 引用数据类型的类型转换,有几种方式
自动类型转换,强制类型转换
- 强制类型转换能解决什么问题
- 可以转换为真正的子类类型,从而调用子类独有的功能
多态的优势
方法中,使用父类作为参数,可以接收所有子类对象
- 多态的弊端是什么
不能使用子类的特有功能
- 引用数据类型的类型转换,有几种方式
自动类型转换,强制类型转换
- 强制类型转换能解决什么问题
- 可以转换为真正的子类类型,从而调用子类独有的功能
- 类型转换与真实对象类型不一致会报错