как метод полиморфизма соответствует в java

#java #polymorphism

Вопрос:

Я озадачен тем, как работает полиморфизм Java. В приведенном ниже случае существует три метода полиморфизма showText , для четкого различения названий этих методов method-1 , method-2 , method-3 . коды, как показано ниже:

  public class PolymorphismTest {  public static void main(String[] args) {  showText("def");  }   // method-1  private static void showText(Object abc) {  print("1.....");  showText(abc, "abc");  }   // method-2  private static void showText(Object abc, String item) {  // print(abc.getClass().getName());  print("2.....");  String text;  if (abc == null) {  text = null;  } else {  text = abc.toString();  }  showText(text, item);  }   // method-3  private static void showText(String abc, String item) {  print("3.....");  }   private static void print(String text) {  System.out.print(text);  } }   
  • метод-1 имеет один параметр типа Object
  • метод-2 имеет два параметра, типом параметра являются Object и String
  • метод-3 имеет два параметра, с одинаковым количеством параметров method-2 , в то время как его первый тип параметров String

main() Вызовы method-1 с параметром типа String , в теле method-1 которого он вызывает другой метод, какой из них соответствует, method-2 или method-3 ?

Я тестирую его на java 8, результат таков

 1.....2.....3.....  

Комментарии:

1. Разрешение перегрузки метода Java выполняется во время компиляции, а не во время выполнения. Вы спросили, какой метод соответствует, и вроде как дали себе ответ своим выводом. Но причина, по которой ваш первый метод вызывает второй, как уже говорилось, определяется во время компиляции, поэтому Object abc это просто объект, и поэтому компилятор решает, что метод, принимающий объект, является правильным для вызова. Все это делается при компиляции вашей программы. То, что вы позже передадите строку в качестве фактического объекта, не имеет значения

2. итак… в основном: как работает перегрузка методов? Вы читали учебник?

Ответ №1:

Перегрузка решается во время компиляции, поэтому, когда первый метод получает abc параметр, он видит его как Object (не a String ) и вызывает method-2 , который имеет соответствующую подпись для него.

Вы, вероятно, запутались, потому что это отличается от механизма динамического связывания, который применяется к методам экземпляров классов (объектов) и разрешает метод во время выполнения на основе фактического класса экземпляра, для которого выполняется вызов (например toString() , в abc.toString() ).