class Animal {
}
class Dog extends Animal {
}
public class Main {
public static void main(String[] args) {
Animal a = new Dog();
System.out.println(a instanceof Animal);
System.out.println(a instanceof Dog);
System.out.println(a.getClass() == Animal.class);
System.out.println(a.getClass() == Dog.class);
}
}❤2
Что будет выведено на консоль?
Anonymous Quiz
31%
true true true false
50%
true true false true
11%
true false true false
8%
false true false true
public class Main {
public static void main(String[] args) {
test(10);
}
static void test(Long x) {
System.out.println("Long");
}
static void test(Object x) {
System.out.println("Object");
}
}🤔1
Что будет выведено на консоль?
Anonymous Quiz
33%
Long
37%
Object
24%
Ошибка компиляции
7%
Runtime Error
👍4
⚠️ Перегрузка методов в Java: как компилятор выбирает метод?
🧠 Главное правило:
Java выбирает наиболее специфичный метод, к которому можно привести аргумент.
Но! Специфичность определяется не «на глаз», а по строгим правилам.
📊 Приоритет преобразований (от лучшего к худшему):
1️⃣ Точное совпадение
2️⃣ Расширение примитива (widening)
3️⃣ Автоупаковка (boxing)
4️⃣ Повышение типа (upcasting)
⚡️ Если нужна цепочка преобразований — выбирается наиболее «прямой» путь.
❗️ Важно:
💥 null подходит к любому ссылочному типу.
Поэтому выбирается более специфичный:
💣 Если типы одинаково специфичны — будет ошибка:
🧩 Как думать правильно:
1. Нужно ли преобразование вообще?
2. Какое именно:
— widening
— boxing
— наследование
3. Есть ли более «узкий» тип среди кандидатов?
💬 Если хотите — разберём ваш пример.
Такие задачи отлично прокачивают понимание перегрузки.
🧠 Главное правило:
Java выбирает наиболее специфичный метод, к которому можно привести аргумент.
Но! Специфичность определяется не «на глаз», а по строгим правилам.
📊 Приоритет преобразований (от лучшего к худшему):
1️⃣ Точное совпадение
void foo(int x)
foo(10);
2️⃣ Расширение примитива (widening)
void foo(long x)
foo(10); // int → long
3️⃣ Автоупаковка (boxing)
void foo(Integer x)
foo(10); // int → Integer
4️⃣ Повышение типа (upcasting)
void foo(Object x)
Integer x = 10;
foo(x); // Integer → Object
⚡️ Если нужна цепочка преобразований — выбирается наиболее «прямой» путь.
❗️ Важно:
widening + boxing не работаетvoid foo(Long x)
foo(10); // ошибка компиляции (int → long → Long)
💥 null подходит к любому ссылочному типу.
Поэтому выбирается более специфичный:
void foo(String x)
void foo(Object x)
foo(null); // → String
💣 Если типы одинаково специфичны — будет ошибка:
void foo(String x)
void foo(Integer x)
foo(null); // ambiguous
🧩 Как думать правильно:
1. Нужно ли преобразование вообще?
2. Какое именно:
— widening
— boxing
— наследование
3. Есть ли более «узкий» тип среди кандидатов?
💬 Если хотите — разберём ваш пример.
Такие задачи отлично прокачивают понимание перегрузки.
Что спрашивают на собеседованиях по Java Core?
Чаще всего проверяют не просто знание синтаксиса, а понимание:
— зачем используют HashMap и как она работает под капотом
— что делает synchronized
— как аккуратно работать с датами (и не ловить баги из-за часовых поясов)
— как использовать Stream API
— как писать и применять лямбда-выражения в реальном коде
Если эти темы для тебя не просто знакомы, а отработаны на практике —
уровень на собеседовании ощущается сразу.
Поэтому я собрала курс «Прокачай Java» — без лишней теории и перегруза:
✔️ ввод-вывод (потоки)
✔️ коллекции
✔️ даты и время
✔️ многопоточность
✔️ лямбда-выражения
✔️ Stream API
Если чувствуешь, что база есть, но уверенности не хватает —
возможно, это как раз тот шаг, который выведет тебя на новый уровень 🚀
И в течение всего апреля на курс действует скидка 15%.
Чаще всего проверяют не просто знание синтаксиса, а понимание:
— зачем используют HashMap и как она работает под капотом
— что делает synchronized
— как аккуратно работать с датами (и не ловить баги из-за часовых поясов)
— как использовать Stream API
— как писать и применять лямбда-выражения в реальном коде
Если эти темы для тебя не просто знакомы, а отработаны на практике —
уровень на собеседовании ощущается сразу.
Поэтому я собрала курс «Прокачай Java» — без лишней теории и перегруза:
✔️ ввод-вывод (потоки)
✔️ коллекции
✔️ даты и время
✔️ многопоточность
✔️ лямбда-выражения
✔️ Stream API
Если чувствуешь, что база есть, но уверенности не хватает —
возможно, это как раз тот шаг, который выведет тебя на новый уровень 🚀
И в течение всего апреля на курс действует скидка 15%.
👍6
import java.util.*;
class Student {
String name;
Student(String name) {
this.name = name;
}
}
public class Main {
public static void main(String[] args) {
Set<Student> set = new HashSet<>();
set.add(new Student("Ann"));
set.add(new Student("Ann"));
System.out.println(set.size());
}
}
👍1
👍5
import java.util.*;
class Student {
String name;
Student(String name) {
this.name = name;
}
//добавляем equals()
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (!(o instanceof Student)) return false;
Student s = (Student) o;
return Objects.equals(name, s.name);
}
}
public class Main {
public static void main(String[] args) {
Set<Student> set = new HashSet<>();
set.add(new Student("Ann"));
set.add(new Student("Ann"));
System.out.println(set.size());
}
}
👍4
import java.util.*;
class Student {
String name;
Student(String name) {
this.name = name;
}
@Override
public boolean equals(Object o) {
return true;
}
@Override
public int hashCode() {
return new Random().nextInt();
}
}
public class Main {
public static void main(String[] args) {
Set<Student> set = new HashSet<>();
set.add(new Student("Ann"));
set.add(new Student("Ann"));
System.out.println(set.size());
}
}
👍2
🔹 Как работает Set в Java?
Set — это коллекция, в которой не может быть дубликатов. Добавили одинаковый объект дважды? Второй раз просто проигнорируется.
Но как Java это понимает? 🤔
Всё держится на двух методах класса, объекты которого вы кладёте в Set:
•
•
📌 Как это работает:
1. Сначала вычисляется
2. Java перебирает элементы корзины и вызывает
3. Если равный объект найден — новый не добавится. Если нет — объект добавляется в корзину
💡 Важно:
Например, если студенты считаются равными по фамилии (игнорируем год рождения и средний балл), то и
А задачи на использование множества вы найдёте в курсе «Прокачай Java» — и до конца месяца там действует скидка 15% 😉
Set — это коллекция, в которой не может быть дубликатов. Добавили одинаковый объект дважды? Второй раз просто проигнорируется.
Но как Java это понимает? 🤔
Всё держится на двух методах класса, объекты которого вы кладёте в Set:
•
equals() — проверяет, равны ли объекты•
hashCode() — определяет, в какую «корзину» (ячейку хеш-таблицы) попадёт объект📌 Как это работает:
1. Сначала вычисляется
hashCode() и определяется индекс корзины. В ней хранятся объекты в виде списка или дерева.2. Java перебирает элементы корзины и вызывает
equals() для сравнения с новым объектом3. Если равный объект найден — новый не добавится. Если нет — объект добавляется в корзину
💡 Важно:
equals() и hashCode() нужно переопределять вместе — и по одному принципу.Например, если студенты считаются равными по фамилии (игнорируем год рождения и средний балл), то и
hashCode() должен вычисляться только по фамилии.А задачи на использование множества вы найдёте в курсе «Прокачай Java» — и до конца месяца там действует скидка 15% 😉
❤6
Свежие отзывы на курс "Основы языка Java":
Стася Грозная 11 дней назад
Виталий Виноградов 14 дней назад
Шикарный курс, гораздо лучше аналогов известных платформ с бесплатными частями для изучения!!! Материал изложен понятно. Очень радует количество задачек и особенно наборы входных параметров в них, которые каждый раз пытаются тебя подловить на неочевидных нюансах, которые не ожидаешь, но могут попасть на входе и все испортить. В целом нужна практика, практика и практика. Было бы неплохо еще какой-нибудь задачник отдельно выпустить для тренировки навыков уже после прохождения самого курса.
Стася Грозная 11 дней назад
Решил изучать Java после Python! Пробовал несколько других курсов от хороших преподавателей, но все казались переусложненными, либо слишком подробными, что тормозило обучение. Нашел этот курс (привлекла невысокая цена и хорошие отзывы), начал проходить, следом появился интерес к Java. По итогу прохождения могу выделить ПЛЮСЫ курса: 1. Теория есть в текстовом и видео формате - кому как больше нравится. 2. Компактный объем. Теория разбита на небольшие разделы, видео длится в среднем 8-12 минут. 3. После теории обязательные тесты и/или задачки на закрепление материала. 4. Минимально требуется изучать дополнительные материалы, обычно теории в 95% случает хватает для решения задач. 5. Оксана (автор курса) оперативно отвечает на все вопросы - почти каждый день за редким исключением. 6. У этого курса есть два продолжения - ООП и Прокачай Java! То есть сразу понятно, что проходить дальше и в какой последовательности. МОМЕНТЫ, на которые я обращал внимание: - Иногда бывало, что в видео есть то, чего нет в текстовой части раздела, или наоборот (обычно это небольшой, но важный нюанс). Поэтому в идеале проверять, что видео совпадает с текстом. Но в целом это не минус, а просто замечание. В видео больше нюансов и проще следить за ходом мысли автора, нежели просто читать сухой текст. - Для совсем новичков в программировании будет сложно, так как автор позиционирует свой курс уже для тех, кто знаком с алгоритмами решения задач и владеет какой-никакой базой (например C/C++). Но если вы знаете, например, основы Python или любого другого языка, то проблем с пониманием у вас не возникнет. Как итог: курсом доволен, буду брать следующий, надеюсь дальше будет только интереснее! КУРС РЕКОМЕНДУЮ ОДНОЗНАЧНО! АВТОРУ СПАСИБО ЗА ПОДДЕРЖКУ И ОТВЕТЫ НА ВСЕ ВОПРОСЫ!
Виталий Виноградов 14 дней назад
👍6
import java.util.*;
public class Test {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put("A", 1);
map.put("B", 2);
map.put("A", 3);
map.put(null, 4);
map.put(null, 5);
System.out.println(map.get("A"));
System.out.println(map.get(null));
System.out.println(map.size());
}
}
👍3
import java.util.*;
class Key {
String value;
Key(String value) {
this.value = value;
}
@Override
public boolean equals(Object o) {
return true;
}
@Override
public int hashCode() {
return 1;
}
}
public class Main {
public static void main(String[] args) {
Map<Key, String> map = new HashMap<>();
map.put(new Key("A"), "first");
map.put(new Key("B"), "second");
map.put(new Key("C"), "third");
System.out.println(map.size());
System.out.println(map.get(new Key("Z")));
}
}
❤2
import java.util.*;
public class Main {
public static void main(String[] args) {
Map<String, Integer> map = new HashMap<>();
map.put(null, 1);
map.put(null, 2);
map.put("A", null);
map.put("A", 3);
map.put("B", null);
System.out.println(map.get(null));
System.out.println(map.get("A"));
System.out.println(map.get("B"));
}
}
👍3
👍3