今天看了关于重载与多态的文章,觉得不错,分享下

本文深入浅出地解释了面向对象编程中的三大核心概念:重载、重写和多态。并通过具体实例帮助读者理解这些概念的应用场景及其背后的原理。

重载,就象一辆客车,本来只能坐30个人,结果坐了50人,我们说它超重(zhong)了。放到一个程序设计语言里,就可以理解成“一个方法本来只有一个入口,或者说它只完成一个功能,但是我们通过设置不同的参数列表,使它的负担更重了”。

重写,也叫覆盖,就是子类重新实现了父类的方法。


其实面象对象并不难理解,可以拿现实中的事物模型来作参考:

父类:动物
子类:人、马、蛇、鸟 是“动物”的子类。
子类:男人、女人是“人”类的子类,燕子、麻雀是“鸟”的子类。

父类是比子类更加“泛”的类型,而子类则是比父类更加“精确”的类型。比如说,“我们昨天捕到一只鸟”和“我们昨天捕到一只麻雀”相比,前者所指的类型更泛,后者说的类型更精确。相应的还有如“那里坐着一个人”和“那里坐着一个女人”等等。

重载(overload)不一定是面象对象程序设计语言里有的东西。只要编译器支持,结构化程序设计语言里也可以有重载。
重写(override)则是与继承有关的概念。它表示父类有一个方法,而到了子类那里,实现的方式不一样,所以必须要改写父类的实现过程。比如,鸟类一般是通过下蛋来繁衍后代,鸟类有一个方法叫"createChildren()",实现时是用下蛋的方式,假设有一种鸟(是“鸟”类的子类)是通过胎生来繁衍后代的,那么这个子类就应该重写 createChildren() 方法。

多态说白了就是一个对象有多种类型。
比如说在上面的模型里,如果“克林顿”是一个“男人”,那么他肯定是一个“人”,显然他也应该是一个“动物”

也就是说,在java这样的单继承语言中,子类的一个对象一定是其父类的一个对象,子类的对象同时具有了它的父类、祖父类、祖祖父类......的类型。这是多态的一种形式,所以在java中,子类的一个对象赋值给父类的一个对象时,是不需要作类型转换:
Human 克林顿 = new Man();
或者
Animal 克林顿 = new Human();


上面说的是从子类到父类。现在看父类到子类,假设我们得到一个“人”类的对象,那么这个人有可能是一个男人,也可能是一个女人,当然如果“男人”和“女人”又有子类的话,也可能是一个“当了父亲的男人”或者“当了母亲的女人”等等。也就是说,一个父类的对象,它有可能是这个父类的众多子类的一个对象,这也是多众的一种情况。在这种情况下,赋值操作就要作类型检查和类型转换了:
Human human = getHuman(); // 从程序其它模块得到一个 Human 对象
if(human instanceof Man){
  Man m = (Man)human;
  // 调用 Man 类的方法
}


并不是所有的类型都可以相互进行转换,比如在上面的模型中,我们可以把一个“人”的对象转换成“男人”或“女人”的类型,这是进行更精确的类型转换;而要想把一个类型为“马”的对象转换成“人”,或者把一个“男人”转换成“女人”类型显然是行不通的,别说运行时,连编译都通不过。顺着这个思路,我们可以总结出可以和不可以进行类型转换的种种情况。


很显然,我们可以通过子类的对象调用其父类的公有方法。比如,如果一个动物有一个方法:sleep(),那么我们也可以调用人的对象的 sleep() 方法:
Man m = new Man();
m.sleep();
而不可以通过父类的对象调用子类才有的方法,比如只有“女人”才有的“生孩子”方法,在“人”类的对象中不可以调用:
Human h = ......
h.生孩子();
因为这个时候还不能确定这个人就一定是一个“女人”。


在java中,多态还表现在抽象类和接口上。

抽象类是用来继承的类,如果抽象类没有被继承,则它就没有存在的意义(由此也可以推断出抽象类至少有一个非私有的构造方法,否则编译通不过)。抽象类可以这样理解,可以确定一个类型一定会有一个操作,但是这个操作的实现必须精确到它的子类时才能确定。
另外看一个模型,一家公司有员工类(Employee),还有其子类:销售(Sales)、市场(Market)、工程师(Engineer)、会计(Accounting)等。某一天老板招所有员工开了个短会,完了之后对所有的员工(Employee)说,大家回去工作吧。
在这里我们可以认为老板调用了所有员工对象的 continueToWork() 方法。
可以确定的是,员工类应该有一个方法 continueToWork() 方法。而员工如何实现他们的工作方法却只有精确到子类才能确定,因为不同的工种工作的方式是不一样的。


使用多态可以增强系统的灵活性,降低模块之间的耦合。因为我们很多时候都关心对象的父类型,而忽略它更精确的类型,比如上面的老板叫大家回去工作时,他是对全体员工说的,在这句放中,指的是“员工”类型,而不是精确的类型。再比如我们上饭店吃完饭买单时,只关心你是一个顾客(“人”类),而不会关心你的精确类型,也不会关心你是否在哪里工作,更不会关心是不是一个有孩子的父亲。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值