Java 接口和类的即时性

Java 接口和类的即时性,java,Java,在我的代码中,我看到了接口的瞬间和实现它的类的瞬间之间的区别,为什么?? 我有一个方法,它返回类的对象数组,并实现一个接口来声明这个方法,当创建类的instant并调用这个方法时,如果接口instant调用它,返回的值是不同的。虽然它应该做相同的工作,但返回的值是不同的,为什么 public interface A{ public B[] m(); } public class B implements A { public B[] m() { B b[]=n

在我的代码中,我看到了接口的瞬间和实现它的类的瞬间之间的区别,为什么?? 我有一个方法,它返回类的对象数组,并实现一个接口来声明这个方法,当创建类的instant并调用这个方法时,如果接口instant调用它,返回的值是不同的。虽然它应该做相同的工作,但返回的值是不同的,为什么

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,因为数组不重写
    对象的
    等于方法

  • 比较两个数组的第一个元素也会返回false,因为
    B
    类不会重写
    equals
    方法,所以
    obj1.m()[0]。equals(obj2.m()[0])
    是false,因为
    obj1.m()[0]!=obj2.m()[0]
    。只有当
    B
    类具有可能返回true的
    公共布尔等于(Object other)
    实现时,它才能返回true


  • 您正在比较对象,除非重写equals方法,否则这些对象永远不会相同。 你应该比较一下内容。 在您的情况下,声明对象之间没有区别

    案例1:B obj1=新B()

    案例2:A onj2=新的B()

    在案例1中,您直接分配给对象B,因此您有资格调用特定于B的方法以及来自A的实现方法

    在案例2中,您只能调用从接口A实现的方法

    这叫做多态性


    更正代码将给出正确的答案,正如Eran所回答的那样

    感谢您的回答感谢您的回答,因此您的意思是obj1.m()与obj1.m()和obj1.m()[0]与obj2m()[0]通常相等,当存在相等的方法时,实现应返回true而不是false!类B应该有equals方法来比较对象,当您说obj1.m().equals(obj2.m)时,应该有某种方法来比较m()返回的对象(B)。另一方面,它将只返回两个对象不能相同的引用。对于obj1.m()[0]和obj2m()[0],您需要实现equals方法