Java for Beginner
672 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
Полиморфизм

Полиморфизм (от греч. "много форм") — один из основополагающих принципов объектно-ориентированного программирования (ООП), который позволяет объектам разных классов быть обработанными единообразно. Полиморфизм позволяет использовать один интерфейс для различных типов объектов.

Типы полиморфизма:

Компиляторный полиморфизм (статический полиморфизм): Достигается за счет перегрузки методов (method overloading).
Рантайм полиморфизм (динамический полиморфизм): Достигается за счет переопределения методов (method overriding) и использования наследования и интерфейсов.


Полиморфизм в Java достигается в первую очередь через наследование и интерфейсы.

Пример полиморфизма:
Рассмотрим пример с суперклассом Animal и подклассами Dog и Cat.
// Суперкласс
public class Animal {
public void makeSound() {
System.out.println("Some generic animal sound");
}
}

// Подкласс
public class Dog extends Animal {
@Override
public void makeSound() {
System.out.println("Woof! Woof!");
}
}

// Подкласс
public class Cat extends Animal {
@Override
public void makeSound() {
System.out.println("Meow! Meow!");
}
}


Использование полиморфизма:

Создадим класс Main, чтобы продемонстрировать полиморфизм.
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();

myDog.makeSound(); // Выведет "Woof! Woof!"
myCat.makeSound(); // Выведет "Meow! Meow!"
}
}


Преимущества полиморфизма:

Гибкость: Позволяет обрабатывать объекты различных классов через общий интерфейс.
Расширяемость: Упрощает добавление новых классов, поскольку методы вызываются на основе общего интерфейса.
Читаемость и поддерживаемость: Уменьшает количество условных операторов, что делает код более чистым и понятным.


Полиморфизм и интерфейсы:

Полиморфизм также поддерживается через интерфейсы. Рассмотрим пример с интерфейсом Animal и классами Dog и Cat.
public interface Animal {
void makeSound();
}

public class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("Woof! Woof!");
}
}

public class Cat implements Animal {
@Override
public void makeSound() {
System.out.println("Meow! Meow!");
}
}


Использование полиморфизма с интерфейсами:
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();

myDog.makeSound(); // Выведет "Woof! Woof!"
myCat.makeSound(); // Выведет "Meow! Meow!"
}
}


#Java #Training #ООП #Полиформизм
Подписывайтесь на канал, здесь мы научим Вас Ctrl+C — Ctrl+V)

https://t.me/Java_for_beginner_dev

#Mems
Что выведет код?

import java.util.*;

public class Main {
public static void main(String[] args) {
List<Integer> numbers = new ArrayList<>(Arrays.asList(1, 2, 3, 4, 5));
Collections.reverse(numbers);
numbers.removeIf(n -> n % 2 == 0);
System.out.println(numbers);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
10%
[5, 4, 3, 2, 1]
75%
[5, 3, 1]
15%
[4, 2]
0%
[1, 3, 5]
Абстрактные классы и методы

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

Абстрактный класс определяется с помощью ключевого слова abstract.


public abstract class Animal {
protected String name;

public Animal(String name) {
this.name = name;
}

public abstract void makeSound(); // Абстрактный метод

public void eat() {
System.out.println(name + " is eating");
}
}


Подклассы абстрактного класса:

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

public class Dog extends Animal {
public Dog(String name) {
super(name);
}

@Override
public void makeSound() {
System.out.println("Woof! Woof!");
}
}

public class Cat extends Animal {
public Cat(String name) {
super(name);
}

@Override
public void makeSound() {
System.out.println("Meow! Meow!");
}
}


Использование абстрактного класса:
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog("Buddy");
Animal myCat = new Cat("Whiskers");

myDog.makeSound(); // Выведет "Woof! Woof!"
myCat.makeSound(); // Выведет "Meow! Meow!"
myDog.eat(); // Выведет "Buddy is eating"
myCat.eat(); // Выведет "Whiskers is eating"
}
}


Преимущества использования абстрактных классов:

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


Разница между абстрактными классами и интерфейсами:

Множественное наследование: Класс может реализовывать несколько интерфейсов, но может наследоваться только от одного абстрактного класса.
Реализация методов: Интерфейсы не могут содержать реализацию методов (до Java 8, после появились default методы), в то время как абстрактные классы могут содержать методы с реализацией.
Использование в коде: Абстрактные классы используются для определения общего функционала с частичной реализацией, тогда как интерфейсы служат для определения контрактов без реализации.


Пример использования интерфейсов и абстрактных классов:
public interface Flyable {
void fly();
}

public abstract class Bird {
public abstract void makeSound();

public void layEggs() {
System.out.println("Laying eggs");
}
}

public class Sparrow extends Bird implements Flyable {
@Override
public void makeSound() {
System.out.println("Chirp! Chirp!");
}

@Override
public void fly() {
System.out.println("Flying high!");
}
}

public class Main {
public static void main(String[] args) {
Sparrow sparrow = new Sparrow();
sparrow.makeSound(); // Выведет "Chirp! Chirp!"
sparrow.fly(); // Выведет "Flying high!"
sparrow.layEggs(); // Выведет "Laying eggs"
}
}

