Java | Фишки и трюки
7.21K subscribers
182 photos
29 videos
6 files
40 links
Java: примеры кода, интересные фишки и полезные трюки

Купить рекламу: https://telega.in/c/java_tips_and_tricks

✍️По всем вопросам: @Pascal4eg
Download Telegram
⌨️ Чем абстрактный класс отличается от интерфейса? В каких случаях следует использовать абстрактный класс, а в каких интерфейс?

✔️ В Java класс может одновременно реализовать несколько интерфейсов, но наследоваться только от одного класса.

✔️ Абстрактные классы используются только тогда, когда присутствует тип отношений «is a» (является). Интерфейсы могут реализоваться классами, которые не связаны друг с другом.

✔️ Абстрактный класс - средство, позволяющее избежать написания повторяющегося кода, инструмент для частичной реализации поведения. Интерфейс - это средство выражения семантики класса, контракт, описывающий возможности. Все методы интерфейса неявно объявляются как public abstract или (начиная с Java 8) default - методами с реализацией по-умолчанию, а поля - public static final.

✔️ Интерфейсы позволяют создавать структуры типов без иерархии.

✔️ Наследуясь от абстрактного, класс «растворяет» собственную индивидуальность. Реализуя интерфейс, он расширяет собственную функциональность.

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

#java #interface #abstract
Please open Telegram to view this post
VIEW IN TELEGRAM
👍192👏1
⌨️ Может ли статический метод быть переопределён?

В Java статические методы нельзя переопределить в строгом смысле этого слова, поскольку они связаны с классом, а не с объектом. Однако их можно скрыть (hide).

Если в подклассе объявить статический метод с той же сигнатурой, что и в суперклассе, то метод суперкласса будет скрыт в контексте подкласса.

Такое скрытие не является переопределением, потому что оно не зависит от объекта, а определяется на уровне класса.

Если вы вызываете статический метод через ссылку на суперкласс, будет вызван метод суперкласса, независимо от того, какой класс был фактически использован для создания объекта.

Пример:

class Parent {
static void staticMethod() {
System.out.println("Parent");
}
}

class Child extends Parent {
static void staticMethod() {
System.out.println("Child");
}
}

public class Main {
public static void main(String[] args) {
Parent parent = new Child();
parent.staticMethod(); // Parent
}
}


Почему статические методы нельзя переопределить?

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

#java #static #override
Please open Telegram to view this post
VIEW IN TELEGRAM
👍13🔥32
⌨️ Что такое "статический класс"?

Это вложенный класс, объявленный с использованием ключевого слова static. К классам верхнего уровня модификатор static неприменим.

Статический вложенный класс имеет несколько особенностей, отличающих его от обычных вложенных классов:

1️⃣ Нет привязки к экземпляру внешнего класса
Статический вложенный класс не связан с экземпляром внешнего класса. Это означает, что он может быть создан без необходимости создавать объект внешнего класса. В отличие от обычного вложенного класса, который всегда ассоциирован с экземпляром внешнего класса, статический вложенный класс может быть использован независимо.

2️⃣ Доступ к членам внешнего класса
Статический вложенный класс может обращаться только к статическим членам (поля и методы) внешнего класса. Он не имеет доступа к нестатическим членам внешнего класса, поскольку не существует привязки к экземпляру внешнего класса.

Пример:

public class OuterClass {
private static int staticVar = 10;
private int nonStaticVar = 20;

static class StaticNestedClass {
void display() {
// Доступ к статическому полю внешнего класса
System.out.println("Static variable from outer class: " + staticVar);

// Ошибка компиляции: нестатическое поле нельзя использовать в статическом вложенном классе
// System.out.println("Non-static variable from outer class: " + nonStaticVar);
}
}
}

public class Main {
public static void main(String[] args) {
// Создаем экземпляр статического вложенного класса
OuterClass.StaticNestedClass nestedObject = new OuterClass.StaticNestedClass();
nestedObject.display();
}
}


Для чего используется:
✔️ Когда вложенный класс не должен иметь доступа к состоянию экземпляра внешнего класса.

✔️ Когда вложенный класс используется для представления логически связанного функционала, но не зависит от состояния внешнего объекта.

#java #static #class
Please open Telegram to view this post
VIEW IN TELEGRAM
👍151
public class Quest {
public static synchronized void main(String[] a) throws InterruptedException {
Thread t = new Thread() {
public void run() {
pong();
}
};
t.start();
Thread.sleep(1000);
System.out.print("Ping");
}

static synchronized void pong() {
System.out.print("Pong");
}
}
👍3
Что выведет код?
Anonymous Quiz
27%
PingPong
54%
PongPing
19%
<Ошибка компиляции>
👍71
🔗 В чем разница между == и .equals()?

