什么是多态?
概念:同一操作作用于不同的对象,可以有不同的解释,产生不同的执行结果,这就是多态性。简单的说:就是用基类的引用指向子类的对象。
为什么要用多态呢?
原因:我们知道,封装可以隐藏实现细节,使得代码模块化;继承可以扩展已存在的代码模块(类);它们的目的都是为了——代码重用。而多态除了代码的复用性外,还可以解决项目中紧偶合的问题,提高程序的可扩展性.。耦合度讲的是模块模块之间,代码代码之间的关联度,通过对系统的分析把他分解成一个一个子模块,子模块提供稳定的接口,达到降低系统耦合度的的目的,模块模块之间尽量使用模块接口访问,而不是随意引用其他模块的成员变量。
多态有什么好处?
有两个好处:
1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承
2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。 //多态的真正作用,
多态在什么地方用?
可以用在方法的参数中和方法的返回类型中。
在方法中的参数,请看下面的例子:
编写USB接口:
package cn.itcast.day10.demo01.demo03; public interface USB { public abstract void open();//打开设备 public abstract void close();//关闭设备 }
实现USB接口设备:(鼠标类Mouse)
package cn.itcast.day10.demo01.demo03; public class Mouse implements USB { @Override public void open() { System.out.println("打开鼠标"); } @Override public void close() { System.out.println("关闭鼠标"); } public void click() { System.out.println("鼠标输入"); } }
实现USB接口设备:(键盘类Keyboard)
package cn.itcast.day10.demo01.demo03; //键盘是一个USB设备 public class Keyboard implements USB { @Override public void open() { System.out.println("打开键盘"); } @Override public void close() { System.out.println("关闭键盘"); } public void type() { System.out.println("键盘输入"); } }
实现电脑类(Computer)
package cn.itcast.day10.demo01.demo03; public class Computer { public void powerOn(){ System.out.println("笔记本电脑开机"); } public void powerOff(){ System.out.println("笔记本电脑关机"); } //使用USB设备的方法,使用接口作为方法的参数 public void useDevice(USB usb){ usb.open();//打开设备 if(usb instanceof Mouse){ Mouse mouse=(Mouse)usb;//向下转型 mouse.click(); }else if(usb instanceof Keyboard){ Keyboard keyboard=(Keyboard) usb;//向下转型 keyboard.type(); } usb.close();//关闭设备 } }
main主函数调用(DemoMain)
package cn.itcast.day10.demo01.demo03; public class DemoMain { public static void main(String[] args) { //首先创建一个笔记本电脑 Computer computer=new Computer(); //打开电脑 computer.powerOn(); //首先进行向上转型 USB usbMouse=new Mouse();//使用多态(左父右子 或者 左接口右实现) //参数时USB类型,正好传递的是USB鼠标 computer.useDevice(usbMouse); //创建一个USB键盘 Keyboard keyboard=new Keyboard();//没有使用多态 //方法参数是USB类型,传递进去的是实现类对象 computer.useDevice(keyboard); //正确写法!也发生了向上转型 //使用子类对象,匿名对象,也可以 computer.useDevice(new Keyboard());//也是正确写法 //关闭电脑 computer.powerOff(); System.out.println("===================="); methed(10.0); methed(20);//正确写法 int a=30; methed(a);//正确写法 int ---> double } public static void methed(double num){ System.out.println(num); } }