Java for Beginner
673 subscribers
541 photos
155 videos
12 files
827 links
Канал от новичков для новичков!
Изучайте Java вместе с нами!
Здесь мы обмениваемся опытом и постоянно изучаем что-то новое!

Наш YouTube канал - https://www.youtube.com/@Java_Beginner-Dev

Наш канал на RUTube - https://rutube.ru/channel/37896292/
Download Telegram
Тяжела наша ноша Джуниоры 😂😂😂

https://t.me/Java_for_beginner_dev

#Mems
Основные методы класса Pair

Класс Pair, независимо от конкретной реализации (например, Apache Commons, JavaFX, или собственная реализация), предлагает несколько ключевых методов, которые делают работу с парами значений удобной и эффективной.

Конструктор Pair(K key, V value)

Конструктор используется для создания новой пары. Он принимает два параметра — key и value, которые инициализируют соответствующие поля объекта Pair.
Pair<String, Integer> pair = new Pair<>("John", 30);
В этом примере создается пара, где ключом (или первым элементом) является строка "John", а значением (или вторым элементом) — целое число 30.


Методы getKey() и getValue()

Эти методы используются для получения значений, хранящихся в паре. Метод getKey() возвращает первый элемент пары (ключ), а getValue() — второй элемент (значение).
String name = pair.getKey();  // "John"
Integer age = pair.getValue(); // 30
Эти методы позволяют извлекать значения из объекта Pair, что удобно при работе с парными данными.


Методы equals() и hashCode()

Методы equals() и hashCode() переопределяются в классе Pair для обеспечения корректного сравнения и использования объекта в коллекциях, таких как HashMap или HashSet.
Pair<String, Integer> pair1 = new Pair<>("John", 30);
Pair<String, Integer> pair2 = new Pair<>("John", 30);

boolean areEqual = pair1.equals(pair2); // true
Метод equals() сравнивает два объекта Pair на предмет их равенства, основываясь на значениях ключа и значения. hashCode() возвращает хэш-код объекта, что важно для корректной работы с хешированными коллекциями.


Метод toString()

Метод toString() переопределяется для получения строкового представления объекта Pair. Обычно оно имеет вид (key, value).
System.out.println(pair.toString()); // (John, 30)
Этот метод полезен для вывода информации о паре в читаемом формате.


Метод compareTo(Pair<K, V> other)

Если класс Pair реализует интерфейс Comparable, то в нём будет присутствовать метод compareTo(). Он позволяет сравнивать два объекта Pair по их ключам и значениям. Это полезно для сортировки коллекций пар.
Pair<String, Integer> pair1 = new Pair<>("John", 30);
Pair<String, Integer> pair2 = new Pair<>("Alice", 25);

int comparisonResult = pair1.compareTo(pair2); // результат зависит от реализации Comparable
Этот метод особенно полезен, когда нужно отсортировать список объектов Pair по ключам или значениям.



Примеры использования класса Pair

Пример 1: Использование Pair в методах
Pair может быть полезен, когда нужно вернуть из метода два значения.
public class MinMaxExample {
public static Pair<Integer, Integer> findMinMax(int[] array) {
if (array == null || array.length == 0) {
throw new IllegalArgumentException("Array cannot be null or empty");
}

int min = array[0];
int max = array[0];

for (int num : array) {
if (num < min) {
min = num;
}
if (num > max) {
max = num;
}
}

return new Pair<>(min, max);
}

public static void main(String[] args) {
int[] numbers = {3, 5, 1, 8, -2, 7};
Pair<Integer, Integer> result = findMinMax(numbers);
System.out.println("Min: " + result.getKey());
System.out.println("Max: " + result.getValue());
}
}
Этот пример показывает, как метод findMinMax возвращает объект Pair, содержащий минимальное и максимальное значения массива. Это более элегантный способ возврата двух связанных значений по сравнению с использованием массивов или пользовательских классов.


#Java #Training #Medium #Pair
Пример 2: Использование Pair в коллекциях

Pair также полезен для хранения пар ключ-значение в коллекциях. Например, предположим, что мы хотим хранить информацию о студентах и их оценках в виде списка пар.
import java.util.ArrayList;
import java.util.List;

