当调用继承的方法(Java)时,子类会使用超类方法还是子类方法

当调用继承的方法(Java)时,子类会使用超类方法还是子类方法,java,inheritance,Java,Inheritance,如果我在一个超类中有两个方法,分别称为a()和b(),b()调用a(),我有一个子类重写a(),那么,如果我在子类的实例上调用b(),它会在超类中使用a()的变体还是在子类中使用a()的变体 提前感谢您的回答:我在搜索中没有找到任何东西,因为这个问题很难用搜索词来表达。它将调用子类中的问题。你可以设计一个实验来测试自己: class Super { void a() { System.out.println("super implementation"); } void b()

如果我在一个超类中有两个方法,分别称为a()和b(),b()调用a(),我有一个子类重写a(),那么,如果我在子类的实例上调用b(),它会在超类中使用a()的变体还是在子类中使用a()的变体


提前感谢您的回答:我在搜索中没有找到任何东西,因为这个问题很难用搜索词来表达。

它将调用子类中的问题。你可以设计一个实验来测试自己:

class Super {
    void a() { System.out.println("super implementation"); }
    void b() { System.out.println("calling a()..."); a(); }
}


class Sub extends Super {
    void a() { System.out.println("sub implementation"); }
}


public class Main {
    public static void main(String[] args) {
        Sub x = new Sub();
        x.b();
        // Prints:
        //   calling a()...
        //   sub implementation
    }
}

它将调用子类中的一个。你可以设计一个实验来测试自己:

class Super {
    void a() { System.out.println("super implementation"); }
    void b() { System.out.println("calling a()..."); a(); }
}


class Sub extends Super {
    void a() { System.out.println("sub implementation"); }
}


public class Main {
    public static void main(String[] args) {
        Sub x = new Sub();
        x.b();
        // Prints:
        //   calling a()...
        //   sub implementation
    }
}

值得一提的是:这是由于
a()
隐式地成为
this.a()
,而
this
始终是调用对象。调用对象是类<代码>子< /C>,因此它总是会开始寻找方法调用。额外的困惑的边注释:在C++(不是java!)中,省略<代码>虚拟< /Cord>关键字意味着超类仍然会调用它自己的代码>())/Cux>方法。在C++构造函数中,所有的方法都被视为非虚拟的,不像java。值得注意的是:这是由于<代码>())/>代码隐式地变成了<代码>。调用对象是类<代码>子< /C>,因此它总是会开始寻找方法调用。额外的困惑的边注释:在C++(不是java!)中,省略<代码>虚拟< /Cord>关键字意味着超类仍然会调用它自己的代码>())/Cux>方法。在C++构造函数中,所有方法都被视为非虚拟的,不像java。