}
再写一个手机类 package blog;
public class Mobile {
public void work(ElectricProvider ep) {
ep.provide(); } }
以下是测试 package blog;
public class Test {
public static void main(String[] args) {
Mobile mobile=new Mobile(); ElectricProvider ep=new Battery();
mobile.work(ep);//根据实参的类型自动选择方法,这个实参是Battery类型,所以会运行电池供电的方法
ep=new Transformer();
mobile.work(ep);//根据实参的类型自动选择方法,这个实参是Transformer类型,所以运行线充供电的方法 } }
看到mobile.work(ep)这个方法了吗,它就是多态,第一次出现的时候被理解成电池,第二次出现的时候别理解成充电器,多种状态都出现了,多态故此得名!
它有两点好处:第一编程大大简单了,无论是电池还是线充只要用
mobile.work(ep)就搞定了,是不是很方便,还有就是实参的方法被隐藏了。从mobile.work(ep)看不出ep是如何调用方法的!
这种机制在机器内部是如何执行的?请慢慢听我道来。众所周知程序要先编译再运行,Java也不例外,在执行编译的时候mobile.work(ep)这条 语句是这样处理的:首先会判断ep的类型是什么?在编译时是按照声明的类型来判断的,所以ep是ElectricProvider类型,由于 ElectricProvider中有provide方法,所以编译顺利通过。在运行程序时ep的类型并非按照声明的类型来处理,而是它的实际类型,第一 次ep的实际类型是Battery所以会执行Battery的provide方法,第二次ep的实际类型是Transformer所以执行的方法是 Transformer的provide方法。这就是多态的运行机制!
多态对于Java是很重要的,它体现了一种思想,针对父类编程。看一看在程序中public void work(ElectricProvider ep)是不是真对父类,
ElectricProvider ep=new Battery();ep=new Transformer();是不是把子类对象都声明为父类的引用。它的好处还不止于此,以后我们还要接触到针对接口编程,那是Java的核心,如果你能对“针对父类编程”有深刻体会的话,那么针对接口编程你也会很快理解的。
PS:什么是对象的引用?
Java号称去掉了指针的语法,其实只是去掉了针对指针的操作,而且把指针改了一个名字叫引用,例如上面的程序ElectricProvider ep=new Battery(),我们声明了一个ElectricProvider类型的指针(引用),它指向计算机的内存中的一个地址,这个地址是存储 Battery对象的首地址,后面又执行了一句ep=new Transformer();此时计算机的内存中又存储了一个Transformer类型的对象,这时ep指针中指向的地址就变成了 Transformer类型的对象的首地址。这是我第一次也是最后一次说指针了,因为C++的程序员们对指针很熟悉,所以我把引用称为指针是为了让大家更 好的理解引用的实质,但是以后不会说了,毕竟我们要进军Java领域,以后要尝试着说Java的行话!
4、组合
接着上次的的例子谈谈组合,想想我们买手机的时候除了手机本身是不是已经包括电池了?
没有电池的手机是无法工作的,所以电池应该是手机的一部分,这样说来上面那个例子的手机类的写法就可以做一点小的修改 package blog;
package blog;
public class Mobile {
private Battery battery;
public Mobile(Battery battery) {
this.battery = battery; }
public void setBattery(Battery battery) { this.battery = battery; }
public void work() {
battery.provide(); } }
从这里可以看出,电池已经作为了手机的一部分,另外我又添加了一个public void setBattery(Battery battery)的方法,想一想这个方法是做什么用的呢?如果手机的电池坏了,可不可以换一块呢?这个方法就提供了更换电池的手段。 请看测试函数 package blog;
public class Test {
public static void main(String[] args) {
Battery battery=new Battery(); Mobile mobile=new Mobile(battery); mobile.work();
相关推荐: