Все классы являются наследниками суперкласса Object. Это не нужно указывать явно. В результате объект Object может ссылаться на объект любого другого класса.
== - сравнивает по ссылкам
equals() - сравнивает по состоянию объектов
Нарушится контракт. Классы и методы, которые использовали правила этого контракта могут некорректно работать. Так для объектаHashMapэто может привести к тому, что пара, которая была помещена в Mapвозможно не будет найдена в ней при обращении к Map, если используется новый экземпляр ключа.
Те, которые используют при определении методаequals(). Хэш код должен быть равномерно распределен на области возможных принимаемых значений.
volatile — не используется кэш (имеется ввиду область памяти в которой JVM может сохранять локальную копию переменной, чтобы уменьшить время обращения к переменной) при обращении к полю. Для volatile переменной JVM гарантирует синхронизацию для операций чтения/записи, но не гарантирует для операций изменения значения переменной.
у каждого потока есть CPU кэш который копирует
данные которые в главной памяти.
Проблем бы не было если в компьютере не больше 1 CPU.
Но у современных компьютеров их конечно много.
представь что есть счётчик и два потока
поток1 читает и записывает
поток2 только читает
поток не может быть преравн при чтении или записи
так как это атомик операция
но
если поток1 работает на CPU1
а поток2 на CPU2
что случится
0)Значение счётчика в главной памяти - 0
1)поток1 считывает от туда 0
2)поток1 прибавляет к счётчику 1
3)поток1 записывает значение в cpu кэш
4)поток2 считывает значение счётчика из главной памяти,
поскольку в кеше её нет
и получает старое значение 0
ключевое слово volatile
делает так что после записи в CPU
значение сразу записывается в главную память
НО
счётчик++ делает 2 действия
с начала считывает
а потом записывает увеличенное и копирует в главную память.
transient— указание того, что при сериализации/десериализации данное поле не нужно сериализовать/десериализовывать.
Действует общий принцип: расширять видимость можно, сужать нельзя.privateметоды видны только внутри класса, для потомков они не видны. Поэтому их и расширить нельзя.
Нет, такой методи такне виден для наследников, а значит не может быть ими переопределен.
К конструктору не применимо ключевое словоfinal.