Курсы по Java для новичков
676 subscribers
66 photos
1 video
4 files
73 links
Я Оксана Еськова - преподаватель Вуза с 20-летним стажем.
Научу писать код на Java c нуля.
Курсы c автоматической проверкой задач: https://stepik.org/users/23008752
Все вопросы сюда 👉 @aksana_yaskova
Download Telegram
Что будет выведено на консоль?
Anonymous Quiz
10%
Animal info Animal speaks
51%
Dog info Dog barks
37%
Animal info Dog barks
2%
Dog info Animal speaks
👍2
class A {
A() {
System.out.print("A");
}
}

class B extends A {
B() {
System.out.print("B");
}
}

public class Main {
public static void main(String[] args) {
new B();
}
}
Что будет выведено на консоль?
Anonymous Quiz
10%
A
44%
B
42%
AB
4%
BA
3👍1
class A {
int x = 10;
}

class B extends A {
int x = 20;
}

public class Main {
public static void main(String[] args) {
A obj = new B();
System.out.println(obj.x);
}
}
Продолжаем тему полиморфизма в Java. Что выведет код?
Anonymous Quiz
18%
10
65%
20
14%
Ошибка компиляции
2%
Runtime Error
🤯2
Полиморфизма для полей нет!
Поле выбирается по типу ссылки, а не по типу объекта.

Поля с одинаковым именем в суперклассе и наследнике — это не переопределение, а скрытие (field hiding). Это считается плохой практикой.

В подклассе нельзя напрямую обратиться к полю суперкласса по имени x, потому что оно скрыто одноимённым полем наследника. Но можно обратиться через super.x.

class A {
int x = 10;
}

class B extends A {
int x = 20;

void print() {
System.out.println(super.x); // выводит 10
}
}

public class Main {
public static void main(String[] args) {
A obj1 = new B();
B obj2 = new B();

System.out.println(obj1.x); // 10 — по типу ссылки (A)
System.out.println(obj2.x); // 20 — по типу ссылки (B)

obj2.print(); // super.x == 10
}
}
🙏3
class Animal {
}

class Dog extends Animal {
}

class Cat extends Animal {
}

public class Main {
public static void main(String[] args) {
Animal a = new Dog();

Dog d = (Dog) a;
System.out.println(d instanceof Animal);

Cat c = (Cat) a;
System.out.println(c instanceof Animal);
}
}
🙏3
Проверка типа объекта в Java: instanceof vs getClass()
Очень частая ловушка на собеседованиях 👇
На первый взгляд, оба варианта делают одно и то же — проверяют, к какому классу относится объект. Но разница между ними принципиальная.
🔹 instanceof
Проверяет, является ли объект экземпляром класса или любого его наследника.
if (obj instanceof Animal) { ... }

Вернет true, если obj — это Animal или Dog (наследник Animal)

🔹 getClass()
Сравнивает строго конкретный класс, без учета наследников.
if (obj.getClass() == Animal.class) { ... }

Вернет true только если obj — ровно Animal
Вернет false, если это Dog
👉 Здесь никакого полиморфизма — только точное совпадение.
5
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
С первым апреля!
😁8👍32
⚠️ Перегрузка методов в Java: как компилятор выбирает метод?
🧠 Главное правило:
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%.
👍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
Что теперь выведет код?
Anonymous Quiz
53%
1
40%
2
5%
Ошибка компиляции
3%
Runtime Error