您的位置:首页 > 编程语言 > Java开发

求证:Java向上转型,转型后得到的对象具有导出类(实现类)的方法

2008-09-02 08:14 447 查看
在学习多态的时候,经向上转型后的对象可以直接调用父类的方法,然后再执行的时候进行动态绑定(后期绑定),以明确具体的方法体。那么经向上转型的对象出了具有父类的方法以外,具有导出类新增加的方法吗?

为了验证这个问题,我新建一个基类Instruments(乐器),他具有play()(演奏)方法。新建一个乐器的导出类Piano(钢琴),它具有方法open()(打开琴盖),和play()(弹奏)两种方法。新建测试类TestInstruments,在测试类中使用Instruments p = new Piano();进行向上转型,然后利用java的反射机制,得到转型后对象p的方法,查看是否有open()方法,如果没有,说明经转型后的对象不具有导出类中基类没有的方法,如果有,说明经转型后的对象具有导出类中基类没有的方法。

下面是代码实现:

Instruments.java

package com.sunrise.polymorphism;

public interface Instruments {

void play();

}

Piano.java

package com.sunrise.polymorphism;

import static java.lang.System.out;

public class Piano implements Instruments {

public void play() {

// TODO Auto-generated method stub

out.println("playing piano.");

}

public void open(){

out.println("opening piano.");

}

}

TestInstruments.java

package com.sunrise.polymorphism;

import java.lang.reflect.*;

public class TestInstruments {

void tune(Instruments i){

i.play();

}

/**

* @param args

*/

public static void main(String[] args) {

// TODO Auto-generated method stub

TestInstruments t = new TestInstruments();

Instruments p = new Piano();

t.tune(p);

Class c = p.getClass();

//解析方法信息

Method[] ms = c.getDeclaredMethods();

for(Method m : ms){

System.out.println("----------------------------------------------");

System.out.println("方法:" + m.toString());

System.out.println("/t方法名:" + m.getName());

int mod = m.getModifiers();

System.out.println("/t方法修饰符:" + Modifier.toString(mod));

System.out.print("/t方法参数列表:");

Class pts[] = m.getParameterTypes();

for (int i = 0; i < pts.length; i++) {

Class class1 = pts[i];

if(i != 0 )

System.out.print(", ");

System.out.print(class1);

}

System.out.println();

System.out.println("/t返回值类型:" + m.getReturnType());

}

}

}

运行TestInstruments.java,结果如下:

playing piano.

----------------------------------------------

方法:public void com.sunrise.polymorphism.Piano.open()

方法名:open

方法修饰符:public

方法参数列表:

返回值类型:void

----------------------------------------------

方法:public void com.sunrise.polymorphism.Piano.play()

方法名:play

方法修饰符:public

方法参数列表:

返回值类型:void

说明经转型后的对象具有导出类中基类没有的方法,也就是说向上转型只是个名字而已,实际并没有裁剪导出类的方法,新建的对象也是导出类对象,只不过是通过动态绑定执行的。

但毫无疑问,多态还是很有意义的,因为我们并不想为每个导出类重写方法。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