JavaRush/Java блог/Архив info.javarush/Уровень 14: план уровня и доп. материалы
hubert
41 уровень

Уровень 14: план уровня и доп. материалы

Статья из группы Архив info.javarush
участников
План уровня:
  • Приведение типов, instanceof. Большая задача на интерфейсы.
  • instanceof
  • Приведение ссылочных типов: расширение и сужение. type cast
  • Singleton pattern

Курс Java Что еще можно посмотреть на досуге: "Информация о типах" в Thinking in java RTTI - run-time type identification Преобразование ссылочных типов или спящий волк на клавиатуре http://habrahabr.ru/post/27108/ https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.1.6 https://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html#jls-5.5
Нашли классную ссылку к материалу данной темы? Добавьте ее сюда в виде комментария. Возможно, именно Ваша ссылка поможет другому человеку стать программистом и улучшить свою жизнь!

Вернуться к плану обучения
Вернуться к обучению java онлайн на JavaRush
Комментарии (45)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
xgrothx
Уровень 30
2 февраля 2017, 13:09
Вопрос по лекции 3. Приведение типов. Расширение и сужение

Cat cat = new Tiger();

С объектом при таком присваивании ничего не происходит! Меняется только количество методов, которое можно вызвать с помощью конкретной переменной-ссылки.

Например, переменная класса Cat позволяет вызывать методы doPetActions & doCatActions, и ничего не знает о методе doTigerActions, даже если ссылается на объект класса Tiger.

Но ведь это не так? Точнее, забыли про боооольшууую оговорку. Благодаря полиморфизму Java сама определяет, метод какого класса вызвать. И объект Tiger, присвоенный переменной Cat вполне может вызвать метод класса Tiger. Все зависит от того, какой аргумент подадут на вход.
DenisDN
Уровень 17
27 июня 2016, 19:56
Здравствуйте. В представленой теме от профессора, то есть 13 главе Эккеля ( тыц), есть раздел Проверка перед приведением типов. В этом разделе есть пример

public class Individual implements Comparable<Individual> {
  private static long counter = 0;
  private final long id = counter++;
  private String name;
  public Individual(String name) { this.name = name; }
  // 'name' is optional:
  public Individual() {}
  public String toString() {
    return getClass().getSimpleName() +
      (name == null ? "" : " " + name);
  }
  public long id() { return id; }
  public boolean equals(Object o) {
    return o instanceof Individual &&
      id == ((Individual)o).id;
  }
  public int hashCode() {
    int result = 17;
    if(name != null)
      result = 37 * result + name.hashCode();
    result = 37 * result + (int)id;
    return result;
  }


У меня возник вопрос. Какую смысловую нагрузку несет число 37, это просто первое пришедшее на ум автору число или это специальное число, которое должно на что-то меня натолкнуть?
Sant9Iga
Уровень 41
1 июля 2016, 13:02
37 это перевернутое лучшее число
Cepr0
Уровень 41
5 апреля 2016, 16:55
b_rhyme
Уровень 17
17 февраля 2016, 14:09
В материалах — ссылки на главы Эккеля дублируются. Может стоит убрать одну?)
Goodpupil
Уровень 17
10 мая 2015, 17:08
Эта глава конечно задержала мой быстрый проход по уровням. Тяжело её было осилить
artemtimac
Уровень 22
8 февраля 2015, 23:05
Дайте новую ссылку на RTTI. Эта не работает.
duddeniska
Уровень 21
3 декабря 2014, 23:09
Блин ребят я вообще валенок нифига не понял зачем это приведение типов и когда его нужно использовать!(((
ath01
Уровень 28
11 декабря 2014, 18:12
стоит прочитать хотя бы комменты выше, там все объясняют простым языком.
Inquirer
Уровень 28
2 ноября 2014, 11:21
Не працююче інтернет посилання в плані лекції

RTTI — run-time type identification

Ось робоча адресація: RTTI — run-time type identification
Eldar
Уровень 41
24 июля 2014, 02:56
Всем привет.

На 10 уровне говорилось:
«Кратко и по существу о преобразовании ссылочных типов. Но пока мы коснёмся только переменной типа Object. Этой переменной можно присвоить ссылку любого типа (расширение типа). Но чтобы выполнить обратное присваивание (сужение типа) приходится явно указывать операцию приведения:
».
И примеры.
Типичное расширение ссылочного типа:
String s = "mama";
Object o = s;

Типичное сужение ссылочного типа:
Object o = "mama";
String s2 = (String) o;

Дошел до 14 уровня, там говорится обратное:
«Движение вверх по цепочке наследования называется сужением, т.к. теряется возможность вызвать методы, которые были добавлены в класс при наследовании.»
И пример.
При расширении типа, нужно использовать оператор преобразования типа.
Object obj = new Tiger();
Pet pet = (Pet) obj;
Cat cat = (Cat) obj;
Tiger tiger = (Tiger) pet;
Tiger tiger2 = (Tiger) cat;


Или я чего-то недопонимаю? Объясните пожалуйста.
BappekM
Уровень 34
24 июля 2014, 03:22
не путайте расширение/cужение ссылки и объекта, ccылка Object o может указывать на что угодно, получается она расширила свои возможности, в случае с объектом все получается иначе… через эту ссылку мы имеем ограниченную функциональность…
raynn
Уровень 31
17 июля 2014, 12:40
Еще один непонятный момент:
почему можно сделать такое расширение:
Object obj = new Tiger();
Pet pet = (Pet) obj;
Cat cat = (Cat) obj;
Tiger tiger = (Tiger) pet;
но нельзя такое:

Pet pet1 = new Pet();
Tiger tiger = (Tiger) pet1;

Ведь вроде бы и pet и pet1 хранят объекты класса Pet.
Sant9Iga
Уровень 41
17 июля 2014, 12:43
raynn
Уровень 31
17 июля 2014, 13:48
Не совсем, но, видимо, просто так устроено, что в первом случае в pet хранится объект, приведенный к классу Pet от Tiger, система как-то это запоминает, и разрешает обратное приведение: Tiger tiger = (Tiger) pet;
В случае же объекта, изначально созданного как Pet, приведение к классу-потомку невозможно.
aleczander
Уровень 17
17 июля 2014, 14:47
Никто ничего не запоминает. JVM пытается провести преобразование, и, поскольку в переменной хранится ссылка на объект, позволяющий это сделать, все проходит успешно. Во втором случае вылетит ClassCastException
Pavel255
Уровень 25
6 ноября 2015, 19:41
Потому что при такой реализации pet1 может ссылаться на любое животное (объект new Pet): кошка, собака, рыба...
И превратить потом такого зверька в тигра никак не получится)