从基类方法调用基类重写函数

Max*_*ler 36 java theory oop overloading

public class A {
    public void f1(String str) {
        System.out.println("A.f1(String)");
        this.f1(1, str);
    }

    public void f1(int i, String str) {
        System.out.println("A.f1(int, String)");
    }
}



public class B extends A {
    @Override
    public void f1(String str) {
        System.out.println("B.f1(String)");
        super.f1(str);
    }

    @Override
    public void f1(int i, String str) {
        System.out.println("B.f1(int, String)");
        super.f1(i, str);
    }
}


public class Main {
    public static void main(String[] args) {
        B b = new B();
        b.f1("Hello");
    }
}
Run Code Online (Sandbox Code Playgroud)

我正在寻求这段代码输出:

B.f1(String)
A.f1(String)
A.f1(int, String)
Run Code Online (Sandbox Code Playgroud)

但我得到了:

B.f1(String)
A.f1(String)
B.f1(int, String)
A.f1(int, String)
Run Code Online (Sandbox Code Playgroud)

据我所知,在A.f1(String)中B"this"的上下文是B的实例.我可以选择执行新的B1().f1(String) - >(A)f1(String) - >(A)f1(int,String)?

这是一个理论问题,实际上解决方案显然是在A中实现f1(String)和f1(int,String)都会调用的私有函数.

谢谢你,
马克西姆.

Ber*_*t F 33

很不幸的是,不行

我确信你知道,但我会明确说明完整性 - 只有2个关键字来控制方法调用:

  • - this.method()- 查找从调用实例的类开始的方法(实例的"顶部"虚拟表 - 隐含默认值)
  • super - super.method()查找从定义了调用方法的类的父类开始的方法(调用类'parent的虚拟表 - 不是严格正确,但更容易想到这种方式 - 感谢@maaartinus)

我可以想象另一个关键字(例如当前?)做你所描述的:

  • current - current.method()- 查找从定义调用方法的类开始的方法

但Java没有这样的关键字(但是?).


maa*_*nus 19

我担心,这是不可能的,但有一个简单的解决方法:

public class A {
    public void f1(String str) {
        System.out.println("A.f1(String)");
        privateF1(1, str);
    }

    private void privateF1(int i, String str) {
        System.out.println("A.f1(int, String)");
    }

    public void f1(int i, String str) {
        privateF1(i, str);
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 用`this`前缀方法调用总是多余的. (4认同)

Bri*_*new 6

Java中的重写方法是动态绑定的.即,对象的实际实例的类型决定了将要调用的内容.final方法(不能被覆盖)和private方法(不能被继承)是静态绑定的.

相比之下,在C++中,您必须明确地使函数virtual获得相同的行为.