Java 21. Что выведет код?
class Base {
Base() {
show();
}
void show() {}
}
class Child extends Base {
int value = 7;
@Override
void show() {
System.out.print(value + " ");
}
}
class Demo {
public static void main(String[] args) {
var item = new Child();
System.out.println(item.value);
}
}👾 — 0 7
👍 — 7 7
🥰 — Только 7
⚡️ — Ошибка компиляции
Конструктор Base вызывает переопределённый метод
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2👾1
Java 21. Что произойдёт при запуске?
class Main {
public static void main(String[] args) {
Object[] values = new String[2];
values[0] = "Java";
values[1] = 42;
System.out.println(values[1]);
}
}👾 — Выведет 42
👍 — Выведет строку "42"
🥰 — Выбросит ArrayStoreException
⚡️ — Код не скомпилируется
Переменная имеет тип Object[], поэтому компилятор разрешает присвоить число. Сам массив создан как String[]: при записи JVM проверяет тип элемента. Строка проходит проверку, Integer — вызывает исключение. До println выполнение не дойдёт.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰6👾1
Java 21. Что выведет код?
import java.util.HashMap;
class Main {
public static void main(String[] args) {
var cache = new HashMap<String, String>();
cache.computeIfAbsent("user", key -> null);
System.out.println(cache.containsKey("user"));
cache.computeIfAbsent("user", key -> "Ann");
System.out.println(cache.get("user"));
}
}
👾 — true, затем null
👍 — false, затем Ann
🥰 — true, затем Ann
⚡️ — Выбросит NullPointerException
Если вычисляющая функция возвращает null, computeIfAbsent оставляет отсутствующий ключ без записи. При следующем вызове функция выполнится снова. Она вернёт "Ann", и это значение попадёт в map.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5
Java 21. Что выведет код?
class Main {
public static void main(String[] args) {
String text = "A,B,,";
System.out.println(text.split(",").length);
System.out.println(text.split(",", -1).length);
}
}👾 — 4, затем 4
👍 — 3, затем 4
🥰 — 2, затем 2
⚡️ — 2, затем 4
Вызов split(",") удаляет пустые элементы в конце результата. Остаются "A" и "B".
Отрицательный limit сохраняет конечные пустые элементы: получатся "A", "B", "" и "". Это пригодится при разборе строк, где пустое последнее поле имеет значение.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡4👍1
Java 21. Что выведет код?
class Main {
static void show(Object value) {
System.out.println("Object");
}
static void show(String value) {
System.out.println("String");
}
public static void main(String[] args) {
show(null);
}
}👾 — String
👍 — Object
🥰 — Выбросит NullPointerException
⚡️ — Код не скомпилируется из-за неоднозначности
null подходит обоим параметрам. Компилятор выбирает наиболее конкретную подходящую перегрузку: String является подтипом Object.
Само по себе присваивание null параметру исключения не вызывает.
Please open Telegram to view this post
VIEW IN TELEGRAM
⚡3👍3👾2
Java 21. Что выведет код?
class Main {
static int result() {
try {
return 1;
} finally {
return 2;
}
}
public static void main(String[] args) {
System.out.println(result());
}
}👾 — 1
👍 — 1 и 2
🥰 — 2
⚡️ — Код не скомпилируется
После вычисления return 1 выполняется finally. Его return 2 заменяет уже подготовленный результат.
По той же причине return внутри finally способен скрыть исключение из try. Поэтому завершение метода лучше оставлять за пределами finally.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰4⚡1
Java 21. Что выведет код?
class Main {
public static void main(String[] args) {
System.out.println(-7 / 3);
System.out.println(Math.floorDiv(-7, 3));
}
}👾 — −3, затем −3
👍 — −2, затем −3
🥰 — −2, затем −2
⚡️ — −3, затем −2
Целочисленное деление через / отбрасывает дробную часть, двигаясь к нулю. Для −7 / 3 получается −2.
floorDiv округляет результат вниз, к отрицательной бесконечности. Поэтому он возвращает −3.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3
Java 21. Что произойдёт при запуске?
import java.util.List;
class Main {
public static void main(String[] args) {
try {
var items = List.of("A", (String) null);
System.out.println(items.size());
} catch (NullPointerException e) {
System.out.println("null");
}
}
}
👾 — 2
👍 — 1
🥰 — null
⚡️ — Ошибка компиляции
List.of запрещает null среди элементов. Исключение возникает при создании списка, и catch печатает null. До вызова size выполнение не доходит.
Please open Telegram to view this post
VIEW IN TELEGRAM
🥰4