Главная страница
Навигация по странице:

  • Может ли Enum наследовать (extends) класс

  • Enum уже наследуется от абстрактного класса

  • Абстракцию

  • Свойства класса

  • Контракт equals При переопределении метода equals разработчик должен придерживаться основных правил, определенных в спецификации языка Java. Рефлексивность

  • Симметричность

  • Интерфейсы vs Абстрактные классы

  • 5 отличий синтаксических

  • Могут ли в языке Java у абстрактного класса быть конструкторы

  • Контракт метода

  • Java Core 2 ревью. Второе ревью. 5 каиф что такое enum Перечисление или java enum


    Скачать 307.15 Kb.
    Название5 каиф что такое enum Перечисление или java enum
    АнкорJava Core 2 ревью
    Дата05.09.2022
    Размер307.15 Kb.
    Формат файлаdocx
    Имя файлаВторое ревью.docx
    ТипДокументы
    #662629

    +-5- каиф-

    Что такое ENUM?
    Перечисление или java enum – это набор именованных констант, который помогает в определении своих собственных типов данных. Когда вы можете определить тип переменных в программе, становится легко их определить.

    Перечисление – это в основном список именованных констант. В Java это определяет тип класса. Он может иметь конструкторы, методы и переменные экземпляра. Он создается с помощью ключевого слова enum.

    Может ли Enum наследовать (implement) интерфейс в Java?
    Да, Enum может наследовать интерфейсы. Поскольку Enum тип схож с классом и интерфейсом, он может наследовать интерфейс. Это дает поразительную гибкость в использовании Enum в качестве специальной реализации в некоторых случаях.
    Может ли Enum наследовать (extends) класс?
    Нет, не может! Неожиданно, поскольку ранее говорилось что Enum тип похож на класс или интерфейс в Java. Ну, это главная причина, почему такой вопрос задают сразу за предыдущим. Поскольку Enum уже наследуется от абстрактного класса java.lang.Enum, понятно, что другой класс наследовать не удастся, поскольку Java не поддерживает множественное наследование классов. Благодаря наследованию от java.lang.Enum, все перечисления имеют методы ordinal(), values() или valueOf().

    Перечисления


    1. У перечислений могут быть конструкторы.

    2. У перечислений могут быть поля.

    3. У перечислений могут быть методы.

    4. Если перечисление объявляется вне класса, оно может получить только два уровня доступа: public или по умолчанию.

    5. У перечислений есть статический метод values(), который возвращает массив, содержащий все возможные значения перечисления, причем строго в том порядке, в котором они были объявлены.


    ООП


    • Наследование - выделение общих свойств и методов в родительский класс. extends - расширение родительского класса.

    • Инкапсуляция - скрытие своих и внутренних методов в классе и предоставление к ним доступа через публичные (доступные другим классам) методы (геттеры, сеттеры).

    • Полиморфизм - это способность функции принимать в качестве аргумента и обрабатывать разные типы информации. Перегрузка методов:


    - Все методы в Java могут быть перегружены (кроме final)

    - Перегруженный в дочернем классе метод, будет вызван для объекта данного класса, вместо метода родительского класса.

    - Если метод не был перегружен, то будет вызвана реализация родительского класса.

    @Override — проверяет, переопределен ли метод. Вызывает ошибку компиляции / интерпретации, если метод не найден в родительском классе или интерфейсе;


    • (?) иногда выделяют еще Абстракцию - при подходе к задаче отойти от частности (желтый автомобиль пикап с двигателем 3.0) и перейти к более обширному понятию (сущность - автомобиль) - Абстракции.

    Класс — это шаблонная конструкция, которая позволяет описать в программе объект, его свойства (атрибуты или поля класса) и поведение (методы класса). Каждый класс имеет своё имя, чтобы в будущем к нему можно было обратиться.

    Объект - конкретный экземпляр класса, который имеет свои собственные конкретные значения свойств.

    Свойства класса - поле данных класса (переменные, массивы и т.п)

    Метод класса - функция, которая описывает то, как сущность выполняет определенные действия.

    NEW - это оператор, который создает новые объекты класса. Он:

    • выделяет память под объект

    • создает объект (вызывает конструктор)

    • возвращает ссылку на созданный объект

    Конструктор - специальный метод для инициализации объекта во время его создания с помощью оператора new. Если его не описывать отдельно - у класса будет конструктор по умолчанию. От метода отличается тем, что у него нет возвращаемого типа и он называется так же как и класс.

    Пакет состоит из 3 составляющих - тип домена (com, edu, ru), имя компании, или фамилия и третья - имя проекта. Для того, чтобы классы не пересекались (конвенция).

    Пакеты используются для того, чтобы логически группировать различные классы.
    Модификаторы доступа:



    ключевое слово super - обращение к родительскому классу.
    Hashcode позволяет понять, что объекты возможно равны, или не равны точно (для грубой оценки сравнения объектов). Стараться переопределять его так, чтобы он был максимально разным каждый раз для сохранения памяти и ресурсов программы.

    Метод equals() необходим в Java для подтверждения или отрицания того факта, что два объекта одного происхождения являются логически равными. Не обязательно все поля должны быть идентичны, так как метод equals() подразумевает именно логическое равенство.
    Контракт equals

    При переопределении метода equals разработчик должен придерживаться основных правил, определенных в спецификации языка Java.

    • Рефлексивность - для любого заданного значения x, выражение x.equals(x) должно возвращать true. Заданного — имеется в виду такого, что x != null

    • Симметричность - для любых заданных значений x и y, x.equals(y) должно возвращать true только в том случае, когда y.equals(x) возвращает true.

    • Транзитивность - для любых заданных значений x, y и z, если x.equals(y) возвращает true и y.equals(z) возвращает true, x.equals(z) должно вернуть значение true.

    • Согласованность - для любых заданных значений x и y повторный вызов x.equals(y) будет возвращать значение предыдущего вызова этого метода при условии, что поля,2 используемые для сравнения этих двух объектов, не изменялись между вызовами.

    • Сравнение null - для любого заданного значения x вызов x.equals(null) должен возвращать false.

    Ситуация, когда у разных объектов одинаковые хеш-коды называется — коллизией. Вероятность возникновения коллизии зависит от используемого алгоритма генерации хеш-кода.

    Когда не стоит переопределять этот метод


    • Когда каждый экземпляр класса является уникальным.

    • В большей степени это касается тех классов, которые предоставляют определенное поведение, нежели предназначены для работы с данными. Таких, например, как класс Thread. Для них реализации метода equals, предоставляемого классом Object, более чем достаточно. Другой пример — классы перечислений (Enum).Когда на самом деле от класса не требуется определять эквивалентность его экземпляров.

    • Например для класса java.util.Random вообще нет необходимости сравнивать между собой экземпляры класса, определяя, могут ли они вернуть одинаковую последовательность случайных чисел. Просто потому, что природа этого класса даже не подразумевает такое поведение.Когда класс, который вы расширяете, уже имеет свою реализацию метода equals и поведение этой реализации вас устраивает.

    • Например, для классов Set, List, Map реализация equals находится в AbstractSet, AbstractList и AbstractMap соответственно.И, наконец, нет необходимости перекрывать equals, когда область видимости вашего класса является private или package-private и вы уверены, что этот метод никогда не будет вызван.

    Что нельзя / можно делать при переопределении метода:

    • нельзя сужать область видимости у модификаторов

    • можно указать final в child

    • нельзя перегружать static

    • можно вернуть объект который является наследником

    • названия и параметры должны в точности совпадать

    Ad-hoc полиморфизм подразумевает исполнение разного кода для каждого типа данных, в то время как параметрический полиморфизм подразумевает исполнение одного и того же кода для всех допустимых типов

    По умолчанию метод toString выводит на экран hashCode объекта. Всегда, когда мы выводим объект в консоль - мы скрыто вызываем у него метод toString.

    Методы Object:

    getClass(); - возвращает описание того класса, к которому принадлежит экземпляр.

    toString(); equals(); hashCode(); notify(); notifyAll(); wait();

    Для всех классов во время компиляции создается класс Class.

    Получить экземпляр типа Class можно вызвав метод getClass(); либо обратившись к классу через имя - ИмяКласса.class. описание класса содержит в себе всю информацию о классе - его имя, набор переменных класса, набор методов, внутренних классов и т.д

    • instanceof проверяет, является ли ссылка на объект с левой стороны экземпляром типа с правой стороны или некоторым его подтипом.

    • getClass() == ... проверяет идентичность типов.

    То есть, если getClass() проверяет полную идентичность класса, то instanceof вернет true даже если объект будет всего лишь подтипом, что может дать нам большую гибкость при активном использовании полиморфизма.

    Анонимный класс — это полноценный внутренний класс. Поэтому у него есть доступ к переменным внешнего класса, в том числе к статическим и приватным

    Анонимный класс не может содержать статические переменные и методы

    Static — модификатор, применяемый к полю, блоку, методу или внутреннему классу. Данный модификатор указывает на привязку субъекта к текущему классу.

    важным моментом является то, что вы НЕ можете переопределять (Override) статические методы. Если вы объявите такой же метод в классе-наследнике (subclass), т.е. метод с таким же именем и сигнатурой, вы лишь «спрячете» метод суперкласса (superclass) вместо переопределения. Это явление известно как сокрытие методов (hiding methods). Это означает, что при обращении к статическому методу, который объявлен как в родительском, так и в дочернем классе, во время компиляции всегда будет вызван метод исходя из типа переменной. В отличие от переопределения, такие методы не будут выполнены во время работы программы. То есть переменная будет проинициализирована на этапе компилирования, когда объекта еще нет.

    static import. Данный модификатор имеет много общего со стандартным оператором import, но в отличие от него позволяет импортировать один или все статические члены класса. При импортировании статических методов, к ним можно обращаться как будто они определены в этом же классе, аналогично при импортировании полей, мы можем получить доступ без указания имени класса. Данная возможность появилась в Java версии 1.5, и при должном использовании улучшает читабельность кода. Наиболее часто данная конструкция встречается в тестах JUnit, т.к. почти все разработчики тестов используют static import для assert методов, например assertEquals() и для их перегруженных дубликатов.

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

    Интерфейсы vs Абстрактные классы

    • Интерфейс описывает только поведение. У него нет состояния. А у абстрактного класса состояние есть: он описывает и то, и другое.

    • Абстрактный класс связывает между собой и объединяет классы, имеющие очень близкую связь. В то же время, один и тот же интерфейс могут реализовать классы, у которых вообще нет ничего общего.

    • Классы могут реализовывать сколько угодно интерфейсов, но наследоваться можно только от одного класса.

    5 отличий синтаксических:

    1. при создании абстрактного класса указывается ключевое слово abstract, а при определении интерфейса — interface.

    2. При наследовании от абстрактного класса используется ключевое слово extends (с англ. «расширяет»), а при реализации интерфейса — implements (с англ. «реализует»).

    3. У абстрактного класса есть конструктор (если не описан - то по умолчанию). У интерфейсов конструктора нет.

    4. Все переменные в интерфейсах неявно являются public static final (т.е. константами). «final» подразумевает, что переменной обязательно должно быть присвоено значение во время инициализации. В абстрактных классах переменные могут быть любыми — абстрактность класса не накладывает ограничений.

    5. Интерфейс не может реализовывать интерфейс, не может наследовать абстрактный класс, но может наследовать (используя ключевое слово extends) множество других интерфейсов. В то же время абстрактный класс также может реализовать до 65 535 интерфейсов

    я


    Чтобы случайно не сломать работающие программы и библиотеки, было решено, что реализация методов в интерфейсах получит самый низкий приоритет при наследовании.

    Например, если от интерфейса с методом унаследовать второй интерфейс и в нем объявить этот же метод, но без реализации, то реализация из первого метода до класса не дойдет.

    Могут ли в языке Java у абстрактного класса быть конструкторы?


    Да, в абстрактном классе в Java можно объявить и определить конструкторы. Поскольку создавать экземпляры абстрактных классов нельзя, вызвать такой конструктор можно только при формировании цепочки конструкторов, то есть при создании экземпляра конкретного класса-реализации.
    его всё равно можно использовать для задания начальных значений общих переменных, объявленных в абстрактном классе и используемых различными реализациями.

    Контракт метода - это сигнатура метода в сочетании с типом возвращаемого значения и бросаемыми исключениями.

    Неизменность String - Прежде всего, вы можете видеть, что класс String использует модификатор final, указывая на то, что класс String не наследуется. Если посмотреть на модификатор значения, используется private, а метод setter не предоставляется. Следовательно, значение не может быть изменено за пределами класса String


    написать администратору сайта