// Для импорта конкретного статического члена
import static package.Clazz.member;
// Для импорта всех статических членов класса
import static package.Clazz.*;
Пример:
public class MathUtils {
public static final double PI = 3.141592653589793;
public static int add(int a, int b) {
return a + b;
}
public static int subtract(int a, int b) {
return a - b;
}
}
import static MathUtils.PI;
import static MathUtils.add;
public class Main {
public static void main(String[] args) {
System.out.println("Value of PI: " + PI);
System.out.println("Addition result: " + add(5, 3));
}
}
import static MathUtils.*;
public class Main {
public static void main(String[] args) {
System.out.println("Value of PI: " + PI);
System.out.println("Addition result: " + add(5, 3));
System.out.println("Subtraction result: " + subtract(5, 3));
}
}
Плюсы: читаемость, компактность кода.
Минусы:
- не очевидно откуда берется поле или метод
- импорт всех статических членов может привести к конфликтам имен, если разные классы содержат статические члены с одинаковыми именами
#java #static #import
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥4❤1
Часто нам нужно проверить является ли объект экземпляром определенного класса, например в методе equals(). Существует несколько способов это сделать. Разберём два из них.
instanceof проверяет, является ли ссылка на объект в левой части экземпляром типа в правой части или каким-либо подтипом.
getClass() == ... проверяет, идентичны ли типы.
Выбирать способ проверки типа нужно исходя из решаемой задачи. В методе equals() можно использовать оба способа в зависимости от того собираетесь ли вы позволять сравнивать объект определенного класса и объект класса наследника.
class Parent { }
class Child extends Parent { }
public class Test {
public static void main(String[] args) {
Parent parent = new Parent();
Child child = new Child();
System.out.println(parent instanceof Parent); // true
System.out.println(child instanceof Parent); // true
System.out.println(parent.getClass() == Parent.class); // true
System.out.println(child.getClass() == Parent.class); // false
}
}
#java #instanceof #getClass
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11❤4
Есть несколько видов ссылок на методы:
1️⃣ Ссылка на статический метод
Используется для вызова статических методов класса.
Синтаксис:
ContainingClass::staticMethodName
Пример:
import java.util.function.Function;
public class MethodReferenceExample {
public static void main(String[] args) {
Function<String, Integer> converter = Integer::parseInt;
Integer number = converter.apply("123");
System.out.println(number); // 123
}
}
2️⃣ Ссылка на метод экземпляра конкретного объекта
Используется для вызова методов экземпляра объекта.
Синтаксис:
containingObject::instanceMethodName
Пример:
import java.util.Arrays;
import java.util.List;
public class MethodReferenceExample {
public static void main(String[] args) {
List<String> names = Arrays.asList("Alice", "Bob", "Charlie");
names.forEach(System.out::println);
}
}
3️⃣ Ссылка на метод экземпляра произвольного объекта определенного типа
Синтаксис:
ContainingType::methodName
Пример:
import java.util.function.Function;
public class FunctionExample {
public static void main(String[] args) {
Function<String, Integer> stringLength = String::length;
Integer length = stringLength.apply("Hello, World!");
System.out.println(length); // 13
}
}
Отличие от предыдущего вида в том, что в предыдущем ссылка на метод получается у конкретного объекта, стало быть вызовется метод этого объекта, а в нашем случае при получении ссылки на метод, мы знаем только метод, но объект у которого вызовется этот метод еще не известен, он будет предоставлен при вызове метода. Код выше будет означать "Hello, World!".length()
4️⃣ Ссылка на конструктор
Используется для вызова конструктора.
Синтаксис:
ClassName::new
Пример:
import java.util.function.Supplier;
public class MethodReferenceExample {
public static void main(String[] args) {
Supplier<MethodReferenceExample> exampleSupplier = MethodReferenceExample::new;
MethodReferenceExample example = exampleSupplier.get();
System.out.println(example); // MethodReferenceExample@<hashcode>
}
}
#java #MethodReference
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤4
Цикл for со счетчиком
for (initialization; condition; update) {
// тело цикла
}
Описание:
initialization: выполняется один раз перед началом цикла. Обычно используется для инициализации счетчика.
condition: проверяется перед каждой итерацией. Если условие истинно, выполняется тело цикла.
update: выполняется после каждой итерации. Обычно используется для изменения счетчика.
int[] numbers = {1, 2, 3, 4, 5};
for (int i = 0; i < numbers.length; i++) {
System.out.println(i + ": " + numbers[i]);
}
Применение:
Используется, когда известно количество итераций заранее. Часто применяется для работы с массивами или коллекциями, когда нужен индекс.
Цикл for-each
for (type element : collection) {
// тело цикла
}
Описание:
Итерируется по каждому элементу коллекции (например, массива, списка, множества). Обеспечивает удобный способ доступа к каждому элементу без использования индексов.
int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
System.out.println(number);
}
Применение:
Предпочтителен, когда не нужен доступ к индексам элементов.
Цикл while
while (condition) {
// тело цикла
}
Описание:
condition: проверяется перед каждой итерацией. Если условие истинно, выполняется тело цикла.
String code = UUID.randomUUID().toString();
boolean isCodeExists = repo.isCodeExists(code);
while (isCodeExists) {
code = UUID.randomUUID().toString();
isCodeExists = repo.isCodeExists(code);
}
repo.saveCode(code);
Применение:
Используется, когда количество итераций неизвестно заранее и определяется во время выполнения программы. Цикл может не выполниться ни одного раза.
Цикл do-while
do {
// тело цикла
} while (condition);
Описание:
Выполняет тело цикла хотя бы один раз, а затем проверяет условие condition. Если условие истинно, цикл повторяется.
String command;
do {
command = readCommand();
doCommand(command);
} while (!"EXIT".equals(command));
Применение:
Используется, когда тело цикла должно выполниться хотя бы один раз, независимо от условия. Часто применяется для меню или ввода данных, где сначала нужно выполнить действие, а затем проверить условие.
#java #cycles #for #while
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8❤1
Heap (куча) используется Java Runtime для выделения памяти под объекты и классы. Создание нового объекта также происходит в куче. Это же является областью работы сборщика мусора. Любой объект, созданный в куче, имеет глобальный доступ и на него могут ссылаться из любой части приложения.
Stack (стек) это область хранения данных также находящееся в общей оперативной памяти (RAM). Всякий раз, когда вызывается метод, в памяти стека создается новый блок, который содержит примитивы и ссылки на другие объекты в методе. Как только метод заканчивает работу, блок также перестает использоваться, тем самым предоставляя доступ для следующего метода. Размер стековой памяти намного меньше объема памяти в куче. Стек в Java работает по схеме LIFO (Последний-зашел-Первый-вышел)
Различия между Heap и Stack памятью:
✔️ Куча используется всеми частями приложения, в то время как стек используется только одним потоком исполнения программы.
✔️ Всякий раз, когда создается объект, он всегда хранится в куче, а в памяти стека содержится лишь ссылка на него. Память стека содержит только локальные переменные примитивных типов и ссылки на объекты в куче.
✔️ Объекты в куче доступны с любой точки программы, в то время как стековая память не может быть доступна для других потоков.
✔️ Стековая память существует лишь какое-то время работы программы, а память в куче живет с самого начала до конца работы программы.
✔️ Если память стека полностью занята, то Java Runtime бросает исключение java.lang.StackOverflowError. Если заполнена память кучи, то бросается исключение java.lang.OutOfMemoryError: Java Heap Space.
✔️ Размер памяти стека намного меньше памяти в куче.
✔️ Из-за простоты распределения памяти, стековая память работает намного быстрее кучи.
Для определения начального и максимального размера памяти в куче используются -Xms и -Xmx опции JVM. Для стека определить размер памяти можно с помощью опции -Xss.
#java #heap #stack #memory
Please open Telegram to view this post
VIEW IN TELEGRAM
👍9❤2🔥1
В Java 12 появился новый синтаксис для
switch, который позволяет возвращать значение используя стрелки ->, что делает код более компактным и удобным. Теперь switch может использоваться как выражение, а не только как оператор, что упрощает его применение в логике.Ранее
switch использовался как оператор, и код мог выглядеть громоздко:
String day = "MONDAY";
int numLetters;
switch (day) {
case "MONDAY":
case "FRIDAY":
case "SUNDAY":
numLetters = 6;
break;
case "TUESDAY":
numLetters = 7;
break;
default:
numLetters = 8;
}
System.out.println(numLetters); // Вывод: 6
Со Switch Expressions можно переписать этот код более лаконично:
String day = "MONDAY";
int numLetters = switch (day) {
case "MONDAY", "FRIDAY", "SUNDAY" -> 6;
case "TUESDAY" -> 7;
default -> 8;
};
System.out.println(numLetters); // Вывод: 6
Теперь
switch может вернуть значение, и нет необходимости в break.#java #switch
Please open Telegram to view this post
VIEW IN TELEGRAM
👍22❤3