2013-11-25 1 views
2

У меня есть следующий код, как я понимаю, он должен вернуть выход как TRUE & FALSE, но, к сожалению, когда я запустить эту программу ее возвращение выхода Ike False & False выхода. Зачем?Что такое конструктор, используя объекты в качестве параметра?

Пожалуйста, помогите мне, объяснив значение этой программы.

//How to pass objects as parameter in constructor 
package learn.basic.corejava; 

public class Test { 

    int a,b; 

    public Test(int i,int j) { 
     a=i; 
     b=j; 
    } 

    boolean check(Test tobj) 
    { 
     if(tobj.a == a && tobj.b == b) 
     { 
      return true; 
     } 
     else 
     { 
      return false; 
     } 
    } 

    public static void main(String[] args) { 
     Test obj1=new Test(100, 22); 
     Test obj2=new Test(100, 22); 
     Test obj3=new Test(-1, -1); 

     System.out.println(obj1.equals(obj2)); 
     System.out.println(obj1.equals(obj3)); 
    } 

} 

Почему я думаю, что «он должен вернуть True & False

  • Поскольку значение obj1 устанавливаются в конструкторе & аналогично значения obj2 также установлен в конструкторе, так как в первом сравнение они оба одинаковы, поэтому я думаю, что он должен вернуть true для сравнения obj1.equals(obj2)
+0

Почему, по вашему мнению, он должен возвращать False и True? –

+3

Это должно быть 'System.out.println (obj1.check (obj2));' Вы did'nt переопределили equals, но создали новый метод под названием check. –

+1

Почему вы ожидаете 'obj1.equals (obj2)' вызывать метод 'check (Test)'? –

ответ

3

Чтобы проверить, идентичны ли два объекта (то есть: являются ли они одним и тем же), используйте ==, а не equals(). При входе образца в вопросе это печать будет true и false, предполагая что вы осуществивших equals():

System.out.println(obj1.equals(obj2)); // true 
System.out.println(obj1 == obj2);  // false 

Или, возможно, более интересно:

Test obj1 = new Test(100, 22); 
Test obj2 = new Test(100, 22); 
Test obj3 = obj2; 

System.out.println(obj1.equals(obj2)); // true 
System.out.println(obj1 == obj2);  // false 
System.out.println(obj2 == obj3);  // true 
System.out.println(obj1.equals(obj3)); // true 

Теперь вернемся к вашему вопросу. Проблема заключается в том, что вы неправильно выполнили equals(), который проверяет значение между объектами, и это то, что вас интересует. Для кода в вопросе правильная реализация equals() будет выглядеть так: :

@Override 
public boolean equals(Object obj) { 
    if (this == obj) // are the objects identical? 
     return true; 
    if (obj == null) // is the other object null? 
     return false; 
    if (getClass() != obj.getClass()) // do the objects have the same class? 
     return false; 
    Test other = (Test) obj; // cast other object 
    if (a != other.a) // is the `a` field equal in both objects? 
     return false; 
    if (b != other.b) // is the `b` field equal in both objects? 
     return false; 
    return true;  // ok, the objects are equal :) 
} 
+0

'==' проверяет, что два объекта являются одним и тем же объектом. Боюсь, что слово «идентичное» очень вводит в заблуждение. – Nikolay

+0

@Nikolay Правильный технический термин: '==' тесты для ссылки _identity_. Так что да, правильно сказать, что '==' проверяет, являются ли два bjects _identical_ –

+0

@SotiriosDelimanolis, что вы есть. Я добавил реализацию в свой ответ, спасибо! –

1

Хорошо, сначала сначала вы вызываете равные функции, а не функцию проверки. Поэтому вы можете это изменить. Или вы можете изменить проверку на равные и переопределить объект равным.

public static void main(String[] args) { 
     Test obj1=new Test(100, 22); 
     Test obj2=new Test(100, 22); 
     Test obj3=new Test(-1, -1); 

     System.out.println(obj1.check(obj2)); 
     System.out.println(obj1.check(obj3)); 
    } 
0

Вы должны переопределить метод Equals не метод проверки ... метод проверки не существует на классе Object

http://docs.oracle.com/javase/7/docs/api/java/lang/Object.html

обратите внимание: если вы переопределить равно спецификации Java требует для переопределения метода hashCode.

В качестве альтернативы вы можете использовать свою собственную проверку.

Смежные вопросы