Главная страница

Ревю по 3 модулю. Ревю по 3 модулю 1 что такое ооп


Скачать 65.01 Kb.
НазваниеРевю по 3 модулю 1 что такое ооп
Анкорcore 3module
Дата05.02.2023
Размер65.01 Kb.
Формат файлаdocx
Имя файлаРевю по 3 модулю.docx
ТипДокументы
#921400

Ревю по 3 модулю

1) что такое ООП.

2) принципы ООП

3) Модификаторы доступа

4) Указатели this и super.

5) Модификатор static

6) Наследование и реализация.

7) Интерфейсы.

8) Анонимные классы.

9) Класс Object и класс Class.

10) Контракт между  equals() и hashCode().

Что такое ООП? В чем его плюсы?
это способ(метод) программирования, основанный на представлении программы в виде совокупности объектов, каждый из которых является экземпляром отдельного класса, а классы образуют иерархию наследования
Основные принципы ООП:

Абстракция - выделение наиболее важных характеристик и информации об объекте.

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

Полиморфизм – это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта.
Что такое полиморфизм? Приведите пример полиморфизма?

1. это возможность применения одноименных методов с одинаковыми или различными наборами параметров в одном классе или в группе классов, связанных наследованием

2. это свойство системы использовать объекты с одинаковым интерфейсом без информации о типе и внутренней структуре объекта

Что такое Наследование, композиция, агрегирование
Наследование -свойство системы позволяющее описать новый класс на основе уже существующего с частично или полностью заимствующейся функциональностью (extends, полиморфизм)



Что такое инкапсуляция? Приведите пример инкапсуляции?
это механизм обертывания данных (поля) и методов в одно целое, в классы инкапсуляции переменные класса будут сокрыты от других классов. доступ же к ним будет через методы этого класса (гетеры и сеттеры)

разберитесь обязательно чем отличается параметрический полиморфизм от ad-hoc.

Ad hoc полиморфизм — несколько объявлений функции с одинаковым именем но с отличающимися параметрами, пример:

function test (string $a, string $b)

{ return $a . $b; }

function test (int $a, int $b)

{ return $a + $b; }

Параметрический полиморфизм — когда будет выполнятся одна и та же функция вне зависимости от типов аргументов.

function test (string $a, string $b)

{ return $a . $b; }

function test (int $a, int $b)

{ return $a + $b; }

Конструкторы

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

Будет ли в классе конструктор и какой, если при его создании ни один не был задан?
Будет конструктор по умолчанию, даже если его не написать, компилятор сам создаст конструктор по умолчанию

Зачем this в конструкторе абстрактного класса?
Абстрактный клас может расширяться неабстрактным классом, который унаследует его методы и свойства. И вот тогда пригодится конструктор.

Будет ли создан автоматически конструктор по-умолчанию, если в созданном классе есть любой другой конструктор?

Нет! Если класс содержит реализацию хотя бы одного конструктора с параметрами, то, чтобы объявить конструктор по умолчанию, его нужно объявлять в классе явным образом.

Можно ли в классе вызвать один конструктор из другого? Как это сделать?
Можно. При помощи ключевого слова this() в скобках указываются параметры вызывающего конструктора. Также можно вызвать конструктор родительского класса при помощи super()

ENUM

Перечислите методы именно класса Enum?
методы:- ordinal() - индекс

константы- values() - массив констант-

valueOf() - возвращает элемент перечисления с названием в скобках

name()

Метод values()-Автоматически предопределённый метод для перечисления values() возвращает массив, содержащий список констант перечисления.



Метод valueOf(String string)-Автоматически предопределённый метод для перечисления valueOf() возвращает константу перечисления, значение которой соответствует строке, переданной в параметре.



Метод ordinal()-У перечислений есть несколько удобных методов. Например, вы можете получить значение, которое указывает позицию константы в списке констант перечисления (порядковое значение или ordinal value), с помощью метода ordinal(). Порядковые значения начинаются с нуля.

