本篇文章我们主要了解Java的多态机制,首先简单介绍一下什么是多态:
所谓多态嘛,就是同一个行为具有多个不同表现形式或形态的能力,简单明了。当然对于新手小白来说可能有点抽象,通俗点来说就是一个动作行为会执行不同的操作,即一个方法会执行不同的语句块。站在Java程序的角度来说就是一个接口定义某些对象共有的方法,然后由这些对象来重写这些方法实现不同的操作,他们都属于这个接口类型。
以下通过一个电脑和USB设备之间关系的案例来介绍:
Usb设备主要有鼠标、键盘,他们都有插入电脑,拔出电脑,以及在电脑执行操作等动作,那么我们可以定义一个接口Usb,接口中主要包含,插入(init)、拔出(destory)、执行(run)方法。
定义鼠标和键盘类,让他们实现Usb接口,并重写接口中的方法,从而实现自己特定的操作。
而电脑调用这些设备时,就可以统一使用Usb对象来调用,而实际上设备还是实例化各自的对象。
Usb接口:
package com.csdn.Impl;
//定义Usb接口指定usb设备共同具有的动作
public interface Usb {
//模拟usb设备插入电脑
void init();
//模拟usb设备执行操作
void run();
//模拟usb设备拔出
void destory();
}
鼠标类:
package com.csdn.Impl;
/**
* 鼠标属于Usb设备,实现usb接口并指定鼠标在usb设备中的特定操作(实现接口、重写方法)
*/
public class Mouse implements Usb{
//鼠标对象的名称,默认为鼠标
private String name="鼠标:";
//实例化时表示鼠标已经插入电脑
public Mouse(String name){
this.name+=name;
this.init();
}
@Override
/**
* 插入电脑时执行的操作(重写init方法)
*/
public void init() {
System.out.println(name+"已插入");
}
@Override
/**
* 鼠标被电脑使用时执行的操作(重写run方法)
*/
public void run() {
System.out.println(name+"执行操作");
}
@Override
/**
* 鼠标拔出时执行的操作(重写destory方法)
*/
public void destory() {
System.out.println(name+"已从电脑拔出");
}
}
键盘类:
package com.csdn.Impl;
/**
* 键盘属于Usb设备,实现usb接口并指定键盘在usb设备中的特定操作(实现接口、重写方法)
*/
public class KeyBoard implements Usb {
//键盘对象的名称,默认为键盘
private String name="键盘:";
//实例化时表示键盘已经插入电脑
public KeyBoard( String name){
this.name+=name;
this.init();
}
@Override
/**
* 插入电脑时执行的操作(重写init方法)
*/
public void init() {
System.out.println(name+"已插入");
}
@Override
/**
* 键盘被电脑使用时执行的操作(重写run方法)
*/
public void run() {
System.out.println(name+"执行操作");
}
@Override
/**
* 鼠标拔出时执行的操作(重写destory方法)
*/
public void destory() {
System.out.println(name+"已从电脑拔出");
}
}
电脑类:
package com.csdn.Impl;
public class Computer {
//电脑对象的名称
private String name;
public Computer(String name){
this.name=name;
}
/**
* 模拟使用usb设备
* @param usb 传入一个usb对象,即为被电脑使用的设备
*/
public void usbRun(Usb usb){
System.out.println("电脑:"+name+"使用了usb设备");
usb.run();
}
/**
* 模拟拔出usb设备
* @param usb,传入一个usb对象,即为被电脑拔出的设备
*/
public void removeUsb(Usb usb){
System.out.println("电脑:"+name+"拔出了usb设备");
usb.destory();
}
}
测试类:
package com.csdn.test;
import com.csdn.Impl.Computer;
import com.csdn.Impl.KeyBoard;
import com.csdn.Impl.Mouse;
import com.csdn.Impl.Usb;
public class Test {
public static void main(String[] args) {
Computer com = new Computer("小电");//创建一个电脑
Usb mouse = new Mouse("小鼠"); //创建一个鼠标的usb设备
Usb keyboard = new KeyBoard("小键");//创建一个键盘的usb设备
com.usbRun(mouse); //模拟使用鼠标
com.removeUsb(mouse); //模拟拔掉鼠标
com.usbRun(keyboard); //模拟使用键盘
com.removeUsb(keyboard); //模拟拔掉键盘
}
}
运行结果如下:
以上电脑类中:usbRun方法参数指定的是个Usb对象,而实际传入的是一个Mouse对象或KeyBoard对象,这便是多态的体现。
同时在测试类中,实例化对象时,使用了Usb usb = new Mouse()的方法,因为Mouse类实现了Usb接口,这便是向上转型(实际上还是Mouse或KeyBoard对象),这也是多态的体现。
希望这篇文章让你对Java多态更好理解。