Что будет выведено на консоль? (Код 'A' равен 65)
Anonymous Quiz
34%
A1
12%
B
39%
66
15%
Ошибка компиляции
👍4
public class Main {
public static void main(String[] args) {
System.out.println(2 + 3 + "4");
System.out.println("2" + 3 + 4);
}
}👍3
❤2👍2
Друзья! Тревожные слухи об отключении Телеграмма в России наводят меня на мысли о целесообразности этого канала. Ответьте, пожалуйста, есть ли у Вас проблемы с использованием Телеги?
Anonymous Poll
39%
Все нормально
14%
Да, это проблема
38%
У меня VPN, мне все равно
8%
Я из другой страны
class Animal {
static void info() {
System.out.println("Animal info");
}
void speak() {
System.out.println("Animal speaks");
}
}
class Dog extends Animal {
static void info() {
System.out.println("Dog info");
}
void speak() {
System.out.println("Dog barks");
}
}
public class Main {
public static void main(String[] args) {
Animal a = new Dog();
a.info();
a.speak();
}
}🎉1
Что будет выведено на консоль?
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();
}
}❤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). Это считается плохой практикой.
В подклассе нельзя напрямую обратиться к полю суперкласса по имени
Поле выбирается по типу ссылки, а не по типу объекта.
Поля с одинаковым именем в суперклассе и наследнике — это не переопределение, а скрытие (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
Друзья! Давно хочу сделать универсальный курс, не привязанный к конкретному языку программирования. Есть несколько идей, но пока не могу определиться. Какой вариант Вам кажется самым интересным?
Anonymous Poll
21%
Просто задачник для начинающих с выбором языка программирования для каждой задачи.
58%
Алгоритмы и структуры данных. Объяснение вообще, код на C++ и Java.
11%
C++ VS Java. Одна задача – разные языки: где код совпадает, а где отличается.
54%
Как думать на алгоритмическом собеседовании. (От наивного решения к оптимальному. Типичные ошибки)
4%
Свой вариант (Пишите в комментариях)
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
Что будет выведено на консоль...
Anonymous Quiz
41%
true true
22%
true false
3%
false false
22%
true Ошибка выполнения
14%
Ошибка компиляции
Проверка типа объекта в Java:
Очень частая ловушка на собеседованиях 👇
На первый взгляд, оба варианта делают одно и то же — проверяют, к какому классу относится объект. Но разница между ними принципиальная.
🔹
Проверяет, является ли объект экземпляром класса или любого его наследника.
Вернет true, если obj — это Animal или Dog (наследник Animal)
🔹
Сравнивает строго конкретный класс, без учета наследников.
Вернет
Вернет
👉 Здесь никакого полиморфизма — только точное совпадение.
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
⚠️ Перегрузка методов в 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. Есть ли более «узкий» тип среди кандидатов?
💬 Если хотите — разберём ваш пример.
Такие задачи отлично прокачивают понимание перегрузки.