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

ВУЗ: Не указан

Категория: Не указан

Дисциплина: Не указана

Добавлен: 29.03.2024

Просмотров: 23

Скачиваний: 0

ВНИМАНИЕ! Если данный файл нарушает Ваши авторские права, то обязательно сообщите нам.
, что статические методы вызываются по типу ссылки, а не статические по типу объекта, на которые ссылки указывают.

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

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

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

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

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

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

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

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

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

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 "на лету", т.е. вы можете создать новый класс прямо во время работы программы и так же можете изменить существующий класс.