目录
多态
多态的常见形式
多态下引用数据类型的类型转换
内部类
静态内部类
成员内部类
局部内部类
匿名内部类
视频教程传送门 -> https://www.bilibili.com/video/BV1Cv411372m?p=109
多态
同类型的对象,执行同一个行为,会表现出不同的行为特征。
多态的常见形式
父类类型 对象名称 = new 子类构造器;
接口 对象名称 = new 实现类构造器;
多态的前提:
有继承/实现关系;有父类引用指向子类对象;有方法重写
多态中成员访问特点:
方法调用 -> 编译看左边,运行看右边。(多态侧重行为多态)
变量调用 -> 编译、运行都看左边。
优势:
在多态形式下,右边对象可以实现解耦合,便于扩展和维护。
定义方法的时候,使用父类型作为参数,该方法就可以接收这父类的一切子类对象。
问题:
多态下不能使用子类的独有功能 => 通过强制类型转换解决
多态下引用数据类型的类型转换
自动类型转换(从子到父):子类对象赋值给父类类型
强制类型转换(从父到子)
此时必须进行强制类型转换:子类 对象变量 = (子类)父类类型的变量
强制类型转换
- 可以转换成真正的子类类型,从而调用子类独有功能
- 有继承关系/实现的2个类型就可以进行强制转换,编译无问题
- 运行时,如果发现强制转换后的类型不是对象真实类型则报错
类型转换异常:ClassCastException
=> 建议强转转换前使用instanceof判断当前对象的真实类型,再进行强制转换
变量名 instanceof 真实类型
判断关键字左边的变量指向的对象的真实类型,是右边的类型或者是其子类类型返回true
【例】电脑USB接入功能,USB可以是多种设备
需求:
设计一个电脑对象,可以安装2个USB设备
鼠标 -> 被安装时可以完成接入、调用点击功能、拔出功能
键盘 -> 被安装时可以完成接入、调用打字功能、拔出功能
分析:
定义一个USB的接口(申明USB设备的规范必须是:可以接入和拔出)-> USB.java
提供2个USB实现类代表鼠标(KeyBoard.java)和键盘(Mouse.java),让其实现USB接口,并分别定义独有功能
创建电脑对象(Computer.java),创建2个USB实现类对象,分别安装到电脑中并触发功能的执行
接口 USB.java
package com.itheima.d4_polymorphic_test;
public interface USB {
void connect();
void unconnect();
}
实现类 KeyBoard.java
package com.itheima.d4_polymorphic_test;
public class KeyBoard implements USB{
private String name;
public KeyBoard(String name) {
this.name = name;
}
@Override
public void connect() {
System.out.println(name + "成功接入设备");
}
@Override
public void unconnect() {
System.out.println(name + "成功弹出设备");
}
public void keyDown(){
System.out.println(name + "今天你的鲨鱼干嘛了>OO<");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
实现类 Mouse.java
package com.itheima.d4_polymorphic_test;
public class Mouse implements USB{
private String name;
public Mouse(String name) {
this.name = name;
}
@Override
public void connect() {
System.out.println(name + "成功接入设备");
}
@Override
public void unconnect() {
System.out.println(name + "成功弹出设备");
}
public void click(){
System.out.println(name + "一键三连~~~");
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}
Comupter.java 提供安装USB的入口(定义了一个方法installUSB)
package com.itheima.d4_polymorphic_test;
public class Computer {
public void installUSB(USB u){
u.connect();
// 独有功能
if(u instanceof Mouse){
Mouse m = (Mouse) u;
m.click();
}else if(u instanceof KeyBoard) {
KeyBoard k = (KeyBoard) u;
k.keyDown();
}
u.unconnect();
}
}
测试类 Test.java
package com.itheima.d4_polymorphic_test;
public class Test {
public static void main(String[] args) {
// a、创建电脑对象
Computer c = new Computer();
// b、创建USB设备对象
USB u = new Mouse("罗技鼠标");
c.installUSB(u);
System.out.println("----------------");
USB k = new KeyBoard("CHERRY键盘");
c.installUSB(k);
}
}
输出:
内部类
内部类就是定义在一个类里面的类,里面的类可以理解成(寄生),外部类可以理解成(宿主)。
静态内部类
格式:外部类名.内部类名 对象名 = new 外部类名.内部类构造器;
特点、使用与普通类是一样的,类有的成分它都有,只是位置在别的类里面。
可以直接访问外部类的静态成员,不能直接访问外部类的实例成员。
成员内部类
格式:外部类名.内部类名 对象名 = new 外部类构造器.new 内部类构造器();
例如:Outer.Inner in = new Outer().new Inner();
无static修饰,属于外部类的对象。
可以直接访问外部类的静态成员,实例方法中可以直接访问外部类的实例成员。
在成员内部类中访问所在外部类对象 ,格式:外部类名.this
局部内部类
放在方法、代码块、构造器等执行体中。
匿名内部类
格式:
new 类|抽象类名|或者接口名() {
重写方法;
};
特点:
匿名内部类是一个没有名字的内部类。
匿名内部类写出来就会产生一个匿名内部类的对象。
匿名内部类的对象类型相当于是当前new的那个的类型的子类类型。
Animal a = new Animal() {
public void run() {
System.out.println("鲨鲨游啊游");
}
};
a. run();
作用:方便创建子类对象,最终目的为了简化代码编写。


![[Java笔记11] 面向对象5(多态、内部类) [Java笔记11] 面向对象5(多态、内部类)](http://www.mshxw.com/aiimages/31/584200.png)
