User hubert
hubert
41 уровень

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

Статья из группы Архив info.javarush.ru
План уровня:
  • Приведение типов, 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
Комментарии (56)
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ
xgrothx Уровень 30, Россия
2 февраля 2017
Вопрос по лекции 3. Приведение типов. Расширение и сужение

Cat cat = new Tiger();

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

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

Но ведь это не так? Точнее, забыли про боооольшууую оговорку. Благодаря полиморфизму Java сама определяет, метод какого класса вызвать. И объект Tiger, присвоенный переменной Cat вполне может вызвать метод класса Tiger. Все зависит от того, какой аргумент подадут на вход.
DenisDN Уровень 17, Одесса, Украина
27 июня 2016
Здравствуйте. В представленой теме от профессора, то есть 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, это просто первое пришедшее на ум автору число или это специальное число, которое должно на что-то меня натолкнуть?
Cepr0 Уровень 41, Одесса, Украина
5 апреля 2016
b_rhyme Уровень 17, Маунтин-Вью, США
17 февраля 2016
В материалах — ссылки на главы Эккеля дублируются. Может стоит убрать одну?)
Goodpupil Уровень 17, Могилев, Беларусь
10 мая 2015
Эта глава конечно задержала мой быстрый проход по уровням. Тяжело её было осилить
artemtimac Уровень 22, Nizhniy Novgorod, Россия
8 февраля 2015
Дайте новую ссылку на RTTI. Эта не работает.
duddeniska Уровень 21, Алматы, Казахстан
3 декабря 2014
Блин ребят я вообще валенок нифига не понял зачем это приведение типов и когда его нужно использовать!(((
Inquirer Уровень 28, Киев, Украина
2 ноября 2014
Не працююче інтернет посилання в плані лекції

RTTI — run-time type identification

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

На 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;


Или я чего-то недопонимаю? Объясните пожалуйста.
raynn Уровень 31, Нижний Новгород, Россия
17 июля 2014
Еще один непонятный момент:
почему можно сделать такое расширение:
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.