用最简单的一句话就是:父类型的引用指向子类型的对象。用一句比较通俗的话:同一操作作用于不同的对象,可以产生不同的效果。这就是多态。
这句话很好理解:Person person = new Student("张三");但是这个多态有什么作用呢?而我们又为什么要是有多态呢?
首先讲下封装和继承:封装是把过程和数据包围起来,对数据的访问只能通过已定义的界面,他把实现的细节影藏起来了,比如你在java中去实现一个类,这个类中提供了一些功能方法,你只需要知道你需要传递什么样的参数,会达到什么样的效果,实现细节在类中定义好了。从而使得代码模块化;而继承可以扩展已存在的代码模块,而目的就是为了代码重用。
那么多态除了代码的复用,还可以解耦。然而为什么要解耦?耦合度讲的是模块模块之间,代码代码之间的关联度,通过对系统的分析把他分解成一个一个子模块,子模块提供稳定的接口,达到降低系统耦合度的的目的,模块模块之间尽量使用模块接口访问,而不是随意引用其他模块的成员变量。
多态有什么好处?
有两个好处:
1. 应用程序不必为每一个派生类编写功能调用,只需要对抽象基类进行处理即可。大大提高程序的可复用性。//继承 2. 派生类的功能可以被基类的方法或引用变量所调用,这叫向后兼容,可以提高可扩充性和可维护性。 //多态的真正作用,
多态在什么地方用?
可以用在方法的参数中和方法的返回类型中。
在方法中的参数,请看下面的例子:
public abstract class Driver { public void run();//让子类来运行 }
class SBenz : Driver { public void run() { Console.WriteLine("Benz在以200迈的速度在run"); } }
class JD : Driver { public void run() { Console.WriteLine("JD is running..."); } }
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; } }
static void Main(string[] args) { Person p = new Person(); JD jd = new JD();//刚开始没钱就买辆JD吧 p.setDriver(jd); p.drive(); SBenz benz = new SBenz();//有钱换车了 p.setDriver(benz); p.drive(); }
在方法的返回类型中,请看下面的例子:
上面的例子中,不管是JD还是Benz都是我们自己直接new出来的.我们可以设计一个工厂类,专门生成汽车
/*** 我们将多态使用在方法的返回类型中* Driver可以是抽象类,也可以是接口,JD和Benz分别继承该类或实现该借口
*/
public class CarFactory { public Driver factory(String carName) { if (carName.Equals("JD")) { return new JD(); }
else if (carName.Equals("Benz")) { return new SBenz(); }
else { Console.WriteLine("对比起,不伺候"); return null; } } }
类型的参数.,传入参数的时候,可以传入任何一个类的对象,只要是对应的类的对象名称就可以了这就是多态的应用!