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

2022-09-01 03:08:49
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");
    }
}

我正在寻求此代码将输出:

B.f1(String)
A.f1(String)
A.f1(int, String)

然而,我得到:

B.f1(String)
A.f1(String)
B.f1(int, String)
A.f1(int, String)

我理解在B的上下文中,A.f1(字符串)中的“this”是B的实例。我有没有选择做链新的B1().f1(字符串) ->(A的) f1(字符串) ->(A的) f1(int,字符串)?

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

谢谢你,
马克西姆。


答案 1

很遗憾,没有

我相信您知道,但是为了完整性,我将明确声明 - 只有2个关键字来控制方法调用:

  • this - - 查找从调用实例的类开始的方法(实例的“top”虚拟表 - 隐含默认值)this.method()
  • super - - 查找从定义调用方法的类的父类开始的方法(调用类的父级虚拟表 - 不是严格正确的,但以这种方式思考更简单 - 感谢@maaartinus)super.method()

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

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

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


答案 2

恐怕这是不可能的,但有一个简单的解决方法:

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);
    }
}