多态,简单的来讲就是不同的对象可以执行相同的动作,而不用考虑他们内部的实现。其最根本的作用是,分离做什么和怎么做(实现),通过在基类定义“做什么”这个接口,在子类实现“做什么”这个接口,从而达到调用基类的接口而使用子类实现这一强大的功能。 通俗点说,比如你妈妈叫你去超市买酱油,你只要去超市买到酱油就行了,她不管你是去沃尔玛、去百佳、去大润发还是去华润万家买的。只要你买到了酱油这件事成功了,那么这都是可以的,而同时妈妈也只有在你回来之后才知道你是去哪里买的酱油,但是她知道你肯定是去超市买的。 这一功能可以把所有子类当做基类来使用,屏蔽不同子类间的差异,写出更加通用的代码,使得后期添加功能、更换代码时更加的便捷。同时使用多态也更加符合面向对象编程的基本目的,让代码只操作父类的引用。
java的多态与C++的多态很类似,但是java毕竟是完全以类来组成的编程语言,所以对类的编写要求也更加偏向思想而不只是面向对象的程序设计。但是java不支持多继承,但是可以通过接口的方式来实现来多继承。只有单继承时可以让程序员只用关注基类,并且只用编写与基类相关的代码即可,从而“忘掉”子类对象的类型。
在java中有许多不同的方式使用多态,其中最广为人知使用就是在设计模式解决方案中使用多态这一工具,而其中最广为流传的就是工厂方法这一个设计模式。当你理解了工厂方法设计模式这一概念,你也能基本了解多态究竟是个什么东西了。
先简单的以妈妈叫你买酱油为例。(仅使用一个子类为例且不使用工厂方法)
class Market{ public void buy(){ System.out.println("买酱油"); } } class Walmart extends Market{ public void buy(){ System.out.println("从沃尔玛买酱油"); } public void discount(){ System.out.println("沃尔玛酱油打折!"); } } public class BuySoySauce { public static void main(String[] args) { Market mama = new Walmart(); //使用父类的buy接口来调用子类的实现 mama.buy();//out:从沃尔玛买酱油 Walmart walmart = (Walmart)mama;//从基类向下强制转型 walmart.discount();//使用子类的部分功能 } }使用工厂方法模式的买酱油
interface IMarketFactory{ Market marketFactory(); } class Market{ public void buy(){ System.out.println("买酱油"); } } class Walmart extends Market{ @override public void buy(){ System.out.println("从沃尔玛买酱油"); } public void discount(){ //子类自身的方法 System.out.println("沃尔玛酱油打折"); } static IMarketFactory factory = new IMarketFactory() { //使用内部类的方式实现了一个工厂方法 @Override public Market marketFactory() { return new Walmart(); } }; } public class BuySoySauce { public static void buySoySauce(IMarketFactory factory){ Market market = factory.marketFactory(); //由工厂方法创建子类,通过factory是那个子类来决定实例化那个子类 //并且通过多态使基类指向实例化的子类,屏蔽不同子类之间的差异 //可以更加便捷的修改内部逻辑 market.buy(); } public static void main(String[] args) { /*Market mama = new Walmart(); mama.buy(); */ buySoySauce(Walmart.factory);//调用买酱油,使用Walmart类实例化 //使用工厂方法创建子类,并且使用buy方法 } }具体的java类图以及调用流程