public class StudentGradesExample {
public static void main(String[] args) {
List<Pair<String, Integer>> studentGrades = new ArrayList<>();

studentGrades.add(new Pair<>("Alice", 85));
studentGrades.add(new Pair<>("Bob", 90));
studentGrades.add(new Pair<>("Charlie", 78));

for (Pair<String, Integer> pair : studentGrades) {
System.out.println("Student: " + pair.getKey() + ", Grade: " + pair.getValue());
}
}
}
В этом примере мы создаем список студентов и их оценок, используя класс Pair. Это позволяет легко хранить и обрабатывать пары данных, связанных логически.


Пример 3: Использование Pair в многомерных структурах

Иногда Pair может использоваться для создания более сложных структур данных, таких как многомерные таблицы, графы и т.д.
import java.util.HashMap;
import java.util.Map;

public class GraphExample {
public static void main(String[] args) {
Map<Pair<String, String>, Integer> graph = new HashMap<>();

graph.put(new Pair<>("A", "B"), 5);
graph.put(new Pair<>("A", "C"), 10);
graph.put(new Pair<>("B", "C"), 3);

for (Map.Entry<Pair<String, String>, Integer> entry : graph.entrySet()) {
Pair<String, String> edge = entry.getKey();
Integer weight = entry.getValue();
System.out.println("Edge from " + edge.getKey() + " to " + edge.getValue() + " has weight " + weight);
}
}
}
Этот пример показывает, как Pair может быть использован в качестве ключа в HashMap, чтобы хранить ребра графа и их веса. Это полезно для представления связей между узлами в графе.


Пример 4: Объединение значений из двух массивов

Рассмотрим пример, когда у нас есть два массива — один с именами студентов, другой с их оценками. Мы можем объединить их в список пар:
public class CombineArraysExample {
public static List<Pair<String, Integer>> combine(String[] names, int[] grades) {
List<Pair<String, Integer>> result = new ArrayList<>();
for (int i = 0; i < names.length; i++) {
result.add(new Pair<>(names[i], grades[i]));
}
return result;
}

public static void main(String[] args) {
String[] students = {"Alice", "Bob", "Charlie"};
int[] grades = {85, 90, 78};

List<Pair<String, Integer>> studentGrades = combine(students, grades);

for (Pair<String, Integer> pair : studentGrades) {
System.out.println(pair.getKey() + ": " + pair.getValue());
}
}
}
Этот код объединяет два массива в список объектов Pair, где каждый объект представляет пару "имя-оценка". Это упрощает доступ к связанной информации и её обработку.


#Java #Training #Medium #Pair
Всем доброго субботнего утра!🔆

Какие планы на выходные?

Я тут в растерянности, какую тему рассмотреть на завтрашней встрече... Может у кого какие есть предложения, пишите в комменты или в чате, обсудим) 🤝

Но встреча завтра так или иначе состоится! Как всегда в 16:00 по МСК)))🫡
Признавайтесь, чей проект?😂😂😂

https://t.me/Java_for_beginner_dev

#Mems
Всем доброго утра! ☀️

Напоминаю, что сегодня в 16:00 по МСК мы вновь соберемся на онлайн встречу!

Тема встречи мне пока неизвестна, но возможно Андрей покажет нам новый подход к написанию игры крестики-нолики!

Кроме того обсудим дальнейшие темы, которые будут публиковаться на канале, расскажу об посещении офиса Яндекс)))

Ссылка на яндекс.телемост будет в нашем чате https://t.me/Java_Beginner_chat

Ждем всех!
Встреча_в_Телемосте_15_09_24_20_23_09_—_запись.webm
481.1 MB
Запись нашей сегодняшней встречи

Сегодня Андрей на примере показал что такое рефакторить код из процедурного стиля в объектно-ориентированный)))
За что ему безмерное уважение и благодарность, было интересно)

Кроме того спасибо тем кто смог прийти, за участие, вопросы и подсказки!

Смотрите, комментируйте, задавайте вопросы!

Гит репозиторий с результатом - https://github.com/MrAbhorrent/TicTacToe_study

Всем теплой ночи! 🫡✌️

#online_meeting
Добавлю. Код, который был на встрече, смотреть в ветках dev_oop, dev_oop-001, dev_oop-002. Почти исходное состояние кода в ветке develop. В ветку dev_oop я уже смержил изменения из dev_oop-001.
Оглавление обучающих постов часть 2.

Распространенные ошибки многопоточности
Callable
Semaphore
CountDownLatch
Аннотации в Java
Создание собственных аннотаций в Java
BitSet
NavigableSet

