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

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

Статья из группы Архив info.javarush
участников
План уровня:
  • Основы ООП: перегрузка, полиморфизм, абстракция, интерфейсы.
  • Полиморфизм детально
  • Переопределение методов
  • Приведение ссылочных типов: расширение и сужение. type cast
  • Динамическая диспетчеризация методов
  • Доступ к методам базового класса - super
  • instanceof
  • Перегрузка методов
  • Абстрактные классы
  • Интерфейсы

Курс Java Что еще можно посмотреть на досуге: Глава "Полиморфизм" в Thinking in Java Для чего нужен super - официальная версия Тут можно скачать краткую инструкцию по хоткеям в IntelliJ Idea
Нашли классную ссылку к материалу данной темы? Добавьте ее сюда в виде комментария. Возможно, именно Ваша ссылка поможет другому человеку стать программистом и улучшить свою жизнь!

Вернуться к плану обучения
Вернуться к обучению java онлайн на JavaRush
Комментарии (45)
  • популярные
  • новые
  • старые
Для того, чтобы оставить комментарий Вы должны авторизоваться
Tatiana_Tatiana
Уровень 23
2 июля 2016, 16:07
Я тоже прошла уровни 11 и 12 за два дня, с легкостью решала практически все задачки. Меня не отпускает ощущение, что я о полиморфизме, интерфейсах, абстрактных методах узнала только теорию, а тренировалась на написании синтаксиса. На каждую темку несколько одинаковых задачек, расставить кодовые слова и т.п. Задачек по смыслу не было не одной! Или с таким багажом (10 уровней) нельзя пока ничего написать по смыслу, и смысловые задачки будут позже? Может кто-нибудь прокомментировать?
Akira
Уровень 20
6 июня 2017, 01:13
Сам надолго застрял на последней задачке 20 уровня. Сейчас вот дело сдвинулось с мертвой точки. Про следующие уроки слышал, что они состоят из много мелких, но объединенных в одну большую. Возможно как раз в них и возможно отработать принципы)
mrANDERSON
Уровень 26
7 июня 2016, 23:06
Доброго времени суток!
Как Вы думаете дженерики это все-таки полиморфизм или нет?)
Akira
Уровень 20
6 июня 2017, 01:14
Имхо-да.
Denk
Уровень 27
6 апреля 2016, 21:29
А уровни 11 и 12 пошустрее идут, прошел два за один день, и задачи решил на половину.
DmitryChVW
Уровень 19
30 марта 2016, 15:04
Помогите пожалуйста разобраться в понятиях сужения и расширения ссылочных типов. Есть разногласие в этих понятиях в лекции 12 данного курса и по ссылке http://old.intuit.ru/department/pl/javapl/7/2.html
В лекции сказано следующее:

А на intuit.ru следующее, то есть всё наоборот, поменяны понятия сужения и расширения типов:


То есть в лекции 12 переход от производного класса (дети) к базовому (родители) называют «классическим сужением типа», а на интуите «переход от детей к родителям» называют расширением. Где же правильно, или что-то я не правильно понимаю? Спасибо
Adelaida
Уровень 34
30 марта 2016, 17:46
Запомни главное правило:
Набор методов, которые можно вызвать у переменной, определяется типом переменной. А какой именно метод/какая реализация вызовется, определяется типом/классом объекта, ссылку на который хранит переменная
На мой взгляд ДжаваРаш в лекции имели в виду Расширение/Сужение с точки зрения выбора доступных методов у преобразованной переменной (здесь: теперь у Кита будут методы Кита и Коровы).
А вообще да — когда преобразовывают к наследнику это нисходящее преобразование и наоборот.
estetne
Уровень 15
26 мая 2016, 12:44
Сначала меня запутало
class Child extends (расширяет) Parent

теперь это…
Я считаю правильно так: от общего к конкретному – сужение типов, а с точки зрения доступных методов назвали бы расширение функциональности/ возможностей/ содержимого типа.
WhiteSteel
Уровень 21
25 декабря 2015, 08:38
В первом уроке этого уровня, 3-й пункт «Приведение типов», по-моему написан с грамм. ошибкой «Т.к. класс при наследовании получает все методы и данные класса родителя, то объект этого класса разрешается сохранять (присваивать) в переменные класса родителя». буква «у» слову ОБЪЕКТ в студию!
mrserfr
Уровень 33
25 декабря 2015, 09:30
нет здесь ошибки
mrserfr
Уровень 33
25 декабря 2015, 09:31
class A {}
class B extends A {}
A a = new B();
WhiteSteel
Уровень 21
25 декабря 2015, 16:04
ну ок. раз уж ты здесь. то смотри. @Override "+ имяМетода" мы пишем, только когда наследуемся от абстрактного класса?
mrserfr
Уровень 33
25 декабря 2015, 17:24
я не понял вопроса…

