一、首先,看如下代码,刚看起来似乎是在父类中调用子类的show()方法,可是仔细想想并不是那么回事,在如下代码的Father类中的hit()方法中用到了反射机制,我们知道反射机制所体现的就是动态性,也就是说,结果只有在运行起来之后(动起来之后)才可以确定结果,代码如下:
public class Father {
public void hit(String name) throws Exception{
Method show = this.getClass().getDeclaredMethod("show",String.class);
// 此处调用了 show 方法
show.invoke(this, name);
System.out.println("父亲:" + name);
}
}
class Son extends Father{
public void show(String name){
System.out.println("son:" + name);
}
}
class te{
public static void main(String[] args) throws Exception {
Son son = new Son();
son.hit("jack");
}
}
运行结果:
son:jack
父亲:jack
二、通过如上代码的运行结果,我们可以看到,使用反射的这种方式调用不是一种显示的调用(obj.method() );我们也可以看到,在Father父类的hit()方法中调用了Son子类的show()方法,能这样运行并且不报错的原因是:
1.Son继承了Father类,构成子父类关系
2.在另一个类的main方法中实例化了Son子类,又由于子类继承的Father类,所以Son类包含Father类所有的非私有方法(私有方法子类不可显示调用,可通过反射去调用)
图一:通过debug看到Father类中,hit方法中的this就是Son的实例