`
liyanhui
  • 浏览: 349746 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

什么是多态?为什么用多态?有什么好处?

阅读更多

转载:http://hi.baidu.com/python811022/blog/item/613a7b8d4369b116b31bba39.html

多态可以分为变量的多态,方法的多态,类的多态.我这里强调的是类的多态,这是我们在以后的工作中经常回用到的

首先,有这样一个系统:有个学生工作从达内毕业了,作的还不错.买了辆捷达汽车.这个系统应该如何设计呢?
按照OO的思想,我们会抽象出来一个类,表示捷达汽车,其中有个run()方法
public class JD{
public void run(){
System.out.println("JD在以120迈的速度在run");
}
}
我们还会抽象出一个类,来代表人.其中有个drive()方法,需要一个汽车类型作为参数,我们先传入一个JD类型的参数

// 这是我们的核心业务类
public class Person{
public void drive(JD jd){
jd.run();
}

public static void main(String args[]){
Person p =new Person();
JD jd = new JD();
p.drive(jd);
}
}

如果你写出这样的代码的话,恭喜你!你中大奖了!---------------------你会被项目精力砍死的!!!!!!!

项目经理为什么会砍你呢?
因为你写的代码偶合性太强了!

如果我们的需求变了,这个学生后来更有钱了,买了一两Benz.那么我们以前的系统怎么办啊.不要指望你作的系统永远不会变化
我们的系统只能修改!这就是项目经理砍你的原因
我们的系统会增加一个Benz类,也有个run()方法

public class Benz{
public void run(){
System.out.println("Benz在以200迈的速度在run");
}
}

我们的核心业务类也要修改

public class Person{

/*
public void drive(JD jd){
jd.run();
}
*/

public void drive(Benz b){
b.run();
}

public static void main(String args[]){
Person p =new Person();
Benz b = new Benz();
p.drive(b);
}
}

以后的情况,我们可以把车抽象出来:
public abstract class Driver{
/*属性*/
public void run();//让子类来运行
}

public Benz extends Driver{
public void run(){
System.out.println("Benz在以200迈的速度在run");
}
}
public JD extends Driver{
public void run(){
System.out.println("JD is running...");
}
}

public class Person{
private Driver driver;
public Person(){

}
public Person(Driver driver){
this.driver = driver;
}
public void drive(){
driver.run();
}
public void setDriver(Driver driver){//运用参数多态,以后不管买什么车都可以
this.driver = driver;
}


public static void main(String args[]){
Person p =new Person();
JD jd = new JD();//刚开始没钱就买辆JD吧
p.setDriver(jd);
p.driver();
Benz benz = new Benz{();//有钱换车了
p.setDriver(benz);
p.driver();
}
}

什么是多态?
简单的说:就是用基类的引用指向之类的对象

提问:多态可以用在什么地方呢?
回答:可以用在方法的参数中和方法的返回类型中

其中方法的参数楼上的兄弟已经给出了代码.我这里给出在方法的返回类型中如何使用多态

上面的例子中,不管是JD还是Benz都是我们自己直接new出来的.我们可以设计一个工厂类,专门生成汽车

/**
* 我们将多态使用在方法的返回类型中
* Car可以是抽象类,也可以是接口,JD和Benz分别继承该类或实现该借口
*/
public class CarFactory{
public Car factory(String carName){
if(carName.equals("JD")){
return new JD();
}else if(carName.equals("Benz")){
return new Benz();
}else{
System.out.println("对比起,不伺候");
return null;
}
}
}

这实际上就是设计模式中的简单工厂模式!

另外,我我们在JDK中可以大量的看到多态的应用,比如在Object类中的equals(Object obj)方法中,参数是个Object

类型的参数.因为Object是Java中所有类的基类.,但是才传入参数的时候,可以传入任何一个类的对象
这就是多态的应用!

使用多态可以解决项目中紧偶合的问题,提高程序的课扩展性.是OCP原则的一个具体的实现

 

分享到:
评论
2 楼 yuyang222 2011-09-07  
感谢~~~~~~~~~~~~~~~
1 楼 looxiaohu 2008-03-05  
  顶一个

相关推荐

    java的编译时多态和运行时多态

    Java 编译时多态和运行时多态 Java 编译时多态和运行时多态是 Java 语言中两个重要的概念,它们都是多态性的实现方式,但它们在实现机制和应用场景上有所不同。 编译时多态 编译时多态是指在编译期根据参数列表的...

    hibernate的多态查询

    描述部分虽然为空,但通常情况下,多态查询可能涉及到的概念包括:继承、多态性、动态类型、实体类、继承层次结构的映射、集合的多态处理等。根据给出的博客链接,我们可以推测该博客可能详细讲解了这些概念在...

    Java面试题严庭润的

    - 什么是多态?如何在Java中实现多态? ## 3. 异常处理 - 什么是Java异常?有哪些常见的Java异常? - try-catch-finally块的作用是什么? - 什么是Java中的断言?如何使用? ## 4. 数据库和SQL - 什么是数据库?...

    java多态小结

    #### 什么是多态? 多态(Polymorphism)是面向对象编程的一个核心特性,指的是一个接口可以被多个类所实现或一个类可以被多个类所继承,进而表现出不同的行为。在Java中,多态主要体现在两个方面:**编译时类型与...

    多态学习-什么是多态及代码

    例如,在处理一组具有共同接口的对象时,可以使用多态来设计方法,这样就不需要为每种类型创建单独的处理方法。在上述USB设备的例子中,笔记本类只需要一个通用的`usbInterface`方法,接收父类`UsbDevice`的引用,...

    一个HW 多态题目 一个HW 多态题目

    首先,我们要理解什么是多态。多态是指一个接口可以有多种不同的表现形式或行为。在C++中,多态主要通过虚函数实现。当基类指针或引用指向派生类的对象时,调用虚函数会根据实际的对象类型来执行相应的函数实现,这...

    labview创建多态VI

    下面将详细介绍如何在LabVIEW中创建和使用多态VI。 1. **定义多态VI的基本结构** 在LabVIEW中,一个多态VI通常包含一个或多个输入端子,这些端子的数据类型决定了VI的行为。例如,你可以创建一个VI,它的输入是一...

    Java多态的实现机制

    Java多态的实现机制 Java 多态的实现机制是面向对象程序设计中代码重用的一个重要机制。多态性是 Java 的三大属性之一,在开发中很重要的一个环节。多态性使对象能够调用正确的方法版本,从而提高代码的重用性和...

    一个实例告诉你什么是封装继承和多态

    多态有两种主要形式:编译时多态(静态多态)和运行时多态(动态多态)。在`ConsoleApplication1`中,如果有一个`display`方法在`Person`类中被声明为抽象或虚方法,那么在`Student`类中重写这个方法后,可以通过`...

    java面试纯基础,基础牢固面试稳过

    为什么? 解释 Java 中的面向对象编程四大特性。 面向对象 什么是继承?在 Java 中如何实现继承? 什么是多态?请举例说明。 接口和抽象类有什么区别? 异常处理 什么是异常?Java 中有哪些类型的异常? 如何自定义...

    多态代码实例

    多态允许我们使用一个通用的接口来处理不同类型的对象,提供了代码的灵活性和可扩展性。虚函数(Virtual Function)是实现多态的一种方式,尤其是在C++语言中。本文将通过两个具体的代码实例,帮助你深入理解和掌握...

    多态的练习案例

    在编程领域,多态(Polymorphism)是面向对象编程中的一个重要概念,它允许我们用一个接口处理多种不同的数据类型。多态性使得程序更加灵活,可扩展性更强,能够提高代码的重用率。本练习案例将深入探讨多态的常见...

    Java 多态应用,掌握多态

    多态性允许我们使用一个通用的接口来处理不同类型的对象,使得代码更具灵活性和可扩展性。理解并熟练运用多态,能够极大地提升程序设计的效率和代码的可读性。 首先,我们来详细解释一下多态的概念。多态分为编译时...

    java多态的总结

    编译时多态主要体现在方法的重载(Overloading),即在同一个类中可以有多个同名方法,但参数列表不同。编译器会根据传入参数的类型和数量来决定调用哪个方法。运行时多态则基于方法的重写(Overriding),子类可以...

    c++之多态求面积

    c++ 多态求面积 什么是多态,怎样用多态求面积,非常好的东西

    原来多态还可以这样

    "原来多态还可以这样"这个标题揭示了一个可能的惊喜,即对于初学者或者一些开发者来说,多态性可能有他们未曾了解的深层次或者创新的使用方式。通过博主Andy99在iteye上的博文链接,我们可以推测这篇文章可能介绍了...

    基于C++的多态模式编写类的代码多态.docx

    在C++中,多态(Polymorphism)是面向对象编程的一个核心概念,它允许我们使用一个接口来表示多种不同的类型。多态性使得代码更加灵活,可扩展性更强,可以减少代码重复,并提高代码的复用性。在这个文档中,通过两...

    labview多态vi的实现

    4. 文档和注释:为多态VI及其子VI添加详细的文档和注释,帮助其他开发者理解其工作原理。 5. 单元测试:对每个子VI进行单元测试,确保其功能正确无误。 通过掌握和应用LabVIEW的多态VI,开发者可以编写出更加高效...

    java 多态 经典讲解

    ### Java多态经典讲解 #### 一、理解Java多态 多态,作为面向对象编程的三大特性之一,是继抽象和继承之后的关键概念。它允许我们以统一的接口处理不同类型的对象,增强了代码的灵活性和可扩展性。在Java中,多态...

    多态的编译器实现原理

    ### 多态的编译器实现原理 #### 概述 多态是面向对象编程中的一个重要概念,它允许程序员在不指定具体类型的情况下处理不同类型的对象。本文将深入探讨多态在编译器层面是如何实现的,特别是关注虚拟函数表...

Global site tag (gtag.js) - Google Analytics