在我的代码中,我已经看到接口的瞬间和实现它的类的瞬间之间的区别,为什么?
我有返回类的对象数组并实现一个接口的方法,该方法声明了此方法,当创建类的即时实例并调用此方法时,如果接口即时调用了返回值,则返回的值是不同的,尽管它应该执行相同的工作,但是返回价值不同,为什么?
public interface A{
public B[] m();
}
public class B implements A {
public B[] m() {
B b[]=new B[10];
for(int i=0; i>10; i++)
b[i]=new B();
return b;
}
}
在这一部分中,当我尝试为类创建两个即时实例,为接口创建另一个即时实例,然后为每个实例调用方法时,如下所示:
B obj1=new B();
A obj2=new B();
System.out.println(obj1.m().equals(obj2.m));
System.out.println( obj1.m()[0].equals(obj2.m()[0]) );
........
这返回假。
也许很清楚
obj1
不是obj2
,但是为什么返回值不同?如果可能,如何获得相同的返回值? 最佳答案
代码的行为与obj1
(B
)与obj2
(A
)的编译时类型无关。
比较返回false
的原因:
比较数组将始终为两个不同的数组返回false,因为数组不会覆盖Object
的equals
方法。
比较这两个数组的第一个元素还会返回false,因为您的B
类没有覆盖equals
方法,因此自obj1.m()[0].equals(obj2.m()[0])
以来,obj1.m()[0] != obj2.m()[0]
为false。如果您的B
类将具有可能返回true的public boolean equals (Object other)
实现,则它只能返回true。