Методы compareTo() и equals()-Также можно сравнивать порядковые значения констант одного и того же перечисления с помощью метода compareTo(). Или сравнить на эквивалентность через метод equals().
Может ли Enum имплементировать интерфейсы?

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

Может ли Enum наследовать (extends) класс? Почему?

Поскольку Enum уже наследуется от абстрактного класса java.lang.Enum, понятно, что другой класс наследовать не удастся, поскольку Java не поддерживает множественное наследование классов. Благодаря наследованию от java.lang.Enum, все перечисления имеют методы

:- ordinal() - индекс константы

- values() - массив констант

- valueOf() - возвращает элемент перечисления с названием в скобках

Память

В какой области памяти хранятся примитивы?

хранятся в стэке

В какой области памяти хранятся объекты?

в куче HEAP
Где хранятся ссылки на объект?

хранятся в стэке.

Интерфейсы

Синтаксические отличия интерфейса от абстрактного класса (АК)? 5 отличий

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

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

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

Можно ли создать поля в интерфейсе?

Интерфейс может содержать поля, но они автоматически являются статическими (static) и неизменными (final). Все методы и переменные неявно объявляются как public. Класс, который собирается использовать определённый интерфейс, использует ключевое слово implements.

Какие методы в интерфейсе могут иметь реализацию?

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

сколько максимум можно имплементировать интерфейсов ? =)

65535
Что такое интерфейс? Когда использовать интерфейс?

Механизм наследования очень удобен, но он имеет свои ограничения. В частности мы можем наследовать только от одного класса, в отличие, например, от языка С++, где имеется множественное наследование.

В языке Java подобную проблему частично позволяют решить интерфейсы. Интерфейсы определяют некоторый функционал, не имеющий конкретной реализации, который затем реализуют классы, применяющие эти интерфейсы. И один класс может применить множество интерфейсов.

Какие модификаторы доступа можно использовать в интерфейсе и абстрактом классе?
Модификаторы доступа для абстрактных классов могут быть любыми
Можно ли создавать статик методы в интерфейсах?зачем статик методы в интерфейсе
Мы можем использовать статические методы интерфейса, чтобы не создавать вспомогательные классы, то есть переместить все статические методы в соответствующий интерфейс. Такой метод легко использовать и быстро находить.

Как написать валидный код, который скомпилируется, в котором вы имплементите интерфейс в класс и не реализуете в классе ни один из методов интерфейса, хотя все методы интерфейса абстрактные?
Просто объявить класс, который имплементит интерфейс, абстрактным.
NATIVE

ключевое слово NATIVE

Если в процессе реализации Jаvа-проекта возникает необходимость в применении существующего кода, написанного на другом языке программирования, или использовании низкоуровневых функций для непосредственного обращения к компьютерной аппаратуре, существует возможность прибегнуть к так называемым методам native, которые могут быть вызваны из среды приложения Java, но создаются на одном из "родственных" (native) языков – как правило, С или С++. Nаtivе-методы объявляются посредством модификатора native. Тело метода реализуется на другом языке и поэтому в объявлении заменяется символом точки с запятой. Ниже в качестве примера приведено объявление метода, который обращается к операционной системе за информацией об идентификационном номере процессора хост-компьютера.

Что такое нативные методы, их плюсы и минусы

методы написанные на других языках.

Минусы: При обращении к методам native свойства переносимости и безопасности, присущие коду Java, будут утрачены.

Плюсы: закрывает потребности: использование низкоуровневых функций для обращения к аппаратуре( к памяти ) выполнить какие то задачи, которые проще выполнить на низкоуровневом языке

МЕТОДЫ

Что можно делать при переопределении метода, а что нельзя?

У переопределенного метода должны быть те же аргументы, что и у метода родителя.

У переопределенного метода должен быть тот же тип возвращаемого значения, что и у метода родителя.

Модификатор доступа у переопределенного метода также не может отличаться от «оригинального»:

