Переопределение и перегрузка
Мой вопрос: почему a4.equals(a2) заставляет method1 выполнять, а не method2?
a2 указывает на AA, и это параметр.
И то же самое о a2.equals(b1).
Похоже, что когда он не указывает на BB (класс, в котором находятся все методы equals), он вызовет только method1 для выполнения, и не имеет значения, какой тип параметра получает метод.
public class AA
{
public int getVal()
{
return 5;
}
}
public class BB extends AA
{
private String _st = "bb";
public boolean equals(Object ob) //method1
{
System.out.println("Method 1");
if((ob != null) && (ob instanceof BB))
{
if(_st.equals(((BB)ob)._st) && (getVal() == ((BB)ob).getVal()))
return true;
}
return false;
}
public boolean equals(AA ob) //method2
{
System.out.println("Method 2");
if((ob != null) && (ob instanceof BB))
{
if(_st.equals(((BB)ob)._st) && (getVal() == ((BB)ob).getVal()))
return true;
}
return false;
}
public boolean equals(BB ob) //method3
{
System.out.println("Method 3");
if(ob != null)
if(_st.equals(((BB)ob)._st) && (getVal() == ((BB)ob).getVal()))
return true;
return false;
}
}
public class Driver
{
public static void main(String[] args)
{
AA a2 = new BB();
AA a4 = new BB();
BB b1 = new BB();
System.out.println(a4.equals(a2));
System.out.println(a2.equals(b1));
}
}
1 ответ:
Единственный метод
equals, известный классуAA, - это методObject'sequals, который принимает аргументObject. Поэтому толькоpublic boolean equals(Object ob)может быть вызван при вызовеa4.equals(a2)илиa2.equals(b1), так как тип времени компиляции обоихa2иa4равенAA.Метод, который вызывается во время выполнения, является вашим "method1", так как он переопределяет
Object'sequals. Перегрузкиpublic boolean equals(AA ob)иpublic boolean equals(BB ob)могут быть вызваны только для ссылок, тип времени компиляции которыхBB, так как перегрузка метода разрешена на основе времени компиляции тип объекта, для которого вызывается метод. Если вы вызоветеb1.equals(), вы увидите, что выбраны другие методы, так как будет использоваться перегрузка метода.