Java 多态的详细介绍

一、概述

  • 多态是同一个行为具有多个不同表现形式或形态的能力。
  • 多态是对于对象的概念,并不是对于类的概念

二、多态的格式及使用

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();
        }
    }
}

运行结果
在这里插入图片描述

猜你喜欢

转载自blog.csdn.net/weixin_44580492/article/details/106698878