Можно ли использовать статические методы в обычных? Наоборот? Почему?
Статический метод можно использовать в обычном а обычный метод в статическом использовать нельзя не имея ссылки на конкретный экземпляр класса
Переопределение метода.
Изменение реализации уже существующего в суперклассе метода (override). В новом методе должны быть те же сигнатура и тип возвращаемого результата, что и у метода родительского класса

Ковариантность типа возвращаемого значения?

То, что позволяет типу возвращаемого значения быть подтипом типа переопределенного метода
Что будет если передать массив в метод, который изменит его значения, изменятся ли они вне метода? Почему? А если передать примитив?
массив - это объект, находящийся в куче(она же хип), который может хранить данные, например примитивы. Передавая массив(объект) в метод, мы получаем копию ссылки, по ссылке мы можем изменить состояние объекта в хипе, но не можем поменять саму ссылку. При передаче в метод примитива, у нас создаётся копия, ты можешь крутить и менять её значение внутри метода как угодно, но на само значение это никак ни повлияет.
Указатели this и super.

Похожи:

1. this и super - это нестатические переменные их нельзя использовать в статическом контексте.

2. this и super могут использоваться внутри конструкторов для вызова других конструкторов по цепочке

3. Внутри конструктора this и super должны стоять выше всех других выражений, в начале

Отличия:

1.Переменная this ссылается на текущий экземпляр класса, в котором они используются. super на текущий экземпляр родительского класса

2. Каждый конструктор при отсутствии явных вызовов других конструкторов, неявно вызывается с помощью super().

Могут ли нестатические методы перегрузить статические?

Перегружать можно, переопределять нет. В случае со статическими методами это не переопределение (overriding), а сокрытие (hiding).

Статические методы принадлежат классу, а не экземпляру класса. Какой метод вызовется определяется на этапе компиляции, а не по ходу выполнения программы. Поэтому когда вы "переопределяете" статический метод, на самом деле вы создаете новый. По коду выше видно, что статические методы вызываются по типу ссылки, а не статические по типу объекта, на которые ссылки указывают.

Передача параметров в методы. По значению/по ссылке? Как передаются примитивы и объекты?

В джава в метод все передаётся по значению.

Вне зависимости от того, что передаëшь, примитив или объект.

Но у примитива метод просто копирует значение в свою локальную переменную, изначальная переменная никак не меняется.

А если передать методу ссылку, то он еë тоже скопирует

И скопированная ссылка будет тоже указывать но тот же объект

И объект соответственно вне метода тоже меняется

Что такое контракт метода?

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

public String someAction (int x, String y) throws Exception — сигнатура

public String someAction (int x, String y) throws Exception — контракт.

Что такое сокрытие методов - "method hiding"?

Метод скрытия означает, что подкласс определяет метод класса с той же сигнатурой, что и метод класса в суперклассе. В этом случае метод суперкласса скрыт подклассом. Это означает, что: Версия метода, который выполняется, НЕ будет определяться объектом, который используется для вызова. Фактически он будет определяться типом ссылочной переменной, используемой для вызова метода

Можно ли использовать статические методы в обычных? Наоборот? Почему?

Статические методы можно использовать в обычных классах, потому что статический метод становится переменной класса

Не статические методы нельзя использовать в статических. Так как они принадлежат не классу а объекту

Может ли статический метод быть перегружен? Будет ли работать переопределение статического метода?

- может быть перегружен

- не будет. Класс потомок создаст свой статический метод не связанный с родительским классом

Может ли быть абстрактный класс без абстрактных методов?
Да, в абстрактном классе может не быть ни одного абстрактного метода. Сделать класс абстрактным в языке Java можно просто путем использования ключевого слова abstract при объявлении. Компилятор обеспечит выполнение всех структурных ограничений, например, запрета на создание экземпляров этого класса.
Что такое нативные методы, их плюсы и минусы?

