在 JAVA多态用在解决什么问题?

本文解释了Java多态的概念,包括面向对象设计思想、接口与实现分离,并通过实例展示了多态在创建抽象类和具体动物类之间的应用。讨论了多态带来的优势,如可替换性、可扩充性、接口性、灵活性和简化性。

在 JAVA多态用在解决什么问题?

2011-11-24 07:39 wangjianr    分类:JAVA相关  |  浏览 3083 次
2011-11-24 07:51 提问者采纳
其实多态是一种面向对象的设计思想,也就是只给接口,让你去实现(可以替换实现),就是设计和实现的分离,这个做法有利于软件的重用。

举个例子,你创建了一个动物的抽象类或接口,里面有一些接口方法,你造了一个动物园,然后有各种动物的奔跑、叫唤、吃食等动作作为方法,但你并没有实现它,在没有任何动物之前你只用知道如何把这些动物都圈到笼子里,就有动物园了。

然后,从别处给你运来了老虎、狮子、猴子、狗、猫这些动物,都是实现了你的奔跑、叫唤、吃食这些方法了,这些就是具体动物的实现部分,你把他们挂到你动物园上就行了。这就是多态。

以下是一些理论的描述,请参考:

多态给我们带来的好处,可以归纳为如下5点:
1.         可替换性(substitutability)。多态对已存在代码具有可替换性。例如,多态对圆Circle类工作,对其他任何圆形几何体,如圆环,也同样工作。
2.         可扩充性(extensibility)。多态对代码具有可扩充性。增加新的子类不影响已存在类的多态性、继承性,以及其他特性的运行和操作。实际上新加子类更容易获得多态功能。例如,在实现了圆锥、半圆锥以及半球体的多态基础上,很容易增添球体类的多态性。
3.         接口性(interface-ability)。多态是超类通过方法签名,向子类提供了一个共同接口,由子类来完善或者覆盖它而实现的。例如,假设超类Shape规定了
    两个实现多态的接口方法,computeArea()以及computeVolume()。子类,如CircleSphere为了实现多态,可以完善或者覆盖这两个接口方法。
4.         灵活性(flexibility)。它在应用中体现了灵活多样的操作,提高了使用效率。
5.         简化性(simplicity)。多态简化对应用软件的代码编写和修改过程,尤其在处理大量对象的运算和操作时,这个特点尤为突出和重要。
       值得注意的是,多态并不能够解决提高执行速度的问题,因为它基于动态装载和地址引用,或称动态绑定。但在Java中,除了final类和一定条件下的final方法外,所有方法都由JVM在运行期间进行动态绑定。
Java多态解决了一些实际编程中的重要问题,以下是具体介绍: ### 减少代码冗余 多态可以将多个方法用一个方法体现出来。例如在解决主人给不同动物喂食物的问题时,使用多态可以用一个`feed`方法处理给不同动物喂不同食物的情况,而不需要为每种动物分别编写一个喂食方法。代码如下: ```java public class Main { static class Animal { private String name; public Animal(String name) { this.name = name; } public String getName() { return name; } } static class Dog extends Animal { public Dog(String name) { super(name); } } static class Cat extends Animal { public Cat(String name) { super(name); } } static class Food { private String name; public Food(String name) { this.name = name; } public String getName() { return name; } } static class Bone extends Food { public Bone(String name) { super(name); } } static class Fish extends Food { public Fish(String name) { super(name); } } static class Master { private String name; public Master(String name) { this.name = name; } public void feed(Animal animal, Food food) { System.out.println("主人" + name + "给" + animal.getName() + "吃" + food.getName()); } } public static void main(String[] args) { Master tom = new Master("tom"); Dog dog = new Dog("dog"); Bone bone = new Bone("bone"); Cat cat = new Cat("cat"); Fish fish = new Fish("fish"); tom.feed(dog, bone); tom.feed(cat, fish); } } ``` 通过多态,`feed`方法可以接受不同的`Animal`子类对象和`Food`子类对象,实现了代码的复用,减少了代码冗余[^2]。 ### 提高代码的可维护性和扩展性 多态允许使用统一的方法处理不同类型的对象。在音乐演奏的例子中,使用统一的`tune`方法,接受`Instrument2`类型的对象作为参数,无需区分具体的乐器类型。示例代码如下: ```java class Note2 { private int value; private Note2(int val) { value = val; } public static final Note2 middleC = new Note2(0), cSharp = new Note2(1), cFlat = new Note2(2); } class Instrument2 { public void play(Note2 n) { System.out.println("Instrument2.play()"); } } class Wind2 extends Instrument2 { public void play(Note2 n) { System.out.println("Wind2.play()"); } } class Stringed2 extends Instrument2 { public void play(Note2 n) { System.out.println("Stringed2.play()"); } } class Brass2 extends Instrument2 { public void play(Note2 n) { System.out.println("Brass2.play()"); } } public class Music2 { public static void tune(Instrument2 i) { i.play(Note2.middleC); } public static void main(String[] args) { Wind2 flute = new Wind2(); Stringed2 violin = new Stringed2(); Brass2 frenchHorn = new Brass2(); tune(flute); tune(violin); tune(frenchHorn); } } ``` 如果后续需要添加新的乐器类型,只需要创建新的`Instrument2`子类并实现`play`方法,而不需要修改`tune`方法,提高了代码的可维护性和扩展性[^3]。 ### 实现类型转换和对象调用 多态可以实现不同子类对象之间的类型转换和调用。例如在处理哺乳动物及其子类的例子中,可以将子类对象赋值给父类引用,并且在需要时进行类型转换。代码如下: ```java class Mammal{} class Dog extends Mammal {} class Cat extends Mammal{} public class TestCast { public static void main(String args[]) { Mammal m; Dog d = new Dog(); Cat c = new Cat(); m = d; d = (Dog)m; } } ``` 通过多态,实现了对象的灵活赋值和类型转换,使得程序可以根据实际情况处理不同类型的对象[^4]。
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值