• ,

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

План уровня:
  • Приоритет операторов
  • Все методы класса Object, метод toString()
  • Методы equals & hashCode: зачем, где используются, как работают
  • Знакомство с методами wait, notify, notifyAll
  • Метод clone, интерфейс Cloneable.
  • Метод finalize, try-with-resources (java7).
  • Метод getClass(), объект Class, знакомство с Reflection

Курс Java

Что еще можно посмотреть на досуге:
Ответы на вопросы к собеседованию по теме уровня.

Подробно о equals & hashCode

Тут можно почитать про 2 типа клонирования, а также почитать несколько вопросов с ответами для собеседования. На английском.

Философия джава — Приложение А: Передача и возврат объектов
Читаем только с раздела Клонирование объектов до Конструкторы копирования включительно.

Глава из Effective Java на английском. Кстати, очень хорошая книга, есть русский вариант. Рекомендую почитать, но не сейчас, а ближе к концу курса Java Core — после 30-го уровня. Сейчас тебе нужно читать Thinking in Java (Философия Java)

www.seostella.com/ru/article/2012/10/04/kak-sgenerirovat-hashcode-v-java.html



Нашли классную ссылку к материалу данной темы? Добавьте ее сюда в виде комментария.
Возможно, именно Ваша ссылка поможет другому человеку стать программистом и улучшить свою жизнь!

Вернуться к плану обучения

Вернуться к обучению java онлайн на JavaRush

39 комментариев

provisota
Подскажите, а где можно писать об опичатках в лекциях?
Вот например о таких (level21.lesson08):
provisota
Пардон, «опечатках» разумеется. :)
tsev
Обсуждалось лекцию назад, Diana указала на эту тему вконтакте.
provisota
понял, спасибо, буду туда теперь писать если что.
Lexw
два года, а опечатка и поныне там.
тоже малёха подвис на том месте…
olegvasylkov
Diana подправьте, пожалуйста, 2 года все же
Fry
Исправили, в след релизе будет уже.
panser
хорошие Дополнение по поводу clone() initialize.ru/node/176
panser
EmperioAf
В лекции от Фрая я начал ржать в голос! Приведу лишь некоторые цитаты от которых лёгкий разрыв шаблона.

«Всё, что ты хочешь написать, кто-то уже когда-то написал.»
«99% кода, который тебе нужен, уже написан.»
«Прежде, чем что то писать с нуля, поищи в интернете ...»
«Опытный разработчик может найти в интернете готовый ответ или подсказку на 99.99% всех возникающих проблем.»

То есть, задачи созданы как инструмент, чтобы детально разобраться в том, что и как в Java7SE работает.
Например на этом уровне есть 3 задачи на equals и HashCode, которые проходятся вообще нажатием кнопок Alt+Insert, но т.к. об этом в лекции не упоминалось, то часть учеников будут ломать голову как же написать equals и HashCode.
И вот наконец в очередной лекции авторы курса честно сознались, что 99.99% проблем уже решены за вас, и вы можете, лишь слегка владея синтаксисом языка и поверхностно представляя что в коде происходит, но
будучи профессианальным гугломаном, способном найти любую информацию на английском языке и решить 99% JavaRush-задач.

Говоря короче, мне кажется нелепым размещение такой лекции на 21-ом уровне (!!!)
Нелепо это потому что к 21-ому уровню уже все, кто решает задачи пользуются поисковиком. Да!, один тип учеников в совершенстве владеет английским и поэтому решает задачи обычно с помощью гугла (почти не включая мозг), — а другой тип учеников решил понять механизмы языка Java и
поэтому лезет в гугл в последнюю очередь.
Но смысл в том, что уже все ученики к 21-ому лвлу свой выбор сделали и поэтому статья о том, что всё можно найти в гугле информации не несёт и является лишней (имхо)!
dobikun
почему я не вижу описания 21 лекций?
hoster333
Если у кого есть конспект с 21 уровня и дальше, скиньте, пожлуйста. Обычно делал себе короткие заметки, чтоб потом по лекциям не выискивать нужную информацию. А с 21-го уровня здесь лекций нету, а в силверлайте копировать нельзя. Вручную долго печатать. Спасибо.
maks1m
Вот у меня вопрос по этой лекции
написано что метод
substring(int beginIndex, int endIndex)

