一、概述
- 多态是同一个行为具有多个不同表现形式或形态的能力。
- 多态是对于对象的概念,并不是对于类的概念
二、多态的格式及使用
1.格式
//格式一:
父类名称 对象名 = new 子类名称();
//格式二:
接口名称 对象名 = new 实现类();
2.多态的代码实例
使用了格式二演示
格式一可以自己试一下,格式二在平时的使用频率是比较多的
//定义接口
interface Interface {
//在接口中定义两个抽象方法
void methodOne();
void methodTwo();
}
//定义第一个实现类,重写接口中的两个抽象方法
class ImplOne implements Interface{
@Override
public void methodOne() {
System.out.println("实现类ImplOne的methodOne方法");
}
@Override
public void methodTwo() {
System.out.println("实现类ImplOne的methodTwo方法");
}
}
//定义第二个实现类,重写接口中的两个抽象方法
class ImplTwo implements Interface{
@Override
public void methodOne() {
System.out.println("实现类ImplTwo的methodOne方法");
}
@Override
public void methodTwo() {
System.out.println("实现类ImplTwo的methodTwo方法");
}
}
//创建测试类
public class Test {
public static void main(String[] args) {
//创建第一个多态对象
Interface implOne = new ImplOne();
//使用implOne调用两个方法
implOne.methodOne();
implOne.methodTwo();
System.out.println("==========================");
//创建第二个多态对象
Interface implTwo = new ImplTwo();
//使用implTwo调用两个方法
implTwo.methodOne();
implTwo.methodTwo();
}
}
运行截图
【tips】
可以看出使用多态我们只需要关心接口中有什么方法,不必关心其它实现类如何实现,为所有实现类提供统一的方法调用
三、对象的向上、向下转型
1.向上转型
- 接口(或父类)通过实现类(或子类)去实例化,就是对象的向上转型,也就是一般的多态写法
- 向上转型可以自动完成。并且是安全的,类似于数据类型从小范围向大范围的自动转换
一般格式
接口名称 对象名 = new 实现类();
标准格式
实现类名称 实现类对象名 = new 实现类(); 接口名称 对象名 = (实现类)实现类对象名;
接口和实现类可同时替换为父类和子类
代码实例
//定义接口
interface USB{
void open();
void close();
}
//定义第一个实现类
class Mouse implements USB{
@Override
public void open() {
System.out.println("加载鼠标");
}
@Override
public void close() {
System.out.println("关闭鼠标");
}
}
//定义第二个实现类
class Keyboard implements USB{
@Override
public void open() {
System.out.println("加载键盘");
}
@Override
public void close() {
System.out.println("关闭键盘");
}
}
//测试类
public class Test {
public static void main(String[] args) {
//向上转型 标准格式
Mouse mouse = new Mouse();
USB usbMouse = mouse;
usbMouse.open();
usbMouse.close();
System.out.println("==========");
//向上转型 一般格式
USB usbKeyboard = new Keyboard();
usbKeyboard.open();
usbKeyboard.close();
}
}
运行结果
2.向下转型
- 向下转型是指接口(或父类)的对象,转换为实现类(子类)的对象,必须使用强制类型转换
- 并不是所有的父类对象都可以转换为子类对象。转换类型必须统一,否则会报出
java.lang.ClassCastException
(类转换异常)- 使用多态之后如果要使用实现类的成员方法,必须进行向下转型
一般格式
接口名称 对象名A = new 实现类(); ((实现类名称)对象名A) . 成员;
标准格式
接口名称 对象名A = new 实现类(); 实现类名称 对象名B = (实现类名称)对象名A;
接口和实现类可同时替换为父类和子类
代码实例
对 向上转型的代码 做出简单修改,在Mouse类中添加test成员方法
public void test(){
System.out.println("向下转型测试方法");
}
重新编写测试类
public class Test{
public static void main(String[] args) {
USB mouse = new Mouse();
//标准格式 调用成员方法
Mouse m = (Mouse)mouse;
m.test();
//一般格式 调用成员方法
((Mouse) mouse).test();
}
}
运行结果
3.instanceof关键字
- instanceof关键字可以用来判断一个类的对象所属类是否实现了某个接口,也可以用来判断一个实例对象是否属于某一个类
- 返回值为boolean类型
格式对象名 instanceof 接口(类);
代码实例
对 向下转型的代码 测试类作出修改
class Test{
public static void main(String[] args) {
USB mouse = new Mouse();
//判断 mouse 所属的Mouse类是否实现了USB接口
if (mouse instanceof USB){
System.out.println("是的");
}
//判断 mouse 对象是否属于Mouse类
if (mouse instanceof Mouse){
//结果为true,才会执行向下转型
//避免出现 java.lang.ClassCastException 错误
System.out.println("是的");
Mouse m = (Mouse)mouse;
m.test();
}
}
}
运行结果