Мой вопрос: Почему 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));
}
}
_ «Почему a4.equals (a2) вызывает метод method1 для выполнения, а не method2?» _, Потому что 'equals (AA aa)' в 'BB' не является переопределением метода' equals (Object o) 'в' AA 'поскольку тип параметра не совпадает. –
_ «Похоже, что когда он не указывает на BB (классу, где все равные методы), он вызывает только метод1, и не имеет значения, какой тип параметра получает метод.» _ Точно. Вы можете вызывать методы только для типа, объявленного внутри него. Одних и тех же названий Параметров недостаточно, типы этого параметра также должны совпадать в том же порядке. –
BTW: проверка недействительности до 'instanceof' является избыточной:' null instanceof AnyClass' [возвращает false] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html# JLS-15.20.2). –