Что из следующего является правильным относительно метода equals () в java? - PullRequest
0 голосов
/ 29 мая 2020

Это вопрос одного из моих практических экзаменов, который меня озадачил.

Возможные ответы

  1. Написан метод equals () в классе с именем C должен иметь параметр, объявленный как C, чтобы переопределить метод equals () в классе Object.

  2. Equals () должен иметь параметр, объявленный как объект типа, чтобы переопределить метод equals () в классе Object.

  3. Метод equals (), записанный в класс с именем C должен привести свой параметр к Object, даже если его параметр объявлен как имеющий тип C, в противном случае он не сможет должным образом сравнить поля текущего объекта с полями объекта параметра.

  4. Хорошо спроектированный метод equals () должен проверять и обрабатывать случай, когда его текущий объект может быть нулевым.

  5. Метод equals () в подкласс не может напрямую ссылаться на закрытые поля в суперклассе ss, чтобы сравнить их, поэтому он должен вызвать метод суперкласса equals () для этого

Ответ # 2 и # 5. Я не понимаю, почему №1 неправильный, а №2 правильный. Не надо ли сравнивать один тип C с другим типом C? И почему №5 правильный. Я этого совсем не понимаю. Не могут подклассы получить доступ к закрытым полям суперкласса?

Ответы [ 3 ]

1 голос
/ 29 мая 2020

Если это ваш практический экзамен: материалы вашего курса не охватывают это?

Что касается № 1: сигнатура метода: publi c boolean equals (Object obj) , так что это то, что вам нужно переопределить. Любая другая подпись, и это не замена, это «совершенно другой метод».

Что касается # 5: Вот что означает приватный . Поля являются частными для этого класса и только для этого класса . Если подкласс должен иметь к ним доступ, то они должны быть защищены, а не частными.

1 голос
/ 29 мая 2020

Я не понимаю, почему # 1 неверно

Потому что:

  1. Object::equals определяется как public boolean equals(Object), и

  2. public boolean equals(SomeType) не отменяет public boolean equals(Object). На самом деле это перегрузка, а не переопределение. Это разные операции.


Не могут подклассы получить доступ к закрытым полям суперкласса?

В общем, нет. Проверьте свои записи лекций.

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


Технически ответ № 5 верен только наполовину.

  • Это правильно, что подкласс не может получить доступ к закрытым полям в суперклассе, если мы остаемся в пределах чистого Java. Правила доступа Java запрещают это. (Но см. Выше.)

  • Верно, что вызов super.equals(other) может быть решением. И действительно, обычно это правильное решение.

  • Неверно предполагать, что вызов super.equals(other) - единственное решение.

Другие возможные решения могут включать:

  • игнорирование полей суперкласса при проверке равенства,
  • доступ к закрытые поля суперкласса с использованием publi c геттеров ... если они существуют, или
  • доступа к закрытым полям с помощью отражения, нарушающего абстракцию.

Из альтернатив первый один редко применяется, а третий - действительно плохая идея. Но эти альтернативы означают, что ответ № 5 (как написано) технически неверен.

0 голосов
/ 29 мая 2020

Рассмотрим следующий метод равенства для класса C.

 @Override
    public boolean equals(Object o) {
        if (this == o) return true;
        if (o == null || getClass() != o.getClass()) return false;
        C c= (C) o;
        return id == c.id;
    }

Объяснение для вариантов 1 и 5:

  1. Если вы объявляете параметр типа C, то это не будет overriding.

    Ошибка:

Метод не переопределяет метод из своего суперкласса

Указывает что объявление метода предназначено для переопределения объявления метода в супертипе. Если метод аннотирован этим типом аннотации, компиляторы должны генерировать сообщение об ошибке, если не выполняется хотя бы одно из следующих условий: Метод переопределяет или реализует метод, объявленный в супертипе. Этот метод имеет сигнатуру, эквивалентную замене сигнатуры любого метода publi c, объявленного в Object.

суперкласс не может получить доступ к закрытым полям класса, поэтому им необходимо вызвать метод суперкласса equals для их сравнения.
...