美文网首页
父类和子类之间方法调用的问题

父类和子类之间方法调用的问题

作者: 从零开始的程序猿生活 | 来源:发表于2020-12-25 10:18 被阅读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()对象表示的类或接口声明的所有方法,包括公共、保护、默认(包)访问和私有方法,但不包括继承的方法。当然也包括它所实现接口的方法

相关文章

  • super

    1.super 存在于父类和子类之间的继承 ,当子类调用构造方法的时候 在类的构造方法默认调用父类的构造方法。在构...

  • 父类和子类之间方法调用的问题

    Father类 Son类 测试类 问题1:编译为什么报错? 原因:引用一句话编译看左边,运行看右边,编译的时候看F...

  • 调用被子类重写的方法

    在一般情况一下,子类可以调用父类的方法,因为子类继承父类,会获得父类的成员变量和方法,但父类不可以调用子类的方法,...

  • Java之动态绑定与静态绑定

    1、当子类和父类存在同一个方法,子类重写了父类的方法,程序在运行时调用方法是调用父类的方法还是子类的重写方法呢?2...

  • python 面向对象: super()

    python 关于 super 的使用 子类对象调用父类方法 :super(B,b).hh() 子类中调用父类方法...

  • 86-OOP之子类调用父类方法

    如果子类和父类具有同名的方法,那么父类方法将被遮盖住。可以在子类中明确指明调用的是父类方法,而不是子类的同名方法。

  • iOS 小知识点总结

    子类实现父类方法时,监测子类是否调用super方法。 在父类中声明方法时: 子类中实现该父类方法: 图片压缩

  • 多态

    向上转型,隐式转换,自动转型 父类引用指向子类,可以调用子类重写父类方法,及父类派生的方法,但无法调用子类特有的方...

  • java相关

    1、Java向上转型之后调用子类的同名变量/方法的问题 总结:方法可重写,属性不可重写。父类的方法被子类覆盖,父类...

  • 向上转型&向下转型

    向上转型也称为隐式转型或者自动转型父类引用指向子类实例,可以调用子类重写父类的方法以及父类派生的方法,无法调用子类...

网友评论

      本文标题:父类和子类之间方法调用的问题

      本文链接:https://www.haomeiwen.com/subject/nfsbnktx.html