#Java #Training #ООП
Интерфейсы

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

Объявление интерфейса

Интерфейс объявляется с использованием ключевого слова interface.
public interface Animal {
void makeSound(); // Метод без реализации
}


Реализация интерфейса

Класс, который реализует интерфейс, должен предоставить реализацию всех методов, объявленных в интерфейсе.
public class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("Woof! Woof!");
}
}

public class Cat implements Animal {
@Override
public void makeSound() {
System.out.println("Meow! Meow!");
}
}


Использование интерфейсов
public class Main {
public static void main(String[] args) {
Animal myDog = new Dog();
Animal myCat = new Cat();

myDog.makeSound(); // Выведет "Woof! Woof!"
myCat.makeSound(); // Выведет "Meow! Meow!"
}
}


Методы по умолчанию и статические методы

С Java 8 интерфейсы могут содержать методы по умолчанию (default methods) и статические методы.
public interface Animal {
void makeSound();

default void sleep() {
System.out.println("Sleeping...");
}

static void description() {
System.out.println("Animals can make sounds.");
}
}

public class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("Woof! Woof!");
}
}


Использование методов по умолчанию и статических методов
public class Main {
public static void main(String[] args) {
Dog myDog = new Dog();
myDog.makeSound(); // Выведет "Woof! Woof!"
myDog.sleep(); // Выведет "Sleeping..."
Animal.description(); // Выведет "Animals can make sounds."
}
}


Множественное наследование через интерфейсы

Класс может реализовывать несколько интерфейсов, что позволяет комбинировать различные типы поведения.
public interface Flyable {
void fly();
}

public interface Swimmable {
void swim();
}

public class Duck implements Animal, Flyable, Swimmable {
@Override
public void makeSound() {
System.out.println("Quack! Quack!");
}

@Override
public void fly() {
System.out.println("Flying high!");
}

@Override
public void swim() {
System.out.println("Swimming in the pond!");
}
}


Использование множественного наследования
public class Main {
public static void main(String[] args) {
Duck myDuck = new Duck();
myDuck.makeSound(); // Выведет "Quack! Quack!"
myDuck.fly(); // Выведет "Flying high!"
myDuck.swim(); // Выведет "Swimming in the pond!"
}
}


Преимущества интерфейсов:

Полная абстракция: Интерфейсы обеспечивают полную абстракцию, так как методы интерфейсов не содержат реализацию (до Java 8).
Множественное наследование: Классы могут реализовывать несколько интерфейсов, что позволяет создавать гибкие и модульные системы.
Поддержка контрактов: Интерфейсы определяют контракт, который должен быть реализован классом, что обеспечивает консистентность и предсказуемость поведения.


#Java #Training #ООП
Подписывайтесь на канал, мы знаем кто Вы на самом деле 🫵

https://t.me/Java_for_beginner_dev

#Mems
Рассмотрите следующий код. Какое значение будет напечатано в консоль при его выполнении?

public class Main {
public static void main(String[] args) {
int[] arr = {1, 2, 3, 4, 5};
int result = 0;
for (int i = 0; i < arr.length; i += 2) {
result += arr[i];
}
System.out.println(result);
}
}


#Tasks
Варианты ответа:
Anonymous Quiz
50%
9
19%
6
23%
15
8%
5
Различия между абстрактными классами и интерфейсами

Основные различия между абстрактными классами и интерфейсами:

Множественное наследование:

Абстрактные классы: Класс может наследовать только один абстрактный класс.
Интерфейсы: Класс может реализовывать несколько интерфейсов.


Методы с реализацией:

Абстрактные классы: Могут содержать как абстрактные методы (без реализации), так и методы с реализацией.
Интерфейсы: До Java 8 интерфейсы не могли содержать методов с реализацией. С Java 8 интерфейсы могут содержать методы по умолчанию и статические методы.


Ключевые слова:

Абстрактные классы: Определяются с использованием ключевого слова abstract.
Интерфейсы: Определяются с использованием ключевого слова interface.


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

Абстрактные классы: Могут иметь конструкторы.
Интерфейсы: Не могут иметь конструкторов.


Поле класса:


Абстрактные классы: Могут содержать поля (переменные экземпляра).
Интерфейсы: Могут содержать только константы (public static final поля).


Примеры для сравнения:

Абстрактный класс:
public abstract class Animal {
protected String name;

public Animal(String name) {
this.name = name;
}

public abstract void makeSound(); // Абстрактный метод

public void eat() {
System.out.println(name + " is eating");
}
}

public class Dog extends Animal {
public Dog(String name) {
super(name);
}

@Override
public void makeSound() {
System.out.println("Woof! Woof!");
}
}


Интерфейс:
public interface Animal {
void makeSound(); // Метод без реализации

default void sleep() {
System.out.println("Sleeping...");
}
}

public class Dog implements Animal {
@Override
public void makeSound() {
System.out.println("Woof! Woof!");
}
}