При сравнении объектов в Java важно понимать различие между == и .equals().

✔️ == сравнивает ссылки на объекты, проверяя, указывают ли они на одну и ту же область памяти.

✔️ .equals() используется для сравнения содержимого объектов, если метод переопределен.

Пример:
String a = new String("Java");
String b = new String("Java");

System.out.println(a == b); // false (разные ссылки)
System.out.println(a.equals(b)); // true (сравнение содержимого)


💡 Совет: для корректного сравнения объектов всегда переопределяйте метод equals() в вашем классе.

#java #equals #comparison
Please open Telegram to view this post
VIEW IN TELEGRAM
👍173
Почему строки в Java неизменяемы (immutable)?

В Java объект String неизменяемый, что означает, что после создания его состояние нельзя изменить. Но зачем это нужно?

1️⃣ Безопасность: неизменяемые строки делают код более безопасным, особенно при работе с потоками или использованием строк в ключах коллекций (например, HashMap).

2️⃣ Производительность: строковые объекты кэшируются в пуле строк (String Pool), что позволяет Java эффективно управлять памятью.

3️⃣ Совместимость: неизменяемость строк облегчает работу с множеством библиотек, так как они не могут непреднамеренно изменить строку.

Пример:
String str = "Hello";
str.concat(" World");
System.out.println(str); // Hello


Хотя метод concat добавляет строку, оригинальный объект остается неизменным, создавая новый объект в памяти.

💡 Совет: если нужно часто изменять строки, используйте StringBuilder или StringBuffer.

#java #string #immutable
Please open Telegram to view this post
VIEW IN TELEGRAM
👍16
🚀 Что такое Stream API и зачем оно нужно?

Stream API — мощный инструмент для работы с коллекциями, появившийся в Java 8. Он позволяет писать лаконичный и читаемый код для обработки данных.

🔍 Преимущества:

1️⃣ Чистый код: меньше циклов и условных конструкций.
2️⃣ Ленивая обработка: Stream API выполняет операции только тогда, когда это необходимо.
3️⃣ Параллелизм: можно легко выполнять операции в несколько потоков.

Пример:
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.stream()
.filter(name -> name.startsWith("A"))
.forEach(System.out::println); // Alice


💡 Совет: Stream API отлично подходит для работы с большими объемами данных.

#java #streamapi #java8
Please open Telegram to view this post
VIEW IN TELEGRAM
1👍17🔥5
⚙️ Что такое функциональный интерфейс?

Функциональный интерфейс — это интерфейс, содержащий ровно один абстрактный метод. В Java 8 и выше они активно используются для работы с лямбда-выражениями и потоками (Stream API).

Пример:
@FunctionalInterface
interface MyFunctionalInterface {
void execute();
}

public class Main {
public static void main(String[] args) {
MyFunctionalInterface task = () -> System.out.println("Hello, Functional Interface!");
task.execute();
}
}


✔️ Особенности:

1️⃣ Интерфейс с аннотацией @FunctionalInterface может содержать только один абстрактный метод.
2️⃣ Можно добавлять default или static методы без ограничения их количества.

💡 Совет: Используйте функциональные интерфейсы для создания компактного и чистого кода с лямбда-выражениями.

#java #functionalinterface #lambda
Please open Telegram to view this post
VIEW IN TELEGRAM
👍123🔥2
🤔 Что такое Optional и как его использовать?

Optional — это контейнер, который помогает избежать NullPointerException, упрощая работу с отсутствующими значениями. Появился в Java 8.

📌 Основные методы:

1️⃣ Optional.of(value) — создаёт Optional с непустым значением.
2️⃣ Optional.empty() — создаёт пустой Optional.
3️⃣ Optional.ofNullable(value) — создаёт Optional, который может быть пустым, если value == null.
4️⃣ isPresent() / ifPresent() — проверяет, есть ли значение, или выполняет действие.

Пример:
Optional<String> optionalName = Optional.ofNullable(null);

optionalName.ifPresent(name -> System.out.println(name));
System.out.println(optionalName.orElse("Default Name")); // Default Name


💡 Совет: Используйте Optional вместо null для более чистого и безопасного кода.

#java #optional #nullsafe
Please open Telegram to view this post
VIEW IN TELEGRAM
👍141
🔍 Что такое аннотация @Override и зачем она нужна?

Аннотация @Override используется для явного указания, что метод переопределяет метод суперкласса.

✔️ Преимущества:

