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 выводит только число.
При этом, конечно же, никакая информация не теряется о конкретном типе объекта присвоенного ссылке. Единственное ограничение - вы не сможете вызвать методы конкретного класса, пока вы его не скастуете к его настоящему типу.
Комментариев нет:
Отправить комментарий