не создает новую строку, а ссылается на текущуюю только использует указатели смещения.
Решил проверить и что я вижу

public String substring(int beginIndex, int endIndex) {
    /*
    some code
    */

    return ((beginIndex == 0) && (endIndex == value.length)) ? this
            : new String(value, beginIndex, subLen);
}

Новый объект String создается, проверим что получит масив символов внутри объекта
идем в конструктор


public String(char value[], int offset, int count) {
    /*
    some code
    */

    this.value = Arrays.copyOfRange(value, offset, offset+count);
}


далее идем в copyOfRange

public static char[] copyOfRange(char[] original, int from, int to) {
    int newLength = to - from;
    if (newLength < 0)
        throw new IllegalArgumentException(from + " > " + to);
    char[] copy = new char[newLength];
    System.arraycopy(original, from, copy, 0,
                     Math.min(original.length - from, newLength));
    return copy;
}


и здесь отчетливо видно что создается новый масив чаров, а не идет ссылание на существующий
Проверял это для 8-й и 7-й java.
Так это что устаревшая информация или я не там смотрел??
Подскажите кто в курсе.
Amado
30 апреля 2013 ...
«В Java 1.7.0_06 поля offset и count были удалены из класса String. Это означает, что мы теперь не можем совместно использовать массив символов. Теперь мы можем забыть об утечках памяти описанных выше и больше никогда не использовать конструктор new String(String). Как недостаток, вы должны всегда помнить, что метод String.substring сейчас имеет линейную сложность в отличие от константой, которая была раньше.»
Psich
  • Psich
  • 0
  • Комментарий отредактирован 2015-06-05 01:41:08 пользователем Psich
