2016-10-25 3 views
4

Мой вопрос: Почему 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)); 
    } 
} 
+0

_ «Почему a4.equals (a2) вызывает метод method1 для выполнения, а не method2?» _, Потому что 'equals (AA aa)' в 'BB' не является переопределением метода' equals (Object o) 'в' AA 'поскольку тип параметра не совпадает. –

+0

_ «Похоже, что когда он не указывает на BB (классу, где все равные методы), он вызывает только метод1, и не имеет значения, какой тип параметра получает метод.» _ Точно. Вы можете вызывать методы только для типа, объявленного внутри него. Одних и тех же названий Параметров недостаточно, типы этого параметра также должны совпадать в том же порядке. –

+1

BTW: проверка недействительности до 'instanceof' является избыточной:' null instanceof AnyClass' [возвращает false] (https://docs.oracle.com/javase/specs/jls/se8/html/jls-15.html# JLS-15.20.2). –

ответ

7

Единственный equals способ, известный AA класса Object «ы equals, который принимает Object аргумент. Поэтому можно звонить только public boolean equals(Object ob) при вызове a4.equals(a2) или a2.equals(b1), так как тип времени компиляции как a2, так и a4 - AA.

Метод, который вызывается во время выполнения, является вашим «методом1», поскольку он переопределяет Objectequals. Перегрузки public boolean equals(AA ob) и public boolean equals(BB ob) могут быть вызваны только для ссылок, тип времени компиляции которых равен BB, поскольку перегрузка метода разрешена на основе типа времени компиляции объекта, из которого вызывается метод. Если вы вызовете b1.equals(), вы увидите, что будут выбраны другие ваши методы, так как будет использоваться перегрузка метода.

+0

, если возможно, вы можете указать мне ссылку, где я могу более подробно узнать об этой концепции. – Abhishek

+0

@Abhishek Просто Google «JLS метод перегрузки разрешения» и «JLS метод переопределения» – Eran

+0

Но когда вызывается a4.equals (a2), a2 указывает на AA и общедоступные логические значения (Object ob) принимает Object, а не AA. Таким образом, он автоматически запускает UpCasting во время выполнения? – Arthur

Смежные вопросы