1️⃣ Помогает избежать ошибок, если метод из суперкласса изменен или не существует.
2️⃣ Улучшает читаемость кода.

Пример:
class Parent {
void display() {
System.out.println("Parent");
}
}

class Child extends Parent {
@Override
void display() {
System.out.println("Child");
}
}


💡 Совет: Всегда используйте @Override, чтобы избежать случайных ошибок при переопределении методов.

#java #override #annotations
Please open Telegram to view this post
VIEW IN TELEGRAM
🤝4👍3
🔗 Разница между final, finally и finalize

Эти три похожих термина часто путают в Java, но у каждого из них свое назначение.

1️⃣ final ключевое слово для объявления:

• Констант (переменные, которые нельзя изменить).
• Методов (которые нельзя переопределить).
• Классов (которые нельзя наследовать).

2️⃣ finally блок, используемый с try-catch для выполнения кода независимо от того, было ли выброшено исключение.

3️⃣ finalize метод, вызываемый сборщиком мусора перед удалением объекта. Используется редко, так как считается устаревшим.

Пример:
final int a = 10;

try {
System.out.println(a);
} finally {
System.out.println("This always executes!");
}


💡 Совет: Используйте final для повышения читаемости кода, а finally для освобождения ресурсов. Метод finalize лучше избегать.

#java #final #finally #finalize
Please open Telegram to view this post
VIEW IN TELEGRAM
👍111
public class Quest {
public static void main(String[] args) {
Short b = 50;
inc(b);
System.out.println(b);
}
private static void inc(Short num) {
num++;
}
}
👍4
Что выведет код?
Anonymous Quiz
46%
50
38%
51
16%
<Ошибка компиляции>
🎉52
🔥 Разница между HashMap и ConcurrentHashMap

1️⃣ HashMap:

• Не потокобезопасен.
• Быстрее в однопоточном окружении.
• Можно получить ConcurrentModificationException, если итерация выполняется параллельно с изменением данных.

2️⃣ ConcurrentHashMap:

• Потокобезопасен.
• Использует сегментацию для увеличения производительности в многопоточном режиме.
• Не выбрасывает ConcurrentModificationException.

Пример:
Map<String, String> map = new ConcurrentHashMap<>();
map.put("key", "value");


💡 Совет: Для многопоточных приложений используйте ConcurrentHashMap.

#java #hashmap #concurrenthashmap
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🤯31
📌 Что такое volatile и как оно работает?

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

✔️ Основные особенности:

1️⃣ Обеспечивает чтение переменной из основной памяти, а не из кэша потока.
2️⃣ Гарантирует видимость изменений между потоками.

Пример:
class SharedObject {
volatile int count = 0;
}


💡 Ограничение: volatile не гарантирует атомарность операций. Для этого используйте synchronized или классы из java.util.concurrent.

#java #volatile #multithreading
Please open Telegram to view this post
VIEW IN TELEGRAM
👍91🔥1
🤣23👍6😁31
⚙️ Зачем нужны default методы в интерфейсах?

С появлением Java 8 интерфейсы могут содержать методы с реализацией по умолчанию с помощью ключевого слова default.

✔️ Преимущества:

1️⃣ Позволяет добавлять новые методы в интерфейс без нарушения обратной совместимости.
2️⃣ Облегчает создание интерфейсов с базовой реализацией.

Пример:
interface MyInterface {
default void defaultMethod() {
System.out.println("Default implementation");
}
}


💡 Совет: Используйте default методы для минимальной реализации интерфейсов без создания дополнительных классов.

#java #defaultmethods #java8
Please open Telegram to view this post
VIEW IN TELEGRAM
👍102
Channel photo updated
Как вам новый логотип канала?

🔥 - хорошо

👎 - не очень
🔥128👎24👌4🥰2
Что такое AtomicInteger и зачем он нужен?

AtomicInteger — это класс из java.util.concurrent.atomic, который предоставляет атомарные операции над int без использования synchronized.

➡️ Зачем использовать?

1️⃣ Позволяет безопасно изменять значение в многопоточной среде.
2️⃣ Работает быстрее, чем synchronized, так как использует низкоуровневые атомарные операции.

✔️ Пример:

import java.util.concurrent.atomic.AtomicInteger;

public class AtomicExample {
private static AtomicInteger count = new AtomicInteger(0);

public static void main(String[] args) {
count.incrementAndGet(); // Увеличиваем значение на 1
System.out.println(count.get()); // 1
}
}


💡 Совет: Используйте AtomicInteger, если вам нужны безопасные инкременты/декременты без блокировки.

#java #atomicinteger #concurrency
Please open Telegram to view this post
VIEW IN TELEGRAM
👍82