3 ООП теори третий модуль. Enum зачем enum
Скачать 33.35 Kb.
|
--- ENUM--- Зачем ENUM? Тип перечисления. Создает новый определенный тип - группу значений. Поскольку Enum уже наследуется от абстрактного класса java.lang.Enum, понятно, что другой класс наследовать не удастся, поскольку Java не поддерживает множественное наследование классов. Методы класса ENUM name() - возвращает имя. ordinal() - возвращает порядковый номер(индекс константы). values() - массив констант. valueOf() - возвращает элемент перечисления с названием в скобках. Может ли ENUM наследовать класс? Нет. Может ли ENUM имплементрировать интерфейсы? Да, может. --- Данные--- Как реализовать свой Immutable тип данных? Сделайте класс окончательным сделайте все члены окончательными, установите их явно, в статическом блоке или в конструкторе Сделать всех участников закрытыми Нет методов, изменяющих состояние Как реализована неизменность String? String - это ссылочный тип, который при создании экземпляра записывает строку в свое поле charов value, которое имеет модификатор доступа private и модификатор final, то есть объект однажды создается и больше не изменяется. Имеет: public final class String private int hash; private final char value[] и так далее. Где хранятся ссылки на объект? Stack В какой области памяти хранятся примитивы? Stack В какой области памяти хранятся объекты? Heap Что такое позднее и раннее связывание? Статическое связывание (ранее) происходит во время компиляции, а динамическое (позднее) – во время выполнения. Поскольку статическое связывание происходит на ранней стадии жизненного цикла программы, его называют ранним связыванием. Аналогично, динамическое связывание называют также поздним связыванием, поскольку оно происходит позже, во время работы программы. Статическое связывание используется в языке Java для разрешения перегруженных методов, в то время как динамическое связывание используется в языке Java для разрешения переопределенных методов. Аналогично, приватные, статические и терминальные методы разрешаются при помощи статического связывания, поскольку их нельзя переопределять, а все виртуальные методы разрешаются при помощи динамического связывания. В случае статического связывания используются не конкретные объекты, а информация о типе, то есть для обнаружения нужного метода используется тип ссылочной переменной. С другой стороны, при динамическом связывании для нахождения нужного метода в Java используется конкретный объект. Сокращенно: Можно понять из названия, статическое связывание носит более статический характер, так как происходит во время компиляции, то есть код «знает», какой метод вызывать после компиляции исходного кода на Java в файлы классов. А поскольку это относится к ранней стадии жизненного цикла программы, то называется также ранним связыванием (early binding). С другой стороны, динамическое связывание происходит во время выполнения, после запуска программы виртуальной машиной Java. В этом случае то, какой метод вызвать, определяется конкретным объектом, так что в момент компиляции информация недоступна, ведь объекты создаются во время выполнения. А поскольку это происходит на поздней стадии жизненного цикла программы, то называется в языке Java поздним связыванием (late binding). Что такое varargs? Какие есть ограничения при написании? Varargs — это аргументы переменной длины. Varargs — или Variable Arguments — это технология, которая позволяет создавать методы с произвольным количеством аргументов. Правило 1. Vararg аргумент (или же аргумент переменной/произвольной длины) обозначается через троеточие : String... words Правило 2. Аргумент произвольной длины может быть указан только как аргумент некоторого метода: void print(String... words) Правило 3. Каждый такой аргумент переменной длины в теле метода является массивом. Правило 4. Vararg аргумент должен быть последним в списке аргументов метода. Правило 5. Несмотря на то, что varargs являются массивами, при вызове метода, который принимает аргументы переменной длины, не обязательно создавать массив. Достаточно и даже желательно просто перечислить необходимые аргументы через запятую Передача параметров по ссылке или по значению? Как передаются объекты в метод? В чём разница? Передача по значению (by value). Значения фактических параметров копируются. Вызываемый метод создает свою копию значений аргументов и затем ее использует. Поскольку работа ведется с копией, на исходный параметр это никак не влияет. Передача по ссылке (by reference). Параметры передаются как ссылка (адрес) на исходную переменную. Вызываемый метод не создает свою копию, а ссылается на исходное значение. Следовательно, изменения, сделанные в вызываемом методе, также будут отражены в исходном значении. Что будет если передать массив в метод, который изменит его значения, изменятся ли они вне метода? Почему? А если передать примитив? В джава в метод все передаётся по значению. Вне зависимости от того, что передаëшь, примитив или объект. Но у примитива метод просто копирует значение в свою локальную переменную, изначальная переменная никак не меняется. А если передать методу ссылку, то он еë тоже скопирует И скопированная ссылка будет тоже указывать но тот же объект И объект соответственно вне метода тоже меняется JDK, JVM, JRE JDK (Java Development Kit) - комплект разработчика приложений на языке Java, включающий в себя компилятор, стандартные библиотеки классов Java, примеры, документацию, различные утилиты и исполнительную систему JRE. JRE (Java Runtime Environment) - минимальная реализация виртуальной машины, необходимая для исполнения Java приложений, без компилятора и других средств разработки. Состоит из виртуальной машины и библиотек Java классов. JVM (Java Virtual Machine) - виртуальная машина Java - основная часть исполняющей системы Java, так называемой Java Runtime Environment (JRE). Виртуальная машина Java исполняет байт-код Java, предварительно созданный из исходного текста Java-программы компилятором Java (javac). JVM обеспечивает платформо-независимый способ выполнения кода. Программисты могут писать код не задумываясь, как и где он будет выполняться. --- ООП--- Что такое ООП? В чём его плюсы? Объектно-ориентированное программирование – это методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определенного класса, а классы образуют иерархию наследования. ООП более эффективно организует структуру программ, в том числе больших. ООП упрощает обслуживание и модернизацию старого кода. + Java — язык высокого уровня с простым синтаксисом и плавной кривой обучения. Java — это язык высокого уровня, то есть он похож на человеческий язык. Принципы ООП. Инкапсуляция, наследование, полиморфизм. Что такое инкапсуляция? Приведите пример инкапсуляции? Инкапсуляция - это механизм обертывания данных (поля) и методов в одно целое, в класс в инкапсуляции переменные класса будут сокрыты от других классов. Доступ же к ним будет через методы этого класса (гетеры и сеттеры) Что такое наследование? Наследование - это свойство системы позволяющее описать новый класс на основе уже существующего с частично или полностью взаимствующейся функциональностью. (extends, полиморфизм) Что такое полиморфизм? Приведите пример полиморфизма? 1. это возможность применения одноименных методов с одинаковыми или различными наборами параметров в одном классе или в группе классов, связанных наследованием. 2. это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта. Что такое композиция? Композиция— более строгий тип связи. При использовании композиции объект не только является частью какого-то объекта, но и не может принадлежать другому объекту того же типа. Что такое агрегирование? Агрегация — отношение когда один объект является частью другого. Что такое конструктор? Это специальный метод который вызывается во время создания объекта. Конструктор инициализирует объект во время создания. Имеют имя класса. Конструктор с параметрами принимает на вход параметры необходимые для инициализации полей Конструктор копирования принимает в качестве параметра объект класса Что такое конструктор по умолчанию? Конструктор по умолчанию - без параметров, вызываемый джавой без созданием его программистом Можно ли в классе вызвать один конструктор из другого? Как это сделать? Да, через this() или super() Что такое коллизия? Ситуация, когда у разных объектов одинаковые хеш-коды. Вероятность возникновения коллизии зависит от используемого алгоритма генерации хеш-кода. Ковариантность типа возвращаемого значения? Ковариантный возврат означает, что когда кто-то переопределяет метод, тип возвращаемого значения переопределяемого метода может быть подтипом возвращаемого типа переопределенного метода. --- Классы--- Что такое класс? Класс - это шаблон для создания объекта. Что такое объект? Объект - это экземпляр класса. Класс Object. все классы наследуются от класса Object. Все остальные классы, даже те, которые мы добавляем в свой проект, являются неявно производными от класса Object. Поэтому все типы и классы могут реализовать те методы, которые определены в классе Object. Все методы Object (кроме wait, notify, notifyAll). Метод toString() служит для получения представления данного объекта в виде строки. Метод hashCode() позволяет задать некоторое числовое значение, которое будет соответствовать данному объекту или его хэш-код. По данному числу, например, можно сравнивать объекты. Метод getClass() позволяет получить тип данного объекта. Метод equals() сравнивает два объекта на равенство. Метод сlone() создает и возвращает копию этого объекта. Метод finalyze() вызывается сборщиком мусора для объекта, когда сборщик мусора определяет, что на этот объект больше нет ссылок. Анонимные классы. Это вложенные классы которые не имеют имени и создаются во время инициализации объекта, наследуется от родительского класса. Временные классы. Временные классы используются для построения временных диаграмм, располагаются в пакете org.jfree.data.time библиотеки JFreeChart и включают Month, Week, Day, Hour, Minute, Second и Milisecond. Основой (родительским классом) временных классов является RegularTimePeriod, определяющий свойства и методы получения следующего и предыдущего значений, периода значений и т.д. Как классы располагаться в пакете? Область видимости всех классов? Модификаторы всех классов? public, protected, default, private. Вложенные классы Классы могут быть вложенными (nested), то есть могут быть определены внутри других классов. Частным случаем вложенных классов являются внутренние классы (inner class). Внутренний класс ведет себя как обычный класс за тем исключением, что его объекты могут быть созданы только внутри внешнего класса. Внутренний класс имеет доступ ко всем полям внешнего класса, в том числе закрытым с помощью модификатора private. Аналогично внешний класс имеет доступ ко всем членам внутреннего класса, в том числе к полям и методам с модификатором private. Ссылку на объект внешнего класса из внутреннего класса можно получить с помощью выражения Внешний_класс.this, например, Person.this. Объекты внутренних классов могут быть созданы только в том классе, в котором внутренние классы определены. В других внешних классах объекты внутреннего класса создать нельзя. Еще одной особенностью внутренних классов является то, что их можно объявить внутри любого контекста, в том числе внутри метода и даже в цикле. Статические вложенные классы Кроме внутренних классов также могут быть статические вложенные классы. Статические вложенные классы позволяют скрыть некоторую комплексную информацию внутри внешнего класса Instanceof vs getClass Оператор instanceof позволяет проверить, к какому классу принадлежит объект, с учётом наследования. Метод getClass метод возвращает объект класса Class, который описывает класс, от которого был порожден этот объект. --- Модификаторы--- Какие модификаторы доступа могут быть у класса? private, default, protected, public Перечислите все модификаторы доступа в порядке уменьшения закрытости, какую область видимости они имеют? public - доступ из любого класса и пакета; protected - доступ к компоненту из любых классов этого же пакета и классов наследников; default - доступ к компоненту из любых классов из этого же пакета; private (закрытый) - доступ к компоненту предоставляется только методам этого класса. Модификатор static. static (метод и поле) говорит о том что метод или поле класса принадлежат не объекту а самому классу Можно ли использовать статические методы в обычных? Наоборот? Почему? Статические методы можно использовать в обычных, так как этому ничего не препятствует. Не статические методы нельзя использовать в статических. Так как они принадлежат не классу а объекту --- Методы--- Что входит в сигнатуру метода? Название метода и аргументы. Переопределение метода. Переопределение(override) - метод с другим функционалом (в классе наследнике от класса родителя). Перегрузка. Перегрузка(overload) - метод с тем же именем, но с разными типами и разными параметрами (в своем классе). Что можно делать при переопределении метода, а что нельзя? При переопределения метода нельзя сузить модификатор доступа к методу (например с паблика к приватному), нельзя изменить тип возвращаемого значения, но можно сузить возвращаемое значение, если они совместимы. Для чего нужна аннотация Overide? Проверяет, переопределён ли метод. Вызывает ошибку компиляции / интерпретации, если метод не найден в родительском классе или интерфейсе. @Override - аннотация-маркер, которая может применяться только к методам. Метод, аннотированный как @Override, должен переопределять метод супер класса. @Override — проверяет, переопределён ли метод. Вызывает ошибку компиляции / интерпретации, если метод не найден в родительском классе или интерфейсе. Может ли статический метод быть перегружен? Да Будет ли работать переопределение статического метода? Нет. Т.к. переопределение подразумевает выполнение метода Б при вызове метода А, если Б переопределяет А. Статичный вызов точно определяет, какой именно метод будет выполнен. Другими словами, если в переопределенном методе напишем static то это уже будет создание нового метода, а не как не переопределения, так как static принадлежит самому классу, static не поддерживает наследование. final у метода? Для метода final означает, что он не может быть переопределен в подклассах --- Абстрактные классы--- Что такое абстрактный класс? Абстрактный класс - это класс, в объявлении которого есть ключевое слово abstract. Его отличие от обычного класса в том, что нельзя создать объект или экземпляр данного класса, а также методы в абстрактных классах не имеют тела. Ключевое значение в таких методах — необходимость их реализации в дочерних классах. Может ли быть конструктор у абстрактного класса? Для чего? Да, абстрактный класс всегда имеет конструктор. Если вы не определяете свой собственный конструктор, компилятор предоставит абстрактному классу конструктор по умолчанию. Вышесказанное справедливо для всех классов - вложенных, абстрактных, анонимных и т.д. Абстрактный класс (в отличие от интерфейса) может иметь конечные нестатические поля, которые нуждаются в инициализации. Может ли быть абстрактный класс без абстрактных методов? Да, в абстрактном классе может не быть ни одного абстрактного метода. Сделать класс абстрактным в языке Java можно просто путем использования ключевого слова abstract при объявлении. Указатели this и super. this - это ссылка на объект в текущем классе; super - это ссылка на объект в родительском классе; this() - вызов конструктор текущего класса; super() - вызов конструктор родительского класса. Синтаксические отличия интерфейса от абстрактного класса? Таблица 1
--- Интерфейсы--- Что такое интерфейс? Ссылочный тип схожий с классом. Имеет в себе абстрактные методы(с 8 java static и default), которые реализует класс потомок. Когда использовать интерфейс? Интерфейс помогает двум объектам понимать друг друга и обмениваться информацией. Можно ли создать поля в интерфейсе? Интерфейс не может содержать поля экземпляров. Поля, которые могут появиться в интерфейсе, обязаны быть объявлены и статическими, и final Какие методы в интерфейсе могут иметь реализацию? Все методы в интерфейсе абстрактные(с 8 java static и default). Можно ли создавать статик методы в интерфейсах? С 8 джавы можем. Синтаксические отличия интерфейса от абстрактного класса ? см Таблицу 1 --- equals/hasCode--- Перегрузка методов hashCode и equals : Метод еquals() используется для сравнения объектов, а hashCode - для генерации целочисленного кода объекта. Контракт между hashCode и equals Если объекты равны по результатам выполнения метода equals, тогда их hashcode должны быть одинаковыми. Если объекты не равны по результатам выполнения метода equals, тогда их hashcode могут быть как одинаковыми, так и разными. Однако для повышения производительности, лучше, чтобы разные объекты возвращали разные коды. Правила хэшкод (для одного и того же объекта и тд) Если два объекта равны (т.е. метод equals() возвращает true), у них должен быть одинаковый хэш-код. Иначе наши методы будут лишены смысла. Проверка по hashCode(), как мы и сказали, должна идти первой для повышения быстродействия. Если хэш-коды будут разными, проверка вернет false, хотя объекты на самом деле равны (согласно нашему определению в методе equals()). Если метод hashCode() вызывается несколько раз на одном и том же объекте, каждый раз он должен возвращать одно и то же число. Правило 1 не работает в обратную сторону. Одинаковый хэш-код может быть у двух разных объектов. Правила equals (симметричность и тд) Рефлексивность: Объект должен равняться себе самому. Симметричность: если a.equals(b) возвращает true, то b.equals(a) должен тоже вернуть true. Транзитивность: если a.equals(b) возвращает true и b.equals(c) тоже возвращает true, то c.equals(a) тоже должен возвращать true. Согласованность: повторный вызов метода equals() должен возвращать одно и тоже значение до тех пор, пока какое-либо значение свойств объекта не будет изменено. То есть, если два объекта равны в Java, то они будут равны пока их свойства остаются неизменными. Сравнение null: объект должны быть проверен на null. Если объект равен null, то метод должен вернуть false, а не NullPointerException. Например, a.equals(null) должен вернуть false. --- Native--- Что значит ключевое слово native? Native (от англ. native — родной, естественный, первичный) — это методы написанные на других языках (более низкого уровня), таких как С, С++, ассемблер. Что такое нативные методы, их плюсы и минусы? Минусы: При обращении к методам native свойства переносимости и безопасности, присущие коду Java, будут утрачены. Практически невозможно использовать методы native в Jаvа-коде, который предназначен для загрузки из Internet или выполнения на удаленных компьютерах сети (примером являются аплеты). Не исключено, что работать с вашим кодом придется системе совершенно другой архитектуры, но если даже это и не так, система может просто запретить выполнение кода, не вызывающего доверия. Плюсы: закрывает потребности: использование низкоуровневых функций для обращения к аппаратуре( к памяти ) выполнить какие то задачи, которые проще выполнить на низкоуровневом языке Пример это hashCode(). Используется нативный метод потому что C++ имеет доступ к памяти. --- Другое--- Лямбда выражение Основу лямбда-выражения составляет лямбда-оператор, который представляет стрелку ->. Этот оператор разделяет лямбда-выражение на две части: левая частьсодержит список параметров выражения, а правая собственно представляет тело лямбда-выражения, где выполняются все действия. Лямбда-выражение не выполняется само по себе, а образует реализацию метода, определенного в функциональном интерфейсе. При этом важно, что функциональный интерфейс должен содержать только один единственный метод без реализации. |