Неизменяемые коллекции
Cинхронизированные коллекции
Properties
Stream API
CompletableFuture
Optional
Алгоритмы
Работа с датами в Java
Класс Random в Java
Рекурсия в Java
Pair
Приведение типов в Java
Оператор Instanceof
Основные методологии разработки
Оператор try-catch в Java
Оператор multi-catch в Java
Оператор try-with-resources
Переменные-ссылки в Java
StackTrace в Java
Класс Math в Java
Побитовые операции в Java
Литералы в Java
Кодировки в Java
Экранирование символов в Java
Регулярные выражения в Java
Метасимволы
Введение в URL, URLConnection, работа с сетью, особенности и применение
Основные методы URL, URLConnection и примеры использования
Работа с файлами в Java, Класс Files, особенности и применение
Основные методы Files, примеры использования работы с файлами в Java
StringBuilder
String.format и StringFormatter
StringTokenizer
Substring
Класс StringReader
Класс StringWriter
Основные методы класса StringWriter
Enum
Dynamic Proxy
Итераторы в Java
Метод Thread.sleep()
Класс TimeUnit
Память в JVM
Metaspace
Java Memory Model (JMM)
Сборка мусора в Java
Типы сборок мусора в Java
Внутреннее устройство Garbage Collector
Мусорные ссылки в Java
Утечка памяти в Java

Управление JVM (Java Virtual Machine) командами
Компиляция программ Java
Команды в JVM

Классы для работы с датами и временем в Java Time API
Работа с временными зонами, Duration и Period
Форматирование и парсинг дат с DateTimeFormatter
ZoneOffset, OffsetDateTime и конвертация времени между часовыми поясами
Класс Instant и TemporalAdjusters
Работа с временными зонами
Основные аннотации для работы с датами в Spring
Продвинутые аннотации и нюансы работы с датами

#Contents
Оглавление для обучающих постов.

Если хотите найти информацию по Java, ранее опубликованную на канале - для Вас подготовлено оглавление уже из 2-х частей!
Пользуйтесь на здоровье!🫡

Часть 1.
Часть 2.

Читайте, используйте, будут вопросы - пишите!😉
Java for Beginner pinned «Оглавление для обучающих постов. Если хотите найти информацию по Java, ранее опубликованную на канале - для Вас подготовлено оглавление уже из 2-х частей! Пользуйтесь на здоровье!🫡 Часть 1. Часть 2. Читайте, используйте, будут вопросы - пишите!😉»
Операторы присваивания, инкремента-декремента в Java

Операторы присваивания

Операторы присваивания (=) — это инструменты, позволяющие задать значение переменной. Они принимают выражение справа от оператора и присваивают его значение переменной слева. Самый простой оператор присваивания — это одиночный знак равенства =.

int x = 10;
В этом примере переменной x присваивается значение 10. Оператор присваивания не возвращает никаких значений, его задача — изменить состояние переменной.


Кроме базового оператора присваивания, существуют составные операторы присваивания. Они сочетают присваивание с арифметическими операциями, позволяя сократить и упростить код.

Составные операторы присваивания:
+=: добавляет значение справа к переменной и присваивает результат.
int a = 5;
a += 3; // теперь a равно 8


-=: вычитает значение справа из переменной и присваивает результат.
int b = 10;
b -= 4; // теперь b равно 6


*=: умножает переменную на значение справа и присваивает результат.
int c = 2;
c *= 3; // теперь c равно 6