Нативные методы - это методы написанные на других языках (более низкого уровня), таких как С, С++, ассемблер.

Минусы: При обращении к методам native свойства переносимости и безопасности, присущие коду Java, будут утрачены. Практически невозможно использовать методы native в Jаvа-коде, который предназначен для загрузки из Internet или выполнения на удаленных компьютерах сети (примером являются апплеты). Не исключено, что работать с вашим кодом придется системе совершенно другой архитектуры, но если даже это и не так, система может просто запретить выполнение кода, не вызывающего доверия.

Плюсы: закрывает потребности: использование низкоуровневых функций для обращения к аппаратуре( к памяти ) выполнить какие то задачи, которые проще выполнить на низкоуровневом языке

Пример это hashCode(). Используется нативный метод потому что C++ имеет доступ к памяти.

ДАННЫЕ

Как реализовать свой Immutable тип данных?

1)Должен быть объявлен как final, чтобы от него нельзя было наследоваться. Иначе дочерние классы могут нарушить иммутабельность.

2)Все поля класса должны быть приватными в соответствии с принципами инкапсуляции.

3)Для корректного создания экземпляра в нем должны быть параметризованные конструкторы, через которые осуществляется первоначальная инициализация полей класса.

4)Для исключения возможности изменения состояния после инстанцирования, в классе не должно быть сеттеров.

5)Для полей-коллекций необходимо делать глубокие копии, чтобы гарантировать их неизменность.

Что такое позднее и раннее связывание?

Раннее связывание – связанное с формированием кода на этапе компиляции. При раннем связывании, программный код формируется на основе известной информации о типе (класс) ссылки. Как правило, это ссылка на базовый класс в иерархии классов.

Позднее связывание – связанное с формированием кода на этапе выполнения. Если в иерархии классов встречается цепочка виртуальных методов (с помощью слов virtual, override), то компилятор строит так называемое позднее связывание. При позднем связывании вызов метода происходит на основании типа объекта, а не типа ссылки на базовый класс. Позднее связывание используется, если нужно реализовать полиморфизм.

Что такое varargs? Какие есть ограничения при написании?

Varargs — это аргументы переменной длины: фича, которая появилась еще в JDK5. Varargs позволяют нам создавать методы с произвольным количеством аргументов.

Vararg аргумент должен быть последним в списке аргументов метода:

Аргумент произвольной длины может быть указан только как аргумент некоторого метода

Перечислите все модификаторы доступа в порядке уменьшения закрытости, какую область видимости они имеют?

private: закрытый класс или член класса, противоположность модификатору public. Закрытый класс или член класса доступен только из кода в том же классе.

Модификатор по умолчанию. Отсутствие модификатора у поля или метода класса предполагает применение к нему модификатора по умолчанию. Такие поля или методы видны всем классам в текущем пакете.

protected: такой класс или член класса доступен из любого места в текущем классе или пакете или в производных классах, даже если они находятся в других пакетах

public: публичный, общедоступный класс или член класса. Поля и методы, объявленные с модификатором public, видны другим классам из текущего пакета и из внешних пакетов.

Для чего нужна аннотация Overide

Переопределение(override) - метод с другим функционалом (в классе наследнике от класса родителя)

Перегрузка(overload) - метод с тем же именем, но с разными типами и разными параметрами (в своем классе)

В чем разница между передачей параметров по ссылке или по значению ?

Передача параметра по значению – это копирование значения в переменную-параметр метода. По ссылке – передача ссылки, то есть по сути использование той же самой переменной.

Модификатор static

static (метод и поле)-

говорит о том что метод или поле класса принадлежат не объекту а самому классу

static class -

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

Что такое final? Что может быть final? Как они работают?

Для класса это означает, что класс не сможет иметь подклассов, т.е. запрещено наследование. Это полезно при создании immutable (неизменяемых) объектов, например, класс String объявлен, как final.

к абстрактным классам , нельзя применить модификатор final, т.к. это взаимоисключающие понятия.

