gpt4 book ai didi

java - 如何访问基类方法?

转载 作者:行者123 更新时间:2023-12-03 12:29:47 25 4
gpt4 key购买 nike

简化的演示代码来展示我的问题。

class Base {
public String toString() { return "Base"; }
};
class A extends Base {
public String toString() { return "A"; }
};

class Test {
public void test1() {
A a = new A();
Base b = (Base)a; // cast is fine, but b is the same instance as a
System.out.println(b.toString()); // want "Base", but get "A"
}

private String testB(Base b) {
return b.toString(); // this should return "Base"
}
public void test2() {
System.out.println( testB(new A()) ); // want "Base", but get "A"
}

};

我尝试了转换方法 (test1) 和辅助方法 (test2)。

到现在为止,我发现需要一个Base的拷贝构造函数来创建一个真正的Base对象。

有没有不需要重复对象的方法?


一些背景信息:

我得到了 A 的一个实例,我知道它的基类有一个很好的方法,我想使用它而不是覆盖的版本。我宁愿既不修改 A 类也不修改 B 类(尽管副本 c'tor 无论如何都是一个很好的增强;))

最佳答案

来自类(class)A直接,你可以使用super.toString();执行 toString()Base .

然而,来自课外A ,您不能以这种方式调用父类(super class)实现,这样做会破坏封装。如果你想公开父类(super class)实现,你仍然可以,但你必须在 A 上提供一个单独的方法。直接暴露它。

即使使用基于反射的简单方法,you still won't be able to access it:

If the underlying method is an instance method, it is invoked using dynamic method lookup

System.out.println(Base.class.getMethod("toString", null).invoke(new A(), null)); //Prints "A"

...并使用 MethodHandles.lookup().findSpecial也不会从子类外部工作,因为必须在您有私有(private)访问权限的地方调用它(否则您只会得到一个 IllegalAccessException 。)

我承认可能有 一些 直接在 Java 中执行此操作的奇怪而美妙的方式,我没有想到没有字节码操作,但足以说明即使您可以 那样做,您当然不应该除了古怪的技术演示之外的任何事情。

关于java - 如何访问基类方法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50137077/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com