/=: делит переменную на значение справа и присваивает результат.
``
int d = 20;
d /= 5; // теперь d равно 4
```

%=: присваивает остаток от деления переменной на значение справа.
int e = 7;
e %= 3; // теперь e равно 1 (остаток от деления 7 на 3)


Внутреннее устройство операторов присваивания

Внутри JVM (Java Virtual Machine) операторы присваивания выполняют операции с переменными, которые хранятся в стеке или в памяти (в зависимости от их типа и области видимости). Например, если переменная является примитивным типом данных (int, double, boolean и т.д.), она хранится в стеке, а если переменная — объект, то она хранится в куче, а ссылка на этот объект — в стеке.

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

Операторы инкремента и декремента

Операторы инкремента (++) и декремента (--) используются для увеличения или уменьшения значения переменной на единицу. В Java эти операторы существуют в двух формах: префиксной и постфиксной.

Префиксный и постфиксный инкремент

Префиксный инкремент ++x: увеличивает значение переменной на 1 и затем возвращает это новое значение.
int x = 5;
int y = ++x; // сначала x увеличивается до 6, потом присваивается y, так что y равно 6


Постфиксный инкремент x++: сначала возвращает текущее значение переменной, а затем увеличивает его на 1.
int x = 5;
int y = x++; // сначала y присваивается значение x (5), затем x увеличивается до 6


Префиксный и постфиксный декремент

Префиксный декремент --x: уменьшает значение переменной на 1 и затем возвращает это новое значение.
int x = 5;
int y = --x; // сначала x уменьшается до 4, потом присваивается y, так что y равно 4


Постфиксный декремент x--: сначала возвращает текущее значение переменной, а затем уменьшает его на 1.
int x = 5;
int y = x--; // сначала y присваивается значение x (5), затем x уменьшается до 4


Внутреннее устройство операторов инкремента и декремента

Операторы инкремента и декремента, как и операторы присваивания, работают с регистрами процессора и памятью. Однако в случае с этими операторами выполняется только добавление или вычитание единицы из значения переменной.
Процесс включает следующие шаги:

Прочитать текущее значение переменной из стека или кучи.
В зависимости от того, префиксный или постфиксный оператор используется, переменная сначала либо увеличивается (уменьшается), либо возвращается её текущее значение.
После этого значение переменной обновляется в памяти.


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

#Java #Training #Medium #Increment #Decrement
Что выведет код?

public class Main {
public static void main(String[] args) {
int x = 5;
int y = x++ + ++x + --x + x--;
System.out.println(y);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
11%
16
16%
18
5%
456
68%
24
0%
48
А что бывает по другому?😂🤪

https://t.me/Java_for_beginner_dev

#Mems
Операторы присваивания в Java: примеры использования

Пример 1: Простое присваивание
Cамое базовое присваивание значения переменной:
public class AssignmentExample {
public static void main(String[] args) {
int x = 10; // присваивание 10 переменной x
System.out.println("x = " + x);
}
}
Здесь переменной x присваивается значение 10. Это базовый пример присваивания, где переменная получает конкретное значение, которое позже может быть использовано в программе. Данный оператор является основой для дальнейших операций с переменными.


Пример 2: Присваивание через выражение
В Java можно присваивать значения переменным на основе выражений, содержащих другие переменные и операции:
public class ExpressionAssignmentExample {
public static void main(String[] args) {
int a = 5;
int b = 10;
int c = a + b; // c присваивается результат сложения a и b
System.out.println("c = " + c); // c равно 15
}
}
В этом примере переменной c присваивается результат сложения переменных a и b. Это демонстрирует, что оператор присваивания может работать с выражениями и вычислениями, упрощая процесс программирования.


Пример 3: Составные операторы присваивания
Cоставные операторы присваивания позволяют сократить код и одновременно выполнять арифметические операции с переменными.

Пример с оператором +=
public class CompoundAssignmentExample {
public static void main(String[] args) {
int x = 10;
x += 5; // эквивалентно x = x + 5
System.out.println("x = " + x); // теперь x равно 15
}
}
Здесь используется оператор +=, который одновременно добавляет значение к переменной x и присваивает результат. Это сокращает запись x = x + 5 до более компактной формы.


Пример с оператором *= и /=
public class CompoundAssignmentExample2 {
public static void main(String[] args) {
int a = 6;
a *= 3; // эквивалентно a = a * 3
System.out.println("a = " + a); // a равно 18

int b = 18;
b /= 6; // эквивалентно b = b / 6
System.out.println("b = " + b); // b равно 3
}
}
Операторы *= и /= работают аналогично: они выполняют умножение и деление соответственно, а затем присваивают результат переменной.


Пример 4: Применение инкремента и декремента в циклах
Операторы инкремента (++) и декремента (--) часто используются в циклах для изменения значений счётчиков.

Инкремент в цикле for
public class IncrementExample {
public static void main(String[] args) {
for (int i = 0; i < 5; i++) { // инкремент i после каждой итерации
System.out.println("i = " + i);
}
}
}
В этом примере цикл for использует постфиксный инкремент i++ для увеличения счётчика на 1 после каждой итерации. Это классический случай использования оператора инкремента в циклах.


Декремент в цикле while
public class DecrementExample {
public static void main(String[] args) {
int count = 5;
while (count > 0) {
System.out.println("Count = " + count);
count--; // декремент после каждой итерации
}
}
}
Здесь оператор декремента count-- уменьшает значение переменной count на единицу после каждой итерации цикла. Цикл продолжается до тех пор, пока значение переменной не станет меньше или равно нулю.


#Java #Training #Medium #Increment #Decrement
Пример 5: Использование префиксного и постфиксного инкремента
Разница между префиксной и постфиксной формами инкремента проявляется в том, когда именно изменяется значение переменной.
public class PrefixPostfixExample {
public static void main(String[] args) {
int x = 5;

// Постфиксный инкремент
int y = x++; // сначала y присваивается 5, затем x увеличивается до 6
System.out.println("x = " + x); // x равно 6
System.out.println("y = " + y); // y равно 5

// Префиксный инкремент
int z = ++x; // сначала x увеличивается до 7, затем z присваивается 7
System.out.println("x = " + x); // x равно 7
System.out.println("z = " + z); // z равно 7
}
}
В этом примере видно, как постфиксная форма x++ возвращает текущее значение переменной, а затем увеличивает его, в то время как префиксная форма ++x сначала увеличивает значение, а затем возвращает его. Это может быть важно при работе с выражениями, где последовательность вычислений имеет значение.


Пример 6: Комплексные выражения с инкрементом
Инкремент и декремент могут быть частью более сложных выражений:
public class ComplexExpressionExample {
public static void main(String[] args) {
int a = 5;
int b = 10;
int result = a++ + ++b; // a увеличивается после вычисления, b - до
System.out.println("a = " + a); // a теперь равно 6
System.out.println("b = " + b); // b теперь равно 11
System.out.println("result = " + result); // результат равен 16 (5 + 11)
}
}
Этот пример показывает, как операторы инкремента могут взаимодействовать с другими операторами в сложных выражениях. Здесь постфиксный инкремент a++ использует старое значение a в выражении, а префиксный инкремент ++b сразу увеличивает значение b.


Пример 7: Использование операторов присваивания в методах
Операторы присваивания можно использовать в методах для изменения состояния переменных или полей объекта:
public class MethodAssignmentExample {
public static void main(String[] args) {
int x = 10;
int y = increment(x); // вызов метода increment
System.out.println("x = " + x); // x не изменилось, так как примитивы передаются по значению
System.out.println("y = " + y); // результат работы метода y равно 11
}

public static int increment(int num) {
return ++num; // префиксный инкремент увеличивает значение num
}
}
В этом примере метод increment() использует префиксный инкремент для увеличения значения аргумента. Однако важно отметить, что изменения, произведенные внутри метода, не влияют на исходное значение переменной x, так как примитивные типы в Java передаются по значению.


Пример 8: Операторы присваивания в массиве
Присваивание и инкремент можно использовать и в массивах, например, для увеличения каждого элемента:
public class ArrayAssignmentExample {
public static void main(String[] args) {
int[] numbers = {1, 2, 3, 4, 5};

for (int i = 0; i < numbers.length; i++) {
numbers[i] += 1; // увеличиваем каждый элемент массива на 1
}

for (int num : numbers) {
System.out.println(num); // вывод обновленных значений
}
}
}
Здесь оператор присваивания += используется для изменения значений элементов массива. Каждый элемент увеличивается на 1, и результат выводится на экран.


#Java #Training #Medium #Increment #Decrement
Приведение типов в Java

Приведение типов (или кастинг) — это важная концепция в Java, которая позволяет преобразовывать значения одного типа данных в другой. Приведение типов может быть как явным, так и неявным, и используется для обеспечения совместимости между различными типами данных, таких как примитивные типы (int, float, char и т.д.) и объекты (например, классы и интерфейсы).

Виды приведения типов

Неявное (автоматическое) приведение типов — выполняется компилятором автоматически, без необходимости явного указания приведения в коде.
Явное приведение типов — требуется явное указание программистом, что один тип данных нужно привести к другому.

Неявное приведение типов или расширение (Widening)

Неявное приведение типов происходит, когда данные приводятся от меньшего типа к большему. Это называется расширением типа (widening). Например, преобразование типа int в тип double происходит автоматически, так как это безопасная операция — данные не теряются.
public class ImplicitCastingExample {
public static void main(String[] args) {
int intValue = 100;
double doubleValue = intValue; // неявное приведение от int к double
System.out.println("int value: " + intValue);
System.out.println("double value: " + doubleValue); // выводится 100.0
}
}
В этом примере значение переменной intValue типа int автоматически преобразуется в doubleValue типа double без потери данных.


Явное приведение типов или сужение (Narrowing)

Явное приведение необходимо, когда требуется преобразовать тип данных, при котором возможна потеря информации. Это чаще всего происходит, когда нужно привести больший тип данных к меньшему, что называется сужением (narrowing). Явное приведение указывает компилятору, что программист осознает риск потери данных и берет на себя ответственность.
public class ExplicitCastingExample {
public static void main(String[] args) {
double doubleValue = 9.78;
int intValue = (int) doubleValue; // явное приведение от double к int
System.out.println("double value: " + doubleValue);
System.out.println("int value: " + intValue); // выводится 9 (часть дроби теряется)
}
}
Здесь мы явно привели тип double к типу int. В результате теряется дробная часть, и остаётся только целое значение.


Приведение примитивных типов

В Java существует несколько примитивных типов данных, и их можно приводить друг к другу, но при этом стоит учитывать риск потери данных. Вот список примитивных типов данных по их размеру:

byte (8 бит)
short (16 бит)
int (32 бита)
long (64 бита)
float (32 бита)
double (64 бита)
char (16 бит, используется для хранения символов Unicode)

boolean (логический тип, не поддерживает приведение к числовым типам)

Пример приведения между примитивными типами:
public class PrimitiveCastingExample {
public static void main(String[] args) {
byte byteValue = 10;
int intValue = byteValue; // неявное приведение от byte к int
System.out.println("int value: " + intValue);

int anotherIntValue = 100;
byte anotherByteValue = (byte) anotherIntValue; // явное приведение от int к byte
System.out.println("byte value: " + anotherByteValue);
}
}
В первом случае происходит автоматическое расширение типа, так как int больше, чем byte. Во втором случае требуется явное приведение, поскольку возможна потеря данных при сужении типа int до byte.


#Java #Training #Medium #Casting
Приведение объектов и классов

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

Приведение вверх (upcasting)
Приведение вверх (upcasting) — это приведение объекта дочернего класса к типу его родительского класса. Это безопасная операция, которая не требует явного указания.
class Animal {
public void makeSound() {
System.out.println("Animal sound");
}
}

class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Bark");
}
}

public class UpcastingExample {
public static void main(String[] args) {
Dog dog = new Dog();
Animal animal = dog; // неявное приведение Dog к Animal (upcasting)
animal.makeSound(); // выводится "Bark", так как объект на самом деле Dog
}
}
В данном случае объект Dog приводится к типу Animal. Это возможно, так как Dog является наследником Animal, и вызов метода makeSound() все равно приведет к выполнению метода класса Dog.


Приведение вниз (downcasting)

Приведение вниз (downcasting) — это приведение объекта родительского класса к типу дочернего класса. Оно требует явного указания, так как существует риск возникновения ошибки во время выполнения, если объект не является экземпляром дочернего класса.
class Animal {
public void makeSound() {
System.out.println("Animal sound");
}
}

class Dog extends Animal {
public void bark() {
System.out.println("Bark");
}
}

public class DowncastingExample {
public static void main(String[] args) {
Animal animal = new Dog(); // upcasting
Dog dog = (Dog) animal; // downcasting
dog.bark(); // теперь можно вызвать методы класса Dog
}
}
Здесь объект типа Animal приводится к Dog. Такое приведение должно быть явным, потому что не каждый объект Animal может быть приведен к Dog. Если бы объект на самом деле не был экземпляром Dog, это вызвало бы ошибку во время выполнения.


Приведение с интерфейсами

Приведение также может быть применено к интерфейсам. Если объект реализует интерфейс, он может быть приведен к этому типу.
interface Walkable {
void walk();
}

class Human implements Walkable {
@Override
public void walk() {
System.out.println("Human walking");
}
}

public class InterfaceCastingExample {
public static void main(String[] args) {
Human human = new Human();
Walkable walkable = human; // неявное приведение к интерфейсу
walkable.walk(); // вызов метода интерфейса
}
}
В этом примере объект класса Human приводится к интерфейсу Walkable, что позволяет вызвать методы интерфейса, реализованные в классе.


#Java #Training #Medium #Casting