繁体   English   中英

从基类方法调用基类覆盖的函数

[英]Calling base class overridden function from base class method

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)

我知道在 A.f1(String) 中 B "this" 的上下文中是 B 的实例。 我可以选择执行链 new B1().f1(String) -> (A's) f1(String) -> (A's) f1(int, String) 吗?

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

谢谢,
格言。

抱歉不行

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

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

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

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

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

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

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

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

相比之下,在 C++ 中,您必须显式地使函数成为virtual函数才能获得相同的行为。

package main;

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

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

}

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 static void main(String[] args) {
A a = new B();
    a.f1("Hello");
}
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM