在我的代码中,我看到了接口的即时性和实现它的类的瞬间之间的区别,为什么? 我有返回类对象数组的方法,并实现了一个声明这个方法的接口,当创建类的瞬间并调用此方法时,如果它是由接口即时调用的,返回的值是不同的,尽管它应该做同样的工作,返回价值不同,为什么??
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]) );
........
返回false。
也许很明显obj1
不是obj2
,但为什么返回的值不同,如果可能的话我怎样才能获得相同的返回值?
答案 0 :(得分:3)
代码的行为与obj1
(B
)与obj2
(A
)的编译时类型无关。
您的比较返回false
的原因:
对于两个不同的数组,比较数组总是会返回false,因为数组不会覆盖Object
的{{1}}方法。
比较两个数组的第一个元素也会返回false,因为equals
类没有覆盖B
方法,所以equals
为false,因为{ {1}}。如果您的obj1.m()[0].equals(obj2.m()[0])
类的实现obj1.m()[0] != obj2.m()[0]
可能会返回true,则它只能返回true。
答案 1 :(得分:0)
您正在比较永远不会相同的对象,除非您覆盖equals方法。 你应该比较内容。 在您的情况下,声明对象之间没有区别
案例1:B obj1 =新B();
案例2:onj2 = new B();
在case1中,您直接分配给对象B,因此您有资格调用特定于B的方法以及A中实现的方法。
在Case2中,您只能调用从接口A
实现的方法它被称为多态性。
正如伊兰所回答的那样,纠正你的代码会给出正确的答案