Source Code
197 subscribers
30 photos
3 files
80 links
Download Telegram
Что будет результатом выполнения программы?
Anonymous Quiz
57%
Код скомпилируется успешно
43%
Exception (java: incompatible types)
Что будет выведено в консоль?
Anonymous Quiz
6%
Johnson
55%
John Johnson
3%
Exception
27%
John
9%
@ISB426
#java
Немного о наследовании и ООП

Какие методы можно переопределять?
- Все методы, которые не являются static, final или private.

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

С помощью keyword super можно обращаться как к методам, так и к переменным родительского класса.

Невозможно использование super в static методах и переменных.

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

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

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

Возможно будет продолжение в сторону Reflection API. Кому интересно, накидайте лайков.
#patterns
Паттерн Стратегия

Начнем с проблемы, которую решает данный паттерн. Сразу же приведем пример.
У нас есть класс Navigator (#1), в котором мы в зависимости от типа передвижения прокладывает маршрут от точки A в точку B.
Все, в принципе, работает. Но проблемы начинаются при расширении типов передвижения. Если пользователь теперь хочет чтобы ему прокладывался маршрут когда он на машине, мы должны лезть в наш исходный класс, и вручную это все прописывать. Также, мы нарушаем один из принципов SOLID, что класс должен быть закрыт для изменения, но открыт для расширения.

Решение. Вместо кучи if 'ов, мы создадим интерфейс (#2), который сможет принимать любые типы передвижения.
Теперь, наш класс мы не трогаем. Мы создали интерфейс с методом который строит маршрут. И создали пару классов, которые реализуют этот метод по своему. В общем, теперь мы можем создать хоть тысячу классов с типами передвижения, благодаря которым сможет строить маршрут так, как это надо, не изменяя базовый класс, а только расширяя его "возможности".

(Код не является идеальным примером реализации этого паттерна, он просто кое-как отображает его суть)
#java
Кастинг ссылочных типов данных

Кастинг - это процесс, когда вы заставляете переменную одного типа данных вести себя как переменная другого типа данных.
Кастинг возможен только тогда, когда между классами/интерфейсами существует IS-A взаимоотношение.
Делая кастинг, вы не меняете тип данных объекта, а заставляете его чувствовать себя как объект другого типа.

Кастинг из дочернего класса в супер класс происходит автоматически - Upcasting.
Кастинг из супер класса в дочерний класс НЕ происходит автоматически - Downcasting.

Если между классами/интерфейсами нет IS-A взаимоотношения, компилятор не допустит кастинг.

Даже если компилятор допустил кастинг, выскочит runtime exception, если объект, который мы делаем каст на самом деле не принадлежит классу, на который мы его делаем каст.
#java
О методе equals()

Если вы перезаписываете метод equals, всегда используйте в его параметре тип данных Object.

Правильно перезаписанный метод equals должен обладать следующими свойствами:
Симметричность - для non-null ссылочных переменных a и b, a.equals(b) возвращает true тогда и только тогда, когда b.equals(a) возвращает true.

Рефлексивность - для non-null ссылочных типов переменной a, a.equals(a) всегда должно возвращать true.

Транзитивность - для non-null ссылочных переменных a, b, c если a.equals(b) и b.equals(c) возвращает true, то a.equals(c) тоже должно возвращать true.

Постоянство - для non-null ccылочных переменных переменных a и b, неоднократный вызов a.equals(b) должен возвращать или только true или только false.

Для non-null ссылочной переменной a, a.equals(null) всегда должно возвращать false.
#java
Non-access modifiers

transient. Переменные класса с ключевым словом transient не сериализуются.

native. Методы с ключевым словом native реализованы не на Java. В своем описании они не имеют тела и заканчиваются как абстрактные методы символом ";".

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

volatile. Переменные с ключевым словом volatile могут быть изменены разными потоками и данные изменения будут видны во всех потоках.

strictfp. Ключевое слово strictfp в методах и классах ограничивает точность вычислений с float и double по стандарту IEEE.
Что будет выведено в консоль?
Anonymous Quiz
28%
Object
60%
float
7%
int
6%
char
Что будет выведено в консоль?
Anonymous Quiz
25%
BACBAC
37%
ABCABC
28%
BACAC
5%
ACBAB
2%
BACCAB
5%
BACBA
#java
Checked/Unchecked exceptions
Раньше уже был пост на эту тему, но в этом попытаюсь объяснить более простыми словами + дополнить + повторение материала не помешает)

Сабклассы RuntimeExceptions = unchecked exceptions
Runtime исключения бывают в коде, в котором присутствуют ошибочные выражения. Т.е. в выбросе данных исключений виноват программист. Компилятор НЕ в состоянии проверить возможность выброса runtime исключений.
❗️Runtime исключения можно не объявлять и не обрабатывать, но при желании, можно сделать и то, и другое.

Сабклассы Exceptions = checked exceptions
Checked исключения указывают на часть кода, которая находится за пределами непосредственного контроля программой и которая может являться причиной выброса исключений. Они, как правило, возникают при взаимодействии вашей программы с внешними источниками (работа с файлами, с БД, с сетью), из-за которых могут возникать проблемы. Компилятор всегда проверяет возможность выброса checked исключений.
❗️Checked исключения всегда должны быть или объявлены и/или обработаны.