Вызов equals (""); сам по себе компилирует и запускает
Я заметил, что вызов equals("");
в методе класса не вызывает ошибки внутри Eclipse
. Я никогда не видел . Equals, который называется без string1.equals(string2);
.
package voodoo;
public class Equals {
public void method(){
equals("");
}
}
Что происходит здесь и когда когда-нибудь будет использоваться equals()
?
Если я помещаю это в тег JUnit
для проверки, он запускается и проходит.
Ответы
Ответ 1
equals
, который вы вызываете, - это метод Object
equals
, который можно вызвать в this
, не указывая явно. Другими словами, ваш вызов эквивалентен
this.equals("");
Это совершенно верно, хотя корректная реализация всегда должна возвращать false
. Обратите внимание, что возвращаемое значение игнорируется, что также является законным.
Вы можете увидеть, что происходит, переопределяя equals
что-то, что печатает сообщение, в качестве эксперимента:
public class Equals {
public void method(){
equals("");
}
@Override
public boolean equals(Object other) {
System.out.println("I am being compared to '"+other+"'");
return super.equals(other);
}
}
Ответ 2
equals
нестатический и вызывает equals
of Object
, который аналогичен вызову любого другого метода класса. Более того, наш класс является дочерним элементом Object
. Вызов метода - это что-то вроде thisObject.equals(emptyString)
note here String
также является Object
. Итак, в конечном счете мы вызываем метод currntObject.equals(object)
из дочернего элемента Object
.
Он похож на,
class A {
public boolean ok(Object str) {
return false;
}
}
class B extends A {
public void method(){
ok("");
}
}
Здесь ребенок не переопределяет equals
, поэтому он будет вызывать метод этого родителя и будет ссылаться на текущий экземпляр.
Ответ 3
Поскольку все является подклассом класса Object, здесь вы вызываете метод super class (Object) equals. И он получает Object как параметр, где ""
является строковым объектом, он компилируется отлично.
И он возвращает boolean
на самом деле, но вы игнорируете его для получения. Это право игнорировать результат.
Если вы его получите и проверьте, то возвращает false
, так как ваш класс Equals
не равен пустой строке.
Ответ 4
equals(...)
без явного вызова объектов метод this
. В вашем примере вы сравниваете экземпляр Equals
с пустой строкой.
Ответ 5
Открытый метод equals()
в классе Object
. Все классы по умолчанию представляют собой прямой/косвенный дочерний класс класса Object
. Ваш класс Equals
не наследует какой-либо класс явно. Таким образом, это прямой подкласс Object
.
И в классе Object метод equals()
объявляется следующим образом:
public boolean equals(Object obj){}
Итак, ваш код полностью действителен. Фактически вы вызываете Equals.equals()
в method()
.