@Override — означает, что мы переопределяем метод, описанный в суперклассе
mrserfr
Уровень 33
25 декабря 2015, 17:26
class A {
    void move(){
        System.out.println("move");
    }
}

class B extends A {
    @Override
    void move(){
        System.out.println("don't move");
    }
}
crivenco
Уровень 21
7 апреля 2015, 16:46
Ссылка Тут можно скачать краткую инструкцию по хоткеям в IntelliJ Idea — не работает
Akira
Уровень 20
6 июня 2017, 00:57
Только что скачал себе в закладки)видимо починили либо был временный сбой)
mTihiy
Уровень 41
29 марта 2015, 19:50
Корректен ли пример применяемый в лекции, где кит наследуется от коровы?
в «Философии Java» и других источниках написано, что наследование применяется там, где есть связь «является».
Кит ведь не является коровой.
alhabor
Уровень 24
31 марта 2015, 11:46
Плюсую, тоже обратил внимание. В Дополнительных материалах к лекции 11 есть линк на статью, откуда цитата: «Если у нас есть классы А и В и если класс А „не является“ разновидностью класса В, то А не должен быть подклассом В. (Grady Booch, Object-Oriented Analysis and Design with Applications)». И в первой же лекции 12 уровня идёт пример про кита, наследующегося от коровы.
Odnolap
Уровень 8
15 марта 2015, 02:25
Все таки считаю некорректным утверждение «Статические методы не наследуются и, следовательно, не переопределяются» в первом уроке «Полиморфизм и переопределение». Потому как если написать класс A со статическим методом method, потом написать класс B extends A, в котором методов не создавать, после чего вызвать B.method(), то мы получим выполнение действий, указанных в реализации этого метода в классе A.
public class A
{
 public static void method()
 { 
 System.out.println(«class A»);
 }
}

public class B extends A 
{
}

public static void main(String[] args)
{
 B.method();
}

Вывод:
class A
Что это, если не наследование статического метода?
С другой стороны, напиши мы реализацию этого метода в B, то есть переопредели его, то при вызове B.method, мы получим выполнение действий, описанных в реализации класса B. Что это, если не переопределение статического метода?
public class A
{
    public static void method()
    { 
        System.out.println("class A");
    }
}

public class B extends A 
{
    public static void method()
    { 
        System.out.println("class B");
    }
}

public static void main(String[] args)
{
    B.method();
}

Вывод:
class B
Да, если в этом случае создать экземпляр класса B в переменной класса A и вызвать у нее этот статический метод, то вызовется реализация, описанная в классе A
A a = new B();
a.method;

Вывод:
class A
Но тут надо просто сказать, что при вызове статического метода у переменной компилятор вместо нее подставляет ее тип, и не смотрит, что в ней содержится. Т.е. следующин 2 вызова статических методов аналогичны:
//1
A a = new B();
a.method();
//2
A.method();
IgorBrest
Уровень 33
13 апреля 2015, 12:28
Возможно, в той лекции имеется ввиду переопределение (замена) и наследование методов на уровне полиморфизма.
Для статических методов механизм динамической диспетчеризации не применим, по определению.
а значит полиморфизм для них не работает. как то так…
tsev
Уровень 30
29 января 2015, 13:08
На том же ресурсе есть альтернативная страница.
Globus51
Уровень 35
6 февраля 2014, 00:28
tsev, спасибо за подсказки.

альтернативная страница — это Глава «Полиморфизм» в Thinking in Java
или это другая статья на эту же тему?
tsev
Уровень 30
6 февраля 2014, 00:51
Судя по первым строкам это она.
оригинал:
Polymorphism is the third essential feature of an object-oriented
programming language, after data abstraction and inheritance.
статья:
Полиморфизм — третья неотъемлемая часть объектно-ориентированного программирования, после абстракции и наследования соответственно.
Ruzveld
Уровень 34
20 июня 2014, 19:54
Думаю, каждый, кто попробует испытать код из уроков про интерфейсы, столкнется с ошибкой компиляции при объявлении методов классов, унаследованных от интерфейсов. Как написали здесь, это происходит потому, что к каждому методу интерфейса неявно приписывается публичный уровень доступа, поэтому попытка объявить метод без модификатора public приведет к ошибке.
Например
<code>interface WallBuilder
{
    void buildWall();
}
class Robot implements WallBuilder
{
    //void buildWall(); - ТАК НЕЛЬЗЯ
    public void buildWall(); //надо так
}</code>

Наверное есть смысл упомянуть об этом в самом уроке.