文章目录
面向对象特征: 多态
多态的介绍
什么是多态?
同类型的对象,执行同一个行为,会表现出不同的行为特征。
多态的常见形式
父类类型 对象名称 = new 子类构造器;
接口 对象名称 = new 实现类构造器;
演示代码
- 定义一个父类有两个子类继承
public abstract class Anima {
public abstract void run();
}
class Dog extends Anima {
@Override
public void run() {
System.out.println("狗跑的很快");
}
}
class Pig extends Anima {
@Override
public void run() {
System.out.println("猪跑的很慢");
}
}
- 多态的形式
class Test {
public static void main(String[] args) {
//父类类型, 子类构造器
Anima dog = new Dog();
dog.run(); // 狗跑的很快
Anima pig = new Pig();
pig.run(); // 猪跑的很慢
}
}
多态中成员访问特点
方法调用:编译看左边,运行看右边。
变量调用:编译看左边,运行也看左边。(多态侧重行为多态)
多态的前提
有继承/实现关系;有父类引用指向子类对象;有方法重写。
定义多态的好处
在多态形式下,右边对象可以实现解耦合,便于扩展和维护。
定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象,体现出多态的扩展性与便利。
多态类型转换
多态下会产生的一个问题
多态下不能使用子类的独有功能
多态下引用数据类型的数据转换
自动类型转换(从子到父):子类对象可以直接进赋值给父类类型的变量指向。
强制类型转换(从父到子):
此时必须进行强制类型转换:
子类 对象变量 = (子类)父类类型的变量
作用:可以解决多态下的劣势,可以实现调用子类独有的功能。
注意: 如果转型后的类型和对象真实类型不是同一种类型,那么在转换的时候就会出现ClassCastException
class Test {
public static void main(String[] args) {
Anima dog1 = new Dog();
// 自动类型转换
dog1.run();
// dog1.lookDoor(); 多态下不能使用子类独有的功能
// 强制类型转换
Dog dog2 = (Dog) dog1;
dog2.lookDoor();
}
}
Java建议强转转换前使用instanceof
判断当前对象的真实类型,再进行强制转换
变量名 instanceof 真实类型
判断关键字左边的变量指向的对象的真实类型,是否是右边的类型或者是其子类类型,是则返回true,反之。
版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
文章由极客之音整理,本文链接:https://www.bmabk.com/index.php/post/120065.html