Сравнительное использование:
public class Main {
public static void main(String[] args) {
// Абстрактный класс
Dog dog = new Dog("Buddy");
dog.makeSound(); // Выведет "Woof! Woof!"
dog.eat(); // Выведет "Buddy is eating"

// Интерфейс
Animal animal = new Dog();
animal.makeSound(); // Выведет "Woof! Woof!"
animal.sleep(); // Выведет "Sleeping..."
}
}


Когда использовать абстрактные классы и интерфейсы:

Используйте абстрактный класс, когда:

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


Используйте интерфейсы, когда:


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


#Java #Training #ООП
Небольшой разбор задачки от нашего подписчика)))

Оцените!👍
Forwarded from RomanGV
This media is not supported in your browser
VIEW IN TELEGRAM
Вот записал.. сказку на ночь)))
Сильно не пинайте, впервые такое записываю😀

Разбор той мини задачки "Шо напечатает код, который в следующем сообщении, если ввести "1abcd"?))"
#Tasks #Solution
Всем приятных выходных!

Не думаем о работе, наслаждаемся летом и солнышком🔆

Делитесь фото, как отдыхаете!😉

#Weekend
Что выведет код?

public class Main {
public static void main(String[] args) {
int x = 10;
int y = 5;
x += y; // x = x + y
y -= 3; // y = y - 3
x *= 2; // x = x * 2
y /= 2; // y = y / 2
System.out.println("x = " + x + ", y = " + y);
}
}


#Tasks
Подписывайтесь на канал, мы работаем даже на выходных😏

https://t.me/Java_for_beginner_dev

#Mems
Перегрузка метода

Перегрузка методов (method overloading) – это возможность создания в классе нескольких методов с одинаковым именем, но с разными параметрами.
Рассмотрим пример класса Calculator, который будет выполнять сложение двух и трех чисел:
public class Calculator {
public int add(int a, int b) {
return a + b;
}

public int add(int a, int b, int c) {
return a + b + c;
}
public int calculate(int a, int b) {
return a + b;
}
}

В данном случае, у нас есть два метода add с одинаковым именем, но разными параметрами. Java определяет, какой метод вызвать на основе количества и типа переданных аргументов.
public class Main {
public static void main(String[] args) {
Calculator calc = new Calculator();
System.out.println("Сумма двух чисел: " + calc.add(2, 3)); // Выводит 5
System.out.println("Сумма трех чисел: " + calc.add(2, 3, 4)); // Выводит 9
}
}

Варианты перегрузки

Можно выделить три варианта перегрузки.

По количеству параметров.
public class Calculator {
void calculate(int number1, int number2) { }
void calculate(int number1, int number2, int number3) { }
}


По типам параметров:

public class Calculator {
void calculate(int number1, int number2) { }
void calculate(double number1, double number2) { }
}


По порядку параметров:
public class Calculator {
void calculate(double number1, int number2) { }
void calculate(int number1, double number2) { }
}


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

#Java #Training
This media is not supported in your browser
VIEW IN TELEGRAM
Уважаемые подписчики!

Сегодня в 16:00 по МСК, @MrAbhorrent проведет вторую часть урока по написанию игры крестики-нолики!

Присоединяйтесь!
От нас лайф-кодинг для новичков и печеньки, от Вас - адекватное общение!)))

Ждем Всех!

Общаться будем через Яндекс.Телемост, ссылку опубликуем в нашем чате! - https://t.me/Java_Beginner_chat
Please open Telegram to view this post
VIEW IN TELEGRAM
Пакеты и импорт

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

Создание пакетов
Для создания пакета используется ключевое слово package, которое должно быть первой строкой в файле Java, перед любыми импортами или определениями классов.

Пример создания пакета:
package com.example.myapp;


Структура пакетов
Пакеты организуются иерархически, как директории в файловой системе. Например, пакет com.example.myapp будет находиться в директории com/example/myapp.

Пример файловой структуры:
src
└── com
└── example
└── myapp
├── Main.java
└── Utils.java


Импорт пакетов
Для использования классов из других пакетов необходимо их импортировать. Импорт осуществляется с использованием ключевого слова import.

Пример импорта:
import com.example.myapp.Utils;


Можно импортировать все классы из пакета, используя *:
import com.example.myapp.*;


Полное имя класса

Классы можно использовать с полным именем (включая пакет), без необходимости импортировать их:
public class Main {
public static void main(String[] args) {
com.example.myapp.Utils.printHello();
}
}


Пример создания пакета и его использования:

Файл: com/example/myapp/Utils.java
package com.example.myapp;

public class Utils {
public static void printHello() {
System.out.println("Hello from Utils!");
}
}


Файл: com/example/myapp/Main.java
package com.example.myapp;

import com.example.myapp.Utils;

public class Main {
public static void main(String[] args) {
Utils.printHello();
}
}


Преимущества использования пакетов:

Организация кода: Пакеты помогают логически группировать связанные классы и интерфейсы.
Избежание конфликтов имен: Пакеты предотвращают конфликт имен, поскольку классы с одинаковыми именами могут существовать в разных пакетах.
Контроль доступа: Пакеты позволяют управлять доступом к классам и методам, используя модификаторы доступа (default и protected).
Упрощение навигации: Структурированные пакеты облегчают навигацию по проекту и поиск нужных классов.


#Java #Training