面向对象三大特征之三:多态
多态是面向对象三大特征中非常重要的知识,我们必须清楚的掌握!
◆多态的概述,多态的形式
什么是多态?
- 同类型的对象,执行同一个行为,会表现出不同的行为特征。
多态的常见形式:
父类类型对象名称 = new子类构造器;
接口对象名称 = new实现类构造器;
请仔细查看下面的演示:
package com.polymorphic;
public abstract class Animal {
public abstract void run();
}
package com.polymorphic;
public class Dog extends Animal{
@Override
public void run() {
System.out.println("狗是四足动物。");
}
}
package com.polymorphic;
public class Tortoise extends Animal{
@Override
public void run() {
System.out.println("乌龟是四足两栖动物。");
}
}
package com.polymorphic;
public class Main {
public static void main(String[] args) {
// 我们想必很熟悉创建类的一般对象了,如下
Dog d = new Dog();
Tortoise c = new Tortoise();
// 然而多态就很骚,他要求把父类名写在前面
// 形式:父类名 自定义的对象名 = new 子类名
// 形象的合理性解释:动物肯定包括狗,狗是动物所以可以赋值
// 抽象解释:小范围的对象是可以赋值给大范围的对象的;大盒子装得下小盒子(前提是明确告知了谁是子类谁是父类)
Animal a = new Dog();
Animal b = new Tortoise();
// 请仔细观察输出结果,你会发现赋值并不会出现“覆盖”效果,这就是多态
a.run();
b.run();
}
}
狗是四足动物。
乌龟是四足两栖动物。
-
到这里,想必关于多态“ 同类型 的对象,执行同一个行为,会表现出不同的行为特征。”就了解得差不多了吧
-
多态中成员访问特点
●方法调用:编译看左边,运行看右边。
●变量调用:编译看左边,运行也看左边。 (多态侧重行为多态,面试常考,也是很刁钻的语法点,就离谱)
◆多态的好处
其中第二点是多态的核心优势
执行特征,又叫对象回调:
しかーし!
◆多态下引用数据类型的类型转换
//强制类型转换:
Animal a2 = new Tortoise();
a2.run();
Tortoise t = (Tortoise) a2;
t.egg();
注意:如果转型后的类型和对象真实类型不是同-种类型,那么在转换的时候就会出现ClassCastException
Dog d = (Dog) a2;
注意该代码不会报错,但是是错的,
因为在更上面的代码中a2是大盒子,然后里面装了乌龟这个小盒子,
本质是乌龟,强制转换时就等同于把乌龟转换成狗,狗和乌龟这两个类,这两个小盒子是平级关系
且本质不同,因此不可强制转换
官方对这种情况也是有应对的:
instanceof方法可以向开发者暴露出对象的真实对象,可以极大地降低对象错误的概率。
使用方式:
◆多态的综合案例
在上面的案例中,键盘、鼠标,归根结底都属于外接的usb部件,那我们就可以定义一个共同的规范(接口),都具有输入操作信息的功能,我们可以定义一个抽象类作为父类通过重写实现自己的独有功能;
接口的实现类将会作为电脑的相应的模块,即对象,此时电脑就变成了最大的盒子,盒子等级依次往下是 电脑–USB设备–键盘模块、鼠标模块
下面的博主正好做好了示例: