Страницы

Поиск по вопросам

суббота, 13 октября 2018 г.

Приём методом любого объекта как Object

package objtransfering;
public class ObjTransfering { public static void printEvrth(Object... args) { for (Object it : args) System.out.println(it); }
public static void main(String[] args) { printEvrth(new Integer(1), new Double(5.00), new String("end.")); } }
Все классы наследуют класс Object. К примеру, обёртка Integer наследует класс Number, а он, в свою очередь, Object. Выходит, у класса Integer есть поля и методы, которых нет у класса Object. Тогда почему принимая объекты типа Object метод System.out.println() различает в них Integer, Double и String? Разве у этих объектов не "отбросилась" та часть, которая отличает их от Object?


Ответ

В исходном коде видно, что метод println() перегружен и принимает один из множества типов аргументов.
Во время исполнения JVM определяет какой именно тип объекта передаётся по ссылке типа Object и вызывает соответствующий метод. При этом ООП обёртки над примитивами типа Integer или Double, да и остальные типы, наследующие Object могут иметь переопределённый метод toString(), коий и будет выведен в консоль. Обычно этот метод выводит имя класса и hashCode объекта. В случае же приведённых вами классов там иной код. Например Integer выводит только число.
При этом, конечно же, никакая информация не теряется о конкретном типе объекта присвоенного ссылке. Единственное ограничение - вы не сможете вызвать методы конкретного класса, пока вы его не скастуете к его настоящему типу.

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

Отправить комментарий