多态的浅显解释——以java语言为例

什么是多态

多态,简单的来讲就是不同的对象可以执行相同的动作,而不用考虑他们内部的实现。其最根本的作用是,分离做什么和怎么做(实现),通过在基类定义“做什么”这个接口,在子类实现“做什么”这个接口,从而达到调用基类的接口而使用子类实现这一强大的功能。
通俗点说,比如你妈妈叫你去超市买酱油,你只要去超市买到酱油就行了,她不管你是去沃尔玛、去百佳、去大润发还是去华润万家买的。只要你买到了酱油这件事成功了,那么这都是可以的,而同时妈妈也只有在你回来之后才知道你是去哪里买的酱油,但是她知道你肯定是去超市买的。
妈妈叫你去买酱油
这一功能可以把所有子类当做基类来使用,屏蔽不同子类间的差异,写出更加通用的代码,使得后期添加功能、更换代码时更加的便捷。同时使用多态也更加符合面向对象编程的基本目的,让代码只操作父类的引用。

java与c++两种编程语言的不同

java的多态与C++的多态很类似,但是java毕竟是完全以类来组成的编程语言,所以对类的编写要求也更加偏向思想而不只是面向对象的程序设计。但是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类图以及调用流程具体的类图

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值