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();
        }
    }
}
运行结果
 
 
                    
                     
                    
                 
                    
                
 
                
            
         
         浙公网安备 33010602011771号
浙公网安备 33010602011771号