В java, когда дело доходит до объектов, использование ==
означает проверку адресного значения объекта. Позвольте мне объяснить это на примере:
Rectangle objA = new Rectangle(3,5);
Rectangle objB = objA;
objA
Здесь создается на месте памяти A и objB
указывает на ячейку памяти или где objA
был создан. Это означает, что оба места памяти одинаковы, а это означает, что objA == objB
вернет true.
Но в другом случае:
Rectangle objC = new Rectangle(3,5);
Rectangle objD = new Rectangle(3,5);
Вы могли бы сказать, о они оба имеют одинаковую ширину и высоту же, они должны быть одни и те же объекты. Но посмотрите, это не так, потому что objC
был создан на память. C и objD
был создан в памяти D, поскольку каждый из них был создан с помощью отдельного вызова new
(конструктор). Места памяти в этом случае различны, это означает, что objC == objD
вернет false.
Память не названа так, я просто использовал это, чтобы легче описать мои примеры.
Вы думали правильно, когда вы хотите использовать .equals
метод, это то, что Java используется для сравнения двух объектов глубже, чем просто их адрес. Но в пользовательских классах пользователь должен определить, как работает этот метод, когда два объекта равны, а когда нет.
Но ваша реализация .equals
немного ошибочна.
Эта строка проверяет, указывает ли объект other
на место памяти this
.
if (other == this) return true;
Но позже, у вас есть эти 2 строки:
Shape shape = (Shape)other;
return(other==this);
Вы ничего не делать с объектом формы, так почему бы даже создать его, это просто делает больше работы для сборщика мусора.И return other==this
немного избыточно, потому что если предыдущая строка возвращает true, то только здесь можно возвращать false, поэтому эта проверка является только более сложной версией return false
.
Когда вы используете абстрактные классы, которые затем продолженные другими производными классами, вы должны реализовать .equals
метод в каждом из этих классов. Пример из вашего случая, вы, вероятно, захотите сравнить два прямоугольника иначе, чем два круга, не так ли?
Вместо того, чтобы использовать один общий метод .equals
, который, честно говоря, не лучше, чем просто оператор ==
, вы должны реализовать его для каждого из производных классов.
Я не знаю, как именно ваш Rectangle
класс выглядит, но я дам ему попробовать:
public boolean equals(Object other) {
if (other == this) return true;
if (other == null) return false;
if (getClass() != other.getClass()) return false;
Rectangle rect = (Rectangle) other;
// compare measures of this and other Rectangle
return width == rect.width && height == rect.height;
}
Что вы думаете 'другие == this' делает? –
И что вы думаете, 'myRect == myRect2' делает? –
Возможно, вы захотите проверить http://www.ideyatech.com/2011/04/effective-java-equals-and-hashcode/. –