Вызов 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().