А будут лекции в более удобоваримом виде? В сильверлайте невозможно нормально читать (
Nazgul
Вернулся к этой лекции после 24 уровня, и столкнулся с непониманием механизма переопределения метода clone(). В лекции сказано:
«Метод clone() объявлен как protected, так что он доступен для вызова только классам из его пакета (java.lang.*) или классам-наследникам.»
Как известно, любой объект в Java это наследник от класса Object, спрашивается, зачем тогда его переопределять? у наследования от Object есть какая-то скрытая от глаз магия или protected работает только при явном наследовании с использованием extends?
maks1m
Переопределяя метод clone ты расширяешь его видимость, то есть был protected стал public и теперь ты можешь дать команду «клонируйся» из другого класса, то есть хочешь чтобы класс умел клонироваться явно скажи об этом расширив область видимости.
Nazgul
Спасибо за ответ, так же нашел еще одну формулировку
Если класс реализует интерфейс Cloneable, по умолчанию clone() копирует все поля (мелкая копия). Если требуется не копировать, а клонировать поля (а также их поля и так далее), надо переопределять метод clone(). Определение и использование метода clone() часто является нетривиальной задачей."
Переопределять нужно, чтобы не копировались ссылки на поля клонируемого объекта
maks1m
Ну своя доля правды в этой формулировке есть но если ты не расширишь область видимости метода clone тогда ты сможешь клонировать объект только из него самого, но не с помощью других объектов
NataliaIlchenko
Ссылка на 2 типа клонирования нерабочая
42x42x42
Нужно заменить на эту, они переместили свой сайт indragni.com/blog/2012/07/24/java-cloning-tutorial/
fishbone
  • fishbone
  • 0
  • Комментарий отредактирован 2015-12-01 09:07:12 пользователем fishbone
del
Joysi
Про wait и notify хорошо написано тут habrahabr.ru/post/143237/
anshelen
levicont
  • levicont
  • 0
  • Комментарий отредактирован 2016-06-30 12:48:32 пользователем levicont
Попробовал перейти по ссылке http://www.javaexperience.com/java-cloning-tutorial/ (ТУТ) про 2 типа клонирования на англ. языке, а она битая. :( На сайте еще видимо не поправили.
mrANDERSON
  • mrANDERSON
  • 0
  • Комментарий отредактирован 2016-07-18 09:47:49 пользователем mrANDERSON
Коллеги, поясните, пожалуйста, почему true XOR true == false 1 ^ 1 ==0, т.е. true ^ true == false, если true || true все же == true ???

Заранее благодарен!
Dmitryy
  • Dmitryy
  • 0
  • Комментарий отредактирован 2016-07-18 10:21:05 пользователем Dmitryy
Потому что результат операции XOR (она же "^") является TRUE(1), ТОЛЬКО когда один из аргументов является TRUE(1), а другой аргумент является FALSE(0).
Результат операции OR (она же ||) является TRUE, когда хотя бы один из аргументов является TRUE.
mrANDERSON
Спасибо за ответ! Это понятно из лекции. Где можно подробнее почитать ПОЧЕМУ это именно так? Или это нужно просто запомнить.
Dmitryy
Просто запомнить. Подробнее можно почитать про основу булевой алгебры тут inf1.info/logic
mrANDERSON
  • mrANDERSON
  • 0
  • Комментарий отредактирован 2016-07-18 09:54:37 пользователем mrANDERSON
<code>int xor3 = ~9;
        System.out.println(xor3);</code>
у меня выдает — "-10". И так
<code>BigDecimal xor3 = new BigDecimal(~9);</code>
тоже "-10".
???
mrANDERSON
Решил тут еще раз поиграться с finalize…:
public class Finalize {
    private static int id;

    public static void main(String[] args) throws Throwable {
        for (int counter = 0; counter < 100_000; counter++) {
            new Finalize();
            new Finalize();
            new Finalize();
        }
        System.out.println("----------------------------------");
        Object o = new Finalize();
        Object o2 = new Finalize();
    }

    public Finalize() {
        System.out.println("Hello" + " " + ++this.id);
    }

    @Override
    protected void finalize() throws Throwable {
        super.finalize();
        System.out.println("Bye-bye" + " " + this.id);
    }
}

ountput:
Hello 300000
Bye-bye 299997
Bye-bye 300000
— Bye-bye 300000
Hello 300001
Bye-bye 300001
Hello 300002
Bye-bye 300002
Bye-bye 300002
Bye-bye 300002
Bye-bye 300002
Bye-bye 300002
Bye-bye 300002
Bye-bye 300002
Bye-bye 300002
Bye-bye 300002

Кто-нибудь подскажите, плз почему такой вывод. Почему обьект 300002 уничтожается много раз?)
Спасибо!
tcltk
  • tcltk
  • 0
  • Комментарий отредактирован 2017-04-12 13:18:40 пользователем tcltk
Такой вывод, потому что поле id статическое, одно на весь класс. А объекты уничтожаются разные.

PS даже года не прошло, а ты уже получил ответ ;)
DefNeo
ребят, вот эта ссылка нерабочая(((( Очень хотелось бы почитать на Английском
Тут можно почитать про 2 типа клонирования, а также почитать несколько вопросов с ответами для собеседования. На английском.
alexenkovova
  • alexenkovova
  • 0
  • Комментарий отредактирован 2016-07-31 15:37:22 пользователем alexenkovova
Добрый день, ссылка на ответы собеседования не работает, вернее сайт, куда она ведет не рабочий.
vadimtawi
Core
  • Core
  • 0
  • Комментарий отредактирован 2016-10-25 19:34:54 пользователем Core
Кто-нибудь пробовал читать перевод Effective Java 2 Edition. Как наши православные переводчики назвали эту книгу? Что-то не могу найти её в сети. Хочу себе и оригинал, и перевод.
Core
нашёл)))
MariaM
  • MariaM
  • 0
  • Комментарий отредактирован 2016-10-28 10:36:48 пользователем MariaM


там же предполагается что-то ещё (первая лекция 21ого уровня)? =)
Nullptr
В 12 уроке прослезился на месте «Сколько будет $100 в рублях?»…
Только зарегистрированные и авторизованные пользователи могут оставлять комментарии.