界面和课程

时间:2017-05-14 05:56:28

标签: java

在我的代码中,我看到了接口的即时性和实现它的类的瞬间之间的区别,为什么? 我有返回类对象数组的方法,并实现了一个声明这个方法的接口,当创建类的瞬间并调用此方法时,如果它是由接口即时调用的,返回的值是不同的,尽管它应该做同样的工作,返回价值不同,为什么??

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,但为什么返回的值不同,如果可能的话我怎样才能获得相同的返回值?

2 个答案:

答案 0 :(得分:3)

代码的行为与obj1B)与obj2A)的编译时类型无关。

您的比较返回false的原因:

  1. 对于两个不同的数组,比较数组总是会返回false,因为数组不会覆盖Object的{​​{1}}方法。

  2. 比较两个数组的第一个元素也会返回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

实现的方法

它被称为多态性。

正如伊兰所回答的那样,纠正你的代码会给出正确的答案