Для метода final означает, что он не может быть переопределен в подклассах. Это полезно, когда мы хотим, чтобы исходную реализацию нельзя было переопределить.

Для переменных примитивного типа это означает, что однажды присвоенное значение не может быть изменено.

Для ссылочных переменных это означает, что после присвоения объекта, нельзя изменить ссылку на данный объект. Это важно! Ссылку изменить нельзя, но состояние объекта изменять можно.

В чём разница между instanceOf и getClass?
Подходя к сути, ключевое различие между ними заключается в том, что getClass() возвращает true только в том случае, если объект на самом деле является экземпляром указанного класса, но оператор instanceof может возвращать true, даже если объект является подклассом указанного класса или интерфейса в Ява.

Абстрактный класс:


Может ли быть абстрактный класс без абстрактных методов?
Может
Может ли быть конструктор у абстрактного класса? Для чего?
Может. Абстрактные конструкторы часто используются для обеспечения соблюдения ограничений или инвариантов класса, таких как минимальное количество полей, необходимых для настройки класса.
Какие модификаторы доступа можно использовать в интерфейсе и абстрактом классе?
Модификаторы доступа для абстрактных классов могут быть любыми
Как сделать из обычного класса абстрактный класс не используя ключевое слово abstract?
Объявить класс с приватным конструктором. То есть объект этого класса нельзя будет создать. Логично :)

EQUALS и HASH CODE:


контракт между equals hashcode

Если объекты равны по equals() то их хеш-коды тоже равны

Если хеш-коды разные, то по equals() будет точно - falseЕсли объекты не равны по equals(), их хеш-коды могут быть равны

А если хеш-коды равны. Объекты могут быть равны, а могут и не равняться

Какой тип данных у hashcode? Может ли быть hashcode отрицательным?

int Метод hashCode() должен возвращать целочисленное значение, которое может быть отрицательным

Из-за чего происходят коллизии? Почему нельзя написать hashcode гарантировано без коллизий?

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

Хеш код в java создается методом

public int hashCode()

У integer диапазон от -2147483648 до 2147483647, т.е. округлив получаем 4 миллиарда разных целых чисел.

А теперь представим ситуацию, у вас 8-10 миллиардов объектов. Вопрос: как каждому из них дать уникальный хеш код используя диапазон в 4 миллиарда?

STRING


Как реализована неизменность String?
String - это ссылочный тип, который при создании экземпляра записывает строку в свое поле charов value, которое имеет модификатор доспупа private и модификатор final, то есть объект однажды создается и больше не изменяется

Классы:



Класс Object, все методы кроме wait, notify, notifyAll, назвать и объяснить, как работают

1)protected Object clone() - создает новый объект, не отличающийся от клонируемого.

2)public boolean equals(Object obj) - определяет, равен ли один объект другому.

3)protected void finalize() - вызывается перед удалением неиспользуемого объекта.

4)public final Class getClass() - получает класс объекта во время выполнения.

5)public int hashCode() - возвращает хэш-код, связанный с вызывающим объектом.

6)public String toString() - возвращает символьную строку, описывающую объект.

Какие модификаторы доступа бывают у классов ?

Public private protected Модификатор по умолчанию

Класс Object и класс Class.

В Java почти все сущности являются объектами, за исключением примитивных типов. У каждого объекта есть класс. Сами классы тоже является объектами, и они принадлежат классу Class.

У класса Class нет публичных конструкторов. Class - это generic тип. Методы Class предназначены для получения информации о классе (объекте типа Class). Например, можно узнать полное имя класса, какие у него аннотации, какие конструкторы и т.п. Эти методы нужны для reflection. С помощью reflection вы можете создавать объекты, которые принадлежат этому классу, и при этом заранее класс объекта вы можете не знать.

Существуют библиотеки, которые позволяют создавать объекты типа Class "на лету", т.е. вы можете создать новый класс прямо во время работы программы и так же можете изменить существующий класс.


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