#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()
).