2013-07-21 2 views
1

ИТАК, так скажем, у вас есть два класса: ClassA и ClassBПереопределение класса Object равный метод

  • ClassA расширяет Object и ClassB расширяет ClassA
  • ClassA не имеет конструктора аргумент
  • ClassB имеет целочисленная переменная x и конструктор с целым аргументом, который инициализирует x
  • ClassA не отменяет equals, что это из Object принадлежности
  • ClassB переопределениях equals так, что два объекта ClassB считаются равными, если целое число х имеет одинаковое значение в обоих объектов.

    //In Class B you have this method: 
        public boolean equals (Object obj) { 
         if (obj == null) { 
          return false; 
         } 
         if (obj.getClass() != this.getClass()) { 
          return false; 
         } 
         if (!super.equals(obj)) { 
          return false; 
         } 
    
         B b = (B) obj; 
    
         return this.x == b.x; 
        } 
    

В основном, если вы запустите этот код

B b1 = new B(1); 
    B b2 = new B(1); 
    System.out.println(b1.equals(b2)); 

Я считаю, «ложным» будет напечатано, но я пытаюсь понять, почему. Возможно, я не полностью понимаю концепцию переопределения, но я просто понял, что с B следует переопределить метод Object.equals, чтобы он мог убедиться, что поля x одинаковы.

Что кажется «неправильным», что мне не хватает?

+2

В чем смысл переопределения 'equals', если вы возвращаете значение, возвращаемое' super.equals() '? –

+0

1) Используйте последовательный и логический отступ для кодовых блоков. Отступ кода предназначен для того, чтобы помочь людям понять поток программы. 2) Чтобы получить более эффективную помощь, опубликуйте [SSCCE] (http://sscce.org/). –

ответ

6

Вы должны опустить

if (!super.equals(obj)) 
{ 
return false; 
} 

, потому что будет использовать метод() (который проверяет идентичность объекта) равен по умолчанию

2

Ваш код никогда не будет пройти в super.equals проверить, потому что (поскольку Object.equals сравнивает ссылки на объекты), любые два разных объекта всегда будут проверять false для равенства. Object.equals сравнивает ссылки, единственный раз, когда он возвращает true, если он сравнивает ссылку на себя.

Обычно, если вы переопределяете равные значения, это потому, что вы хотите сравнить объекты по значению (например, String или BigInteger), поэтому нет причин ссылаться на метод equals суперкласса (который сравнивается по ссылке) в этом случае.

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