求证: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
说明经转型后的对象具有导出类中基类没有的方法,也就是说向上转型只是个名字而已,实际并没有裁剪导出类的方法,新建的对象也是导出类对象,只不过是通过动态绑定执行的。
但毫无疑问,多态还是很有意义的,因为我们并不想为每个导出类重写方法。
为了验证这个问题,我新建一个基类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
说明经转型后的对象具有导出类中基类没有的方法,也就是说向上转型只是个名字而已,实际并没有裁剪导出类的方法,新建的对象也是导出类对象,只不过是通过动态绑定执行的。
但毫无疑问,多态还是很有意义的,因为我们并不想为每个导出类重写方法。
相关文章推荐
- java作业--用上转型对象实现抽象类的方法
- (java)对象引用向上转型后,无法调用子类独有的方法和属性问题
- java程序练习:尝试创建一个父类,在父类中创建两个方法,在子类中覆盖第二个方法,为子类创建一个对象,将他向上转型到基类并调用这个方法。
- javascript实现类似java中getClass()得到对象类名的方法
- javascript实现类似java中getClass()得到对象类名的方法
- Java多态和实现接口的类的对象赋值给接口引用的方法(推荐)
- 关于Java中Scanner对象的hasNext()方法对实现Readable接口的对象中的read()方法调用的探讨
- 地磅称量系统之(53)在封装对象的类库中实现包括IDataErrorInfo接口提供的所有方法和并且扩展对异常具有添加和删除功能的基本业务对象基类
- (多态)Java向上转型之后调用子类的同名变量/方法的问题
- 阿里巴巴 Java 开发手册:asList 的返回对象是一个 Arrays 内部类,并没有实现集合的修改方法
- 【Java】【TIJ】实现一个类:不允许用构造方法来直接创建类实例(对象)
- Java初学习 - 多态和实现接口的类的对象赋值给接口引用的方法
- java基础:对象的向上转型/向下转型; 基本类型的 向上转型/向下转型实例(窄化)
- Java 基础数据类型 和 深度克隆对象的2种方法(实现Cloneable接口或者实现对象序列化)
- JAVA对象 向上转型upcasting,向下转型downcasting
- Java对象排序的3种实现方法
- Java中利用MessageFormat对象实现类似C# string.Format方法格式化
- 实现Java中对象比较的两个方法
- java4Android(6)函数的复写(override)/对象的转型(向上转型/向下转型)
- 尝试创建一个父类,在父类中创建两个方法,在子类中覆盖第二个方法,为子类创建一个对象,将它向上转型到基类并调用这个方法。