JavaRush /Курсы /Java Syntax /Преобразования ссылочных типов

Преобразования ссылочных типов

Java Syntax
10 уровень , 6 лекция
Открыта
Преобразования ссылочных типов - 1

— А теперь небольшой урок от Диего. Кратко и по существу о преобразовании ссылочных типов.

— Начнем мы пока только с переменной типа Object. Этой переменной можно присвоить ссылку любого типа (расширение типа). Но чтобы выполнить обратное присваивание (сужение типа) приходится явно указывать операцию приведения:

Код Описание
String s = "mama";
Object o = s;  // o хранит String
Типичное расширение ссылочного типа
Object o = "mama";// o хранит String
String s2 = (String) o;
Типичное сужение ссылочного типа.
Integer i = 123;  //o хранит Integer
Object o = i;
Расширение типа.
Object o = 123;  //o хранит Integer
String s2 = (String) o;
Ошибка во время исполнения!
Невозможно привести ссылку на число к ссылке на строку.
Object o = 123;  //o хранит Integer
Float s2 = (Float) o;
Ошибка во время исполнения!
Невозможно привести ссылку на целое число к ссылке на дробное число.
Object o = 123f;  // o хранит Float
Float s2 = (Float) o;
Приведение к своему типу. Операция сужения ссылочного типа.

— При расширении или сужении ссылочных типов никакого изменения объекта не происходит. Сужающей (или расширяющей) является именно операция присваивания, при которой, либо выполняется «проверка соответствия типов переменной и ее нового значения» либо нет.

— Тот редкий пример, когда все ясно и понятно.

— Чтобы не было ошибок, как в примерахесть способ узнать, какой именно тип сохранили в переменную типа Object:

Код
int i = 5;
float f = 444.23f;
String s = "17";
Object o = f;                       //o хранит объект типа Float

if (o instanceof  Integer)
{
    Integer i2 = (Integer) o;
}
else if (o instanceof  Float)        
{
    Float f2 = (Float) o;            //отработает именно этот if
}
else if (o instanceof  String)
{
    String s2 = (String) o;
}
10
Задача
Java Syntax Pro, 10 уровень, 6 лекция
Недоступна
StringTokenizer
Используя StringTokenizer раздели query на части по разделителю delimiter. Пример: getTokens("java.util.stream", "\\.") возвращает массив строк {"java", "util", "stream"}

— Желательно выполнять такую проверку перед каждым сужением типа, если тип сохраненного объекта на 100% не известен.

— Понятно.

10
Задача
Java Syntax Pro, 10 уровень, 6 лекция
Недоступна
String.format()
Сделай так, чтобы метод format(String name, int salary) возвращал строку в таком виде: Меня зовут <name>. Я буду зарабатывать $$<salary> в месяц. Для этого используй метод String.format().
10
Задача
Java Syntax Pro, 10 уровень, 6 лекция
Недоступна
String pool
Метод equal(String, String) сравнивает строки по ссылке, используя оператор ==. Нужно сделать так, чтобы метод возвращал true, если содержимое строк одинаковое, и false - если разное, не используя метод equals().
Комментарии (138)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
Benjam1nBTN Уровень 24
13 августа 2022
А почему instanceof а не instanceOf ?)
Евгений N Уровень 23
6 мая 2022

float f = 444.23f;
Object o = f;                       //o хранит объект типа Float
if (o instanceof  Float)  
а почему условие сработало ? ведь f типа не Float a float ! 😬 и сработает ли проверка

int i = 123;  // не  Integer !
Object o = i;
if (o instanceof Integer) 
?
Кот Уровень 39
5 июня 2022
возможно это связано с тем, что Integer—это обёртка для int, поэтому компилятор воспринимает их одинаково. Кстати, забавный момент, если создать переменную типа String, а потом проверить её с помощью instanceof Object, то эта операция вернёт true, так как String—наследник Object.
21 июля 2022
А вы зайдите в класс Integer через CTRL. Там есть поле:

public static final Class<Integer>  TYPE = (Class<Integer>) Class.getPrimitiveClass("int");
Вы когда пишете Object o = i происходит "Autoboxing and Unboxing". Вы не можете объекту присвоить примитивный тип данных. Иначе вы поставите компилятор перед дилеммой: хранить число в стеке или хипе. Поэтому компилятор делает за вас Autoboxing и переносит в хип.

int i = 123;
Object o = i; // new Integer(123);
o = 0;
System.out.println(i);
22 февраля 2022
https://javarush.com/groups/posts/2018-kak-rabotaet-operator-instanceof
Иван Уровень 23
21 июля 2022
Спасибо
Рыбалко Иван Уровень 36
13 февраля 2022
Lo Уровень 35 Expert
13 мая 2023
Ну и что,кто нибудь вступил?
Евгений Уровень 24
16 декабря 2021
без информации из л=дополнительных источников лекцию не понять
hidden #2426138 Уровень 17
13 марта 2021
странно, что не сказало про ClassCastException тут
Method Уровень 47
10 марта 2021
В догонку неплохая статья про instanceof
Никита Уровень 10
20 декабря 2020
/* Комментарий удален, автор заблокирован */
Regina Bulanova Уровень 19
20 декабря 2020
В случае с данной лекцией, к сожалению, мало что понятно. Хотя тема сама по себе не самая сложная. Поэтому лучше обратиться к книгам. Вот эти нравятся мне больше всех: 1. Герберт Шилдт. Java. Руководство для начинающих. Берите самую последнюю версию книги, самую новую. Очень полная книга-справочник. 2. HeadFirst Java. Неплохая и легкая для чтения книга, особенно зайдет тем, кто не любит читать какие-то фундаментальные штуки и нагружаться. 3. Брюс Эккель. Философия java. Классная книга для тех, кто уже погрузился в язык и хочет понять его "фишки". Уровня с 10 ее уже можно спокойно читать.
Lo Уровень 35 Expert
13 мая 2023
HeadFirst Java полный треш. А другие две да, очень помогают, Шилдта можно читать любую версию книги, даже в старых много полезного.
Никита Уровень 10
16 декабря 2020
Тот редкий пример, когда все ясно и понятно. (А нет, не он...)