gpt4 book ai didi

Java:当对象被声明为基类时访问派生类的成员

转载 作者:行者123 更新时间:2023-11-29 03:33:13 26 4
gpt4 key购买 nike

我有一个名为 ScalarObject 的类和一个继承自 ScalarObject 的名为 Variable 的类。我在始终返回 false 的 ScalarObject 上定义了“equals”,在表示它们的字符串相等时返回 true 的 Variable 上定义了“equals”。

以下代码:

ScalarObject a1 = new Variable("a");
ScalarObject a2 = new Variable("a");
System.out.println(a1.equals(a2));

返回错误。以下代码:

Variable a1 = new Variable("a");
Variable a2 = new Variable("a");
System.out.println(a1.equals(a2));

返回真值。以下代码:

ScalarObject a1 = new Variable("a");
ScalarObject a2 = new Variable("a");
System.out.println(((Variable) a1).equals(((Variable) a2)));

也返回 true。问题是我还有其他类也派生自 ScalarObject。我的部分程序对象声明为 ScalarObject 类型,但可以是从它派生的任何类的成员,因此将 ScalarObject 对象转换为派生类型是行不通的。例如,在我的程序的一部分中,我有:

protected void neighbor_simplify(LinkedList<ScalarObject> L, char op) {
...
if(n1 instanceof Variable && n2 instanceof Variable) {
System.out.println(((Variable) n1).getSymbol());
System.out.println(((Variable) n2).getSymbol());
}
if(n1.equals(n2)) { // x+x=2*x
System.out.println("B ");

程序打印了两次“x”但没有打印“B”。变量n1和n2来自链表“L”。我怀疑该程序正在调用“ScalarObject.equals()”(它总是返回 false)而不是“Variable.equals()”。将 n1 和 n2 转换为 Variable 类型的问题是 n1 和 n2 可能是其他一些类的实例,这些类也派生自 ScalarObject。如何让程序从派生类而不是基类调用成员,即使它被声明为基类?

我在 Windows Vista 上使用 NetBeans 6.9.1。

在网络上搜索已将我带到 http://wiki.answers.com/Q/Can_a_base_class_access_members_of_a_derived_class它指出在 Java 中,当使用 @Override 符号时,基类可以访问派生类的成员。但是,当我将 @Override 添加到 Variable.equals() 时,我收到一条错误消息,指出该方法没有覆盖父类(super class)型的方法,这可能是因为符号不同。 ScalarObject.equals() 采用 ScalarObject 类型的参数,Variable.equals() 采用 Variable 类型的参数。

最佳答案

equals 方法必须在所有类中定义为public Object equals(Object obj) 以便它们正确重写(提示,听 @Override注解编译错误)。

关于Java:当对象被声明为基类时访问派生类的成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16925805/

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