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.f1(String)中B“this”的上下文是B的实例。 我是否可以选择链新的B1()。f1(String) - > (A)f1(String) - > (A)f1(int,String)?
这是一个理论问题,实际上解决方案显然是在A中实现f1(String)和f1(int,String)都会调用的私有函数。
谢谢你,
格言。
答案 0 :(得分:32)
不幸的是,没有
我确信您已经知道,但我会明确说明完整性 - 只有2个关键字来控制方法调用:
this.method()
- 查找从调用实例的类开始的方法(实例的“顶部”虚拟表 - 隐含默认值)super.method()
- 从定义了调用方法的类的父类开始查找方法(调用类'parent的虚拟表 - not strictly true ,但想到这种方式更简单 - 感谢@maaartinus)我可以想象另一个关键字(例如当前?)做你所描述的:
current.method()
- 查找从定义调用方法的类开始的方法但是Java没有这样的关键字(但是?)。
答案 1 :(得分:17)
我担心,这是不可能的,但有一个简单的解决方法:
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);
}
}
答案 2 :(得分:5)
Java中的重写方法是动态绑定的。即,对象的实际实例的类型决定了将要调用的内容。 final
方法(不能被覆盖)和private
方法(不能被继承)是静态绑定的。
在C ++中,相比之下,您必须明确地使函数virtual
获得相同的行为。
答案 3 :(得分:-1)
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");
}
}