首页 > 编程知识 正文

构造函数可以继承吗,无法将方法组转换为非委托类型

时间:2023-05-05 19:24:45 阅读:163220 作者:4726

我有一个叫ScalarObject的班和一个叫Variable的班。 该类从ScalarObject继承。 我在总是返回false的ScalarObject中定义了“等于”,在表示它们的字符串相等时在Variable中定义了“等于”。

以下代码:

salarobjectA1=newvariable(a );

salarobjectA2=newvariable(a );

system.out.println(A1.equals ) A2 );

返回假。 以下代码:

variablea1=newvariable('a );

variableA2=newvariable('a );

system.out.println(A1.equals ) A2 );

返回true。 以下代码:

salarobjectA1=newvariable(a );

salarobjectA2=newvariable(a );

system.out.println () ) (variable (a1 ).equals ) ) ) variable (a2 ) );

也返回true。 问题是还有其他从ScalarObject派生的类。 虽然我的一些程序对象被声明为ScalarObject类型,但是强制将ScalarObject对象转换为派生类型不起作用,因为它可以是派生类的成员。 例如,在程序的一部分中,我有以下内容。

protectedvoidneighbor _ simplify {

.

n1 instanceofvariablen2instance of variable (if ) {

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 () ),而不是' 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。 虽然在JavaBers中指出了此声明,但是在将@Override添加到Variable.equals () ()中时,出现了siguatures不同的错误消息。 ScalarObject.equals ()接受ScalarObject类型的参数,Variable.equals ()接受Variable类型的参数。

问题是所有equals方法的签名必须相同。 假设你正确定义了它们。

我觉得你错了。 如果. methodName左侧的对象的类是DerivedClass,则假设签名匹配,将调用DerivedClass的methodName版本。 引用变量的声明类对此没有影响。

感性的茉莉花(Joshua Bloch )说,继承的主要问题之一是“不可以在不破坏平等合同的情况下向继承的类中添加价值成分”。 我认为equals(objecto )主要是用来让面向对象的程序员的生活更痛苦。

所有类都必须将equals方法定义为publicobjectequals(objectobj ),以确保正确覆盖(请询问@Override注释的编译错误提示)。

请充分注意盖子和过载的区别。

如果基类和派生类的equals方法的签名匹配(在这种情况下,请参见jtahlborn的回答),则已经涵盖了它。 它使用动态绑定。 为了在运行时确定正确的equals方法

salarobjectA1=newvariable(a );

a1.equals(…);

调用Variable的等价项,因为a1的类型在运行时确定为Variable。

如果equals方法的签名不匹配(equals(Scalarobjectso )和equals (variable v ) ),则表示存在重载。 它使用静态绑定。 也就是说,即使你这么做

variablea1=newvariable('a );

salarobjectA2=newvariable(a );

a1.equals(a2 );

最后一行使用scalar object.equals (scalarobjectso )。 因为编译器无法推断a2的类型为Variable。

简言之,即使使用publicbooleanequals(objecto ),也总是为您的equals方法使用覆盖。

此操作更改变量的签名并接受ScalarObject,将ScalarObject.equals重写为Variable的equals方法,然后使用instanceof运算符根据传递的对象的实际类型执行操作

不,不要在equals方法中使用标量对象。

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。