父类和子类之间方法调用的问题
2020-12-25 本文已影响0人
从零开始的程序猿生活
Father类
class Father {
void fun1() throws Exception {
System.out.println("父类fun1方法");
fun3();
}
void fun2() throws Exception {
System.out.println("父类fun2方法");
}
void fun3(){
System.out.println("父类fun3方法");
}
}
Son类
class Son extends Father{
@Override
void fun2() throws Exception {
System.out.println("子类fun2方法");
fun1();
}
@Override
void fun3(){
System.out.println("子类fun3方法");
}
void fun4(){
System.out.println("子类fun4方法");
}
}
测试类
public static void main(String[] args) throws Exception {
Father b = new Son();
b.fun2();
b.fun4();// 编译会报错
}
问题1:编译为什么报错?
原因:引用一句话编译看左边,运行看右边,编译的时候看Father ,Father 类中没有fun4()方法,所以会报错。
问题2:在调用Son类中的fun2()方法时,执行父类的fun1()方法中的fun3()方法是调用的子类重写的方法还是父类的方法呢?
运行的时候看右边也就是Son类,
当执行fun2()方法时,
1、进入的Son执行fun2()方法
2、内部调用父类的fun1()方法
3、进入父类的fun1()方法,这是的this是Son实例,直接调用fun3()方法会调用Son类中的fun3()方法。
// 代码执行结果
子类fun2方法
父类fun1方法
子类fun3方法
问题3:如果我就想在Father类的fun1()方法中调用父类本身的fun3()方法要怎么调用呢?
因为当前的this实例对象时Son对象,super是Object对象,所以只能使用反射来实现。
改下父类的fun1()方法
void fun1() throws Exception {
System.out.println("父类fun1方法");
fun3();
Method fun3 = this.getClass().getSuperclass().getDeclaredMethod("fun3");
fun3.invoke(this.getClass().getSuperclass().newInstance());
}
利用反射获取父类的fun3方法,然后执行。
// 代码执行结果
子类fun2方法
父类fun1方法
子类fun3方法
父类fun3方法
getMethod()返回某个类的所有公用(public)方法包括其继承类的公用方法,当然也包括它所实现接口的方法
getDeclaredMethod()对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。当然也包括它所实现接口的方法