Примитивные типы данных в Java, их размерность и minmax значения
Скачать 0.99 Mb.
|
Примитивные типы данных в Java, их размерность и min/max значения. Целочисленных типов 4. Ещё 2 с плавающей точкой. 1 логический и 1 символьный. Byte – 8 бит (-128 - 127) в случае переполнения становится отрицательным числом. Short – 16 бит (-32.768 – 32.767) Int – 32 бит (-2.147.483.648 – 2.147.483.647) Long – 64 бит (-9.223.372.036.854.775.808L – 9.223.372.036.854.775.807L) Float – 32 бит (1.4e-45f – 3.4e+38F) Double – 64 бит (4.9e-324 – 1.7e+308) Boolean – 32 бит (true, false) основа применения swich\case, if\else и в cicles. При использовании в массивах занимает 8 БИТ. Char – 16 бит (0 – 65.536) целое число, символ UTF-16, при сложении двух char получится число При сложении двух byte получим int. При сложении char и shorn получим int Литералы (константы включаемые в текст программы) – значения переменных. Десятеричная система: 10 Шестнадцатеричная: 0x1F4, начинается с 0x Восьмеричная: 010 начинается с 0 Двоичная система: 0b101 начинается с 0b Для каждого примитивного типа есть обёртка (ссылочный тип данных). Обёртки являются не изменяемыми. Например String. Заданное значение изменить нельзя с помощью математических операций. String имеет pool строк. При создании и инициализации строки, JVM проверяет была ли ранее создана строка с таким литералом (значением), если была, то переменная ссылается на строку в pollе строк. Если не была, то создаёт новую строку и ссылается на неё. Если создать переменную и инициировать литерал через new String, то JVM не будет проверять наличие такого значения в памяти, просто создаст объект и будет на него ссылаться. Функция и Метод – одно и тоже. Отличие только в том, что функция называется функцией если находится вне класса. А функция называется методом, когда она находится внутри класса. Количество значений массива ограниченно Int – 32 бит (-2.147.483.648 – 2.147.483.647). Размерность (вложенность массива массивами) массива ограниченна 255. Рекурсия – функция или метод вызывают сами себя. Очень важно предусмотреть с помощью глобальной переменной выход из рекурсии иначе произойдёт переполнение стека, и программа завершится аварийно. Рекурсивные методы легче для понимания чем итеративные (циклы), но требуют больше ресурсов компьютера и памяти для выполнения задачи, потому что рекурсивные методы имеют глубину и начинают возвращать результаты с конца в начало. Приведение типов Неявное: можно проводить с byte – short, short – int, char – int, int – long, int – double, float - double. Неявное приведение типов отличается тем, что происходит без риска потери данных. Явное приведение типа сопровождаться потерей данных и должно осуществляться осмысленно. Можно потерять в точности при приведении числа с плавающей точкой в целочисленное. Так же сужающие преобразования целочисленных типов ведут к некорректным данным. Continue останавливает итерацию и переводит к следующей итерации. Break останавливает итерацию и выходит из цикла но метод в котором цикл был применён продолжит работу. Return завершает работу метода и возвращает результат работы метода. Логические типы
ВТОРОЕ РЕВЬЮ ПЕРЕМЕННАЯ И ПОЛЕ Локальная переменная инкапсулирована внутри метода или блока (например, в if или switch) поэтому не может быть использована снаружи метода или блока. Поле - переменная, привязанная к объекту (классу). Она может быть, использована любым методом, который находится внутри объекта (класса), в котором она объявлена (то есть этим же классом она инкапсулирована если для поля не выставлен публичный модификатор доступа). Классы состоят из полей и методов. Поле экземпляра это поле класса, но только с модификатором доступа PUBLIC. Если бы поле имело доступ STATIC то, тогда это будет поле класса, также как и PRIVAT. Входной параметр (иначе Аргумент) – это поле, которое мы передаём в метод или конструктор. Объекты названы классами, их свойства названы полями, а совершаемые действия с ними методами. Когда переносим эту абстракцию на сам язык программирования, то для полей используем переменные, а для методов функции. Контракт между equals() и hashCode() Иногда есть необходимость переопределить стандартные методы equals() и hashCode(). Переопределяются они вместе. Так как два объекта (экземпляра класса) отличаются, потому что находятся в разных областях памяти. Сравнивать их приходится по логическим признакам equals(). Два логически эквивалентных объекта, должны возвращать одинаковое значение хэш-функции hashCode(). Если переопределить только один из методов, то мы потеряем объект в недрах хэш-таблицы. Переопределённый метод equals() должен соответствовать правилам симметрии, транзитивности, согласованности, рефлективности и определённости. При переопределении equals() ни один из объектов не должен быть равен NULL. Сравнение двух объектов должно выдавать TRUE даже при перестановке мест. Для проверки в некоторых случаях можно использовать метод instanceof. Правила переопределения hashCode(). Хэш — это некоторое число, генерируемое на основе объекта и описывающее его состояние в какой-то момент времени. Это число используется в Java преимущественно в хэш-таблицах и нужно оно для минимизации вероятности появления коллизий, когда по разным ключам функция вернет одинаковое значение при условии, что поля объекта не изменялись. Если два объекта равны, то hashCode() должен вернуть одно и то же число, и соответственно разные числа если объекты не равны. МОДИФИКАТОРЫ ДОСТУПА Модификатор PRIVATE– ограничивает доступ к полям и методам, к ним могут обращаться только методы (Геттеры и Сеттеры) этого класса. Главная задача модификатора реализовать инкапсуляцию. Модификатор PROTECTED – тоже что и private, только доступ к полям и методам класса, получают все наследники класса, так же и в пределах всех классов, находящихся в том же пакете что и наш класс. Применяется этот модификатор редко и в специфичных случаях. Модификатор DEFAULT (или packagevisible) установлен модификатором по умолчанию. Зона видимости только внутри пакета. В других пакетах к полям, методам и классам с этим модификатором доступа нет. Модификатор PUBLIC – к атрибуту может получить доступ любой желающий. Создан чтобы отдавать что-то пользователям. (часть интерфейса, даём в руки пульт от нашей программы.) Как правильно выбрать модификатор доступа? В простейшем случае так: если метод должен быть доступен внешнему коду, выбираем public. В противном случае — private. Если есть наследование, то может потребоваться protected в случае, когда метод не должен вызываться снаружи, но должен вызываться потомками. Модификатор STATIC связан с классом. Если поле или метод класса static, то они принадлежат классу (чертежу) и обратиться к ним можно так: Class.method or Class.field. Этот модификатор применяется к полю, методу (тогда параметры могут быть только static), блоку или внутреннему классу и указывает на привязку субъекта к текущему классу. Если переменная или метод не static, то у каждого нового объекта будет свое значение для этой переменной (разная максимальная скорость у разных автомобилей). А если рассматривается только одна модель автомобиля конкретной марки, то тогда необходимо делать максимальную скорость автомобилей static. Static методы нельзя переопределять в дочерних классах потому что они принадлежат родителю (чертежу) и формируют его основу. Модификатор FINAL применяется к классам (кроме абстрактных), полям класса и методам (и его аргументам). Для класса это означает что ему запрещено иметь наследников (пример класс String). Методы с FINAL не могут быть переопределены в классе наследнике. Значение полей и переменных примитивного типа с FINAL изменить нельзя (константа). FINAL для ссылочных полей и переменных содержащих адрес к назначенному объекту, нельзя изменить ссылку, но значение объекта на который указывает эта ссылка изменить можно. ПАМЯТЬ (Stack (Стек) и Heap (Куча)) – основные отличия друг от друга в том, что объекты в Куче доступны из любой точки программы и память живёт с самого начала до конца программы, а Стековая память не может быть доступна для других потоков и существует лишь какое-то время работы программы. Объём памяти в Куче, больше чем в Стеке, но Стековая память работает намного быстрее чем память Кучи. (Из-за управления памятью LIFO – Первый пришёл, первый ушёл.) Примитивы и ссылки на объекты хранятся в Стеке, а объекты в Куче! МАССИВЫ[] В Java массивы и строки в методы передаются по копии ссылки на объект(массив). Примитивные типы данных вроде int, long, char и т.д. передаются в метод по копии значения. Если у отработавшего метода в параметрах был примитив, то копия значения удаляется и изменения оригинального примитива не происходят. А ВОТ У МАССИВА происходят, так как ты передаёшь в метод ссылку на массив (даёшь методу пульт управления, пощёлкал кнопки, а потом уничтожил пульт, но значения в массиве уже поменялись). Что бы этого не произошло, нужно сначала создать копию массива (не путать с копией ссылки на массив) а затем копию передать методу в качестве параметра. Сделать это можно так: int[] newArray = Arrays.copyOf(test, test.length); МЕТОДЫ, НАТИВНЫЕ МЕТОДЫ. Статические методы не могут быть переопределены, но могут быть перегружены НАТИВНЫЕ МЕТОДЫ (NATIVE) - методы используются для взаимодействия с системными вызовами или библиотеками, написанными на других языках программирования. Нативные методы позволяют вам использовать код из других языков, таких как C или C ++, в Java-коде, нативный метод не запускается в JVM. Используется, когда Java не даёт нужной функциональности. Например, я пишу программу для вычисления какого-либо сложного уравнения и построения его линейного графика, я бы использовал для этого нативный метод, потому что C++ намного быстрее, чем Java. Также, скажем, я хочу взаимодействовать с другой программой или устройством. Для этого используется нативный метод, потому что в C++ есть что-то, называемое указателями, что позволило бы мне наладить взаимодействие с устройством. ENUM – ПЕРЕЧИСЛЕНИЕ – набор констант. Могут использоваться в классах для хранения данных. Объявляется вне класса. Можно присвоить полю или конструктору класса. ENUM имеет статический метод values() и он возвращает массив всех его констант. Метод ordinal() возвращает ключи этого массива (начинается, как и обычный массив с нуля). ValueOf ENUM как и обычный класс может иметь конструкторы (по умолчанию private), поля и методы (можно юзать для отдельных констант). ENUM использует 2 интерфейса (Comparable, Serializable), но не может наследоваться, потому что он уже унаследован от абстрактного класса lang.Enum ПАРАДИГМА ООП — это набор взаимодействующих между собой объектами. У каждого объекта есть тип — в ООП он называется классом. Классы можно объявлять или наследовать и создавать из них экземпляры. Собственно, объект — это и есть экземпляр класса. Основные задачи ООП — структурировать код, повысить его читабельность и ускорить понимание логики программы. Косвенно, повышается безопасность кода и сокращается его дублирование. ПАРАДИГМА ПРОЦЕДУРНОЕ программирование — это последовательность команд, которые следует выполнить (например, компьютер, не запустится без оперативной памяти, потому что будет нарушена процедура). ООП не даёт преимуществ при написании одностраничников или простых программ, с этим легко справится ПРОЦЕДУРНЫЙ стиль и его код будет работать быстрее чем код, написанный на ООП. ООП подойдёт при написании крупной онлайн игры или фотошопа, потому что такой код легче читать и дорабатывать. Потери в производительности здесь вполне оправданны. КЛАССЫ И ОБЪЕКТЫ КЛАСС – это шаблон, чертёж, описание Объекта. Например: человек – это шаблон (класс), обладающий свойствами (руки, ноги, голова, волосы и т.д.) Телом класса называются его поля и методы. ОБЪЕКТ – это экземпляр класса. Человеков может быть много, и они отличаются друг от друга (цвет волос, пол, длина члена, рост, вес). Объект имеет две характеристики. СОСТОЯНИЕ – данные внутри объекта (для их хранения используются поля класса). ПОВЕДЕНИЕ – действия, которые может совершать объект (Для определения поведения применяются методы класса). Объекты можно разделить на 2 типа: ⓵ те, которые одновременно могут быть частью только одного объекта; ⓶ и те, которые одновременно могут быть частью любого количества объектов. Пример: ⓵ 1 двигатель автомобиля одновременно может быть частью только одной машины. 1 двигатель не может быть одновременно в двух машинах; ⓶ студент одновременно, может быть, частью любого количества студенческих групп. Так вот первый вариант называется в Java КОМПОЗИЦИЯ, а второй ─ АГРЕГАЦИЯ ▻ В случае с композицией достаточно будет унаследоваться от абстрактного класса (так как класс может унаследоваться только от 1 класса, а нам в данном случае больше и не надо). ▻ В случае с агрегацией подойдёт наследование от любого количества интерфейсов.» КЛАССЫ БЫВАЮТ ВНУТРЕННИМИ, ВЛОЖЕННЫМИ (static) Внутренние классы — это классы для выделения в программе некой сущности, которая неразрывно связана с другой сущностью. Руль, сиденье, педали — это составные части велосипеда. Отдельно от велосипеда они не имеют смысла. Внутренний класс — это обычный класс, только вложенный внутрь другого класса (можно запихнуть даже в метод или цикл). Объекты могут быть созданы только внутри внешнего класса. Внутренний класс имеет доступ ко всем полям внешнего класса (даже к private полям), в свою очередь, внешний класс имеет доступ к полям и методам внутреннего класса. Внутренний класс с модификатором static не будет унаследован вместе с внешним классом. Внутренний класс делится на ЛОКАЛЬНЫЕ и АНОНИМНЫЕ классы. ЛОКАЛЬНЫЕ объявляются внутри метода или блока кода внешнего класса. Объект локального класса не может создаваться за пределами метода или блока, в котором его объявили. Локальный класс может получить доступ к локальной переменной или параметру метода, только если они объявлены в методе как final или Effective-final. У локального класса, как и у внутреннего, есть доступ ко всем (даже приватным) полям и методам внешнего класса: и к статическим, и к нестатическим. АНОНИМНЫЙ класс создаётся (автоматически) при попытке создать объект интерфейса или абстрактного класса. Отличительная особенность заключается в том, что при создании объекта интерфейса, нужно реализовать его методы. Поэтому A b = new A() {//метод интерфейса}; добавляются скобки и точка с запятой. Анонимный класс применяется, если нужен локальный класс для одноразового использования. Анонимный класс — это полноценный внутренний класс. Поэтому у него есть доступ к переменным внешнего класса, в том числе к статическим и приватным: АБСТРАКТНЫЕ КЛАССЫ – это общий набор свойств и поведений для группы объектов. Это класс, у которого не реализован один или больше методов (можно реализовать все методы, но тогда зачем называть класс абстрактным?). Абстрактный класс применяется, когда нужно семейство классов, у которых есть много общего. Конечно, можно применить и интерфейс, но тогда нужно будет писать много идентичного кода. Отличаются от обычных классов тем, что создать их объект нельзя. Несмотря на невозможность создавать объекты этого класса, всё равно можно задать начальные значения для общих полей, объявленных в этом абстрактном классе. В абстрактном классе могут быть объявлены и определены конструкторы. Если этого не сделать, то как и в обычном классе, автоматически будет создан конструктор без аргументов. Методы у них могут быть static(редко) и другие, не только абстрактные. Не могут быть public, protected и default. Может наследоваться и от интерфейсов, и от абстрактного класса. В случае с КОМПОЗИЦИЕЙ (двигатель автомобиля) будет достаточно унаследоваться от абстрактного класса. ИНТЕРФЕЙСЫ ИНТЕРФЕЙС говорят о том, как должен работать объект. Он описывает поведение всех реализующих его объектов. Например, один класс хочет дать другому возможность доступа к некоторым своим методам, но не хочет себя «раскрывать». Поэтому он просто реализует интерфейс. Интерфейс, может быть, только PUBLIC и имеет возможность создавать методы “по умолчанию” (в том числе Статические), для того чтобы не писать кучу одинаковых методов в классах, при этом методы “по умолчанию” доступны в каждом классе которые его имплементируют и их можно переопределять @Override. Интерфейс может наследоваться только от интерфейса. В случае с АГРЕГАЦИЕЙ (студент посещает студенческие группы) подойдёт наследование от любого количества интерфейсов.» ОТЛИЧИЕ АБСТРАКТНЫХ КЛАССОВ ОТ ИНТЕРФЕЙСОВ – основное, у интерфейсов нет состояний. ПАРАДИГМЫ ООП ИНКАПСУЛЯЦИЯ1 (Размещение в оболочке) – Позволяет ограничить доступ одних компонентов программы от других, с целью обеспечить целостность данных и защитить от некорректного использования. Например, умная микроволновка, автоматически блокирующая питание при перепадах тока в сети, или работа двигателя автомобиля, человеку не обязательно знать его внутреннее устройство чтобы ехать. Человеку не нужно понимать как устроен Гугл, для того чтобы им пользоваться. При работе над большим проектом, где участвуют много программистов без инкапсуляции ничего путного, не напишешь. Это как делать ремонт в комнате, где вся проводка оголённая. ИНКАПСУЛЯЦИЯ присутствует в классах, методах, в циклах. ИНКАПСУЛЯЦИЯ в JAVA – это объединение данных и методов работы с этими данными в одной упаковке (капсуле). В роли упаковки выступает класс. Он содержит данные (поля класса) и методы для работы с ними. СОКРЫТИЕ реализации — это наиболее общее понятие, не от слова Капсула, а от слова СКРЫВАТЬ. Нам не важно, как устроен автомобиль (объект) внутри, главное, что при нажатии педали газа (вызове метода) машина (объект) едет, а если нажатии педали тормоза (вызова метода) останавливается. Все внутренности программы СКРЫТЫ от пользователя, виден только конечный результат. За Сокрытие отвечают модификаторы о которых написано выше. НАСЛЕДОВАНИЕ2 НАСЛЕДОВАНИЕ – позволяет создавать классы на основе другого класса. Наследовать можно только один класс (на интерфейсы ограничений нет.). Себя наследовать нельзя! НАСЛЕДУЕТСЯ всё, кроме PRIVATных полей и методов. КОНСТРУКТОР — не имеет типа возвращаемого значения и имеет имя класса. Это метод класса, который вызывается при создании объекта этого класса и принимает нужные параметры для полей этого класса изменяя его Состояние. Для того чтобы унаследоваться от какого-либо класса используем слово EXTENDS, реализовать интерфейс можно через implements. Если класс не имеет класса родителя, то тогда его родителем автоматически становится класс Object. Класс Object это отец, дед, прадед и т.д. всех классов! Класс наследник (родительского класса) должен иметь конструктор как у родительского класса, только вместо this.x = x; нужно использовать super(x, y); если мы хотим дополнить конструктор, то после строчки super мы пишем this.z = z; или setter. Аксессоры (геттеры и сеттеры) Геттеры и сеттеры — это методы, задача которых контролировать доступ к полям. Геттер считывает и возвращают значение поля, а сеттер — наоборот, принимает в качестве аргумента значение и записывает в поле. Это дает возможность снабдить такие методы дополнительными обработками. ПЕРЕОПРЕДЕЛЕНИЕ @Override и ПЕРЕГРУЗКА @Overload методов Переопределение используется для изменения родительского метода (находится он в родительском классе) с целью изменить функциональность класса и его поведение. Переопределённый метод должен иметь идентичный заголовок и параметры родительского метода. Фактически меняется только содержимое метода. Перегрузка это просто множество конструкторов и методов с одним именем, но разными принимаемыми на вход параметрами. Соответственно и выбран будет тот конструктор, которому дали на вход подходящие параметры. Перегрузить можно любой класс. ПОЛИМОРФИЗМ3 (Актёр играющий разные роли (перегрузка метода), или животные, у всех будет переопределён голос, потому что животные разные (общий метод родительского класса, переопределённый у наследников)), или плавать, тоже разные объекты плавают по-разному. ПОЛИМОРФИЗМ Это возможность применения одноимённых методов (Перегрузка методов) с одинаковыми или различными наборами параметров, в одном классе или в группе классов, связанных наследованием, поведение каждого объекта будет уникальным, в зависимости от его реализации. Полиморфизм таким образом позволяет подменять объекты для тех, кто их вызывает и вызывающий даже не знает об этом. InstanceOf и два getClass через == getClass возвращает фактический объект класса, а InstanceOf проверяет на принадлежность. Например: тоСтринг принадлежит Обджект, а при проверке через getClass != getClass Поля в интерфейсе могут быть только паблик статик. Класс OBJECT Методы класса Object Так как он не является интерфейсом или абстрактным классом, можно создать его экземпляр. 1) что такое ООП. методология программирования, основанная на представлении программы в виде совокупности объектов, каждый из которых является экземпляром определённого класса, а классы образуют иерархию наследования. 2) принципы ООП Абстракция — отделение концепции от ее экземпляра; Полиморфизм — реализация задач одной и той же идеи разными способами; Наследование — способность объекта или класса базироваться на другом объекте или классе. Это главный механизм для повторного использования кода. Наследственное отношение классов четко определяет их иерархию; Инкапсуляция — размещение одного объекта или класса внутри другого для разграничения доступа к ним. 3) Модификаторы доступа private: класс Пакет (нет модификатора): класс пакет protected: класс пакет наследник public: всем 4) Указатели this и super. This с точной указывает на объект текущего класса. Часто его используют в инкапсуляции, чтобы не плодить названия переменных. Также используют в setter для проверки валидности ввода данных. Также this() можно использовать во вложенных конструкторах. Если мы хотим вызвать конструктор их конструктора( к примеру вызвать конструктор1 с двумя параметрами в конструкторе2, который вызывает три, из которых два одинаковы с конструктором1, можно использовать this(val1, val2). Не более одного вложения. Указатель super(val) позволяет обращаться к полям супер-класса. Если мы хотим расширить описательные свойства объекта путем наследования, но оставить от суперкласса все поля, их можно в конструкторе дочернего класса запихнуть в super. К примеру коробка – есть ШхВхД. У нее есть класс наследник, тяжелая коробка. Мы туда передадим ШхВхД из супер класса и добавим еще одно поле – вес. Public HeavyBox(int, w, h, d , weight ) Super(w, h, d); This.weight = weight 5) Модификатор static -- метод нельзя переопределить, все static принадлежат классу. 6) Наследование и реализация. 7) Интерфейсы. 8) Анонимные классы. 9) Класс Object и класс Class. 10) Контракт между equals() и hashCode(). 1. Что такое инкапсуляция? Инкапсуляция – объединение необходимых полей и методов в едином классе, ограничение доступа к полям и методам. Работа с классом путем выделенных для работы методов в этом инкапсулированном классе. 2. Что такое полиморфизм? Один интерфейс - множество реализаций. Механизм, позволяющий вызывать методы одного интерфейса у разных классов со своей реализацией. с помощью динамической диспетчеризации код на стадии выполнения выбирает к объекту какого класса сделать вызов метода. Позднее связывание - динамическая диспетчеризация. Это термин, описывающий реализацию механизма определения принадлежности классам методов, после компиляции программы. К примеру, мы создали массив из объектов разных классов с общим абстрактным/обычным классом/интерфейсом, у которых есть общий метод. До того как программа дойдет до выполнения этой строчки, ей неизвестно метод какого класса будет вызван у этих классов. 3. Что будет если передать массив в метод, который изменит его значения, изменятся ли они вне метода? -- да. Почему? -- это ссылка. А если передать примитив? -- Java передает все по значению! 5. Передача параметров по ссылке или по значению? -- Java передает все по значению! Как передаются объекты в метод? -- Java передает все по значению! 4. Что такое нативные методы, их плюсы и минусы? – НАТИВНЫЕ МЕТОДЫ (NATIVE) - методы используются для взаимодействия с системными вызовами или библиотеками, написанными на других языках программирования. Нативные методы позволяют вам использовать код из других языков, таких как C или C ++, в Java-коде, нативный метод не запускается в JVM. Используется, когда Java не даёт нужной функциональности. Например, я пишу программу для вычисления какого-либо сложного уравнения и построения его линейного графика, я бы использовал для этого нативный метод, потому что C++ намного быстрее, чем Java. Также, скажем, я хочу взаимодействовать с другой программой или устройством. Для этого используется нативный метод, потому что в C++ есть что-то, называемое указателями, что позволило бы мне наладить взаимодействие с устройством. 5. Перечислите все модификаторы доступа в порядке уменьшения закрытости, какую область видимости они имеют? public - доступен в других классах во всех пакетах default - виден в этом же пакете protected - виден в этом же классе, и в классе наследнике, даже если он в другом пакете private - виден только в классе. 6. Какие модификаторы доступа могут быть у класса? -- Класс и интерфейсы не могут быть private или protected. 7. Как реализована неизменность String? -- Сеттеров у String нет. Все методы, которые изменяют строку возвращают новую строку String – это public static final тип, который иммутабелен за счет этих модификаторов. 8. Можно ли использовать статические методы в обычных (этого же класса)? -- да Наоборот? -- нет Почему? -- для вызова обычного метода должен быть объект 9. Что такое конструкторы? -- для создания объекта. Конструктор – это тоже перегрузка метода Конструктор по-умолчанию? -- без параметров 10. Можно ли в классе вызвать один конструктор из другого? -- да. Как это сделать? -- this(); 11. Класс Object, все методы кроме wait, notify, notifyAll, назвать и объяснить, как работают Все классы наследуются от класса Object. Следовательно у всех классов есть методы, наследуемые от класса Object. Ссылочная переменная класса Object может ссылаться на любой объект другого класса. Массивы являются тоже классами, поэтому переменная Object может ссылаться и на массивы. Создадим ссылку на объекта класса Cat Object obj = new Cat("qwe"); Чтобы выполнять операции над этим классом, выполним приведение типов Cat cat = (Cat) obj; Теперь можем применять различные методы от класса Object. cat.ToString() выведет представление класса в виде строки Cat@4971195b. это хэшкод класса в хексе этот метод часто переопределяют hashCode() Возвращает интовое значение хэш кода. getClass() Возвращает тип класса. equals() Сравнивает два объекта на равенство. Часто переопределяют. clone() создает и возвращает копию объекта с новой ссылкой void finalize() вызывается перед удалением неиспользуемого объекта. notify() Возобновляет выполнение потока который ожидает вызываюший объект. notifyAll() Возобновление всех потоков. wait() - ожидает другого потока выполнения. wait(long millis) wait (long millis, int nanos) 12. Перечислите методы именно класса Enum? name() - возвращает название констатны в Enum. похож на toString() ordinal()возвращает значение положения в ENUM объекте вызванного объекта Label.OK.ordinal valueOf() возвраает имя enum константы и ее значение. toString() - возвращает название константы. equals() - возвращает равенство объекта с объектом Enum hashCode() - считает хэшкод константы enum clone() - выкидывает ошибку CloneNotSupportedExc Нельзя клонировать константы в enum compareTo() - возвращает -1, 0, 1 если обект меньше равен или больше. getDeclaringClass(). возвращает класс который обращается к константе enum 13. Назовите контракт между equals и hashcode? Рефлексивность x.equals(x) == true Симметричность x.equals(y) == y.equals(x) Транзитивность x.equals(z), y.equals(z) => x.equals(y) Согласованность. Повторно вызванный метод вернет то же самое. Контракт. Если x.equals(y) == true => hashCode(x) == hashCode(y) Наоборот желательно чтобы работало, но так может не получиться.( коллизия hash кодов.) HashCode должен возвращать одно и то же значение при вызове на один и тот же объект. 14. Что такое интерфейс? Интерфейс – это класс без реализации. Имеет свой идентификактор interface. При имплементировании интерфейса классом, необходимо переопределить(@Override) все методы, которые определены в интерфейсе. Интерфейсы создают контракт определенный, контракт того, какие классы будут определены у имплементированных методов, и позволяет ослабить связанность классов. К примеру у нас есть клиент с тремя мессенджерами и он ими всеми пользуется. Но есть другой клиент который пользуется только одним. В таком случае, нам бы пришлось завести инстанс этого клиента с двумя null полями. Но вместо этого мы можем создать для клиента просто интерфейс, в котором описано, что «есть какой-то мессенджер, у него есть какая-то реализация, но мы не знаем какой это мессенджер.» Interface Messenger(){ Void call(); Void getMessage(); Public class Client { Messenger messenger; } В примере предполагается что для классов мессенджеров уже создана имплементация классов из интерфейса Messenger. Когда использовать интерфейс? 15. Какие методы в интерфейсе могут иметь реализацию? --(дефолтные) остальные методы публичны и абстрактны 16. Синтаксические отличия интерфейса от абстрактного класса (АК)? 5 отличий: - abstract/interface - extends/implements - можно default/ -- - Абстрактные классы могут иметь конструкторы 17. Может ли быть абстрактный класс без абстрактных методов? -- да. Наоборот нельзя! 18. Может ли быть конструктор у абстрактного класса? -- да. Для чего? -- нельзя создать объект, но вызывается первой строкой в конструкторе потомка. |