Курсы по Java для новичков
675 subscribers
66 photos
1 video
4 files
73 links
Я Оксана Еськова - преподаватель Вуза с 20-летним стажем.
Научу писать код на Java c нуля.
Курсы c автоматической проверкой задач: https://stepik.org/users/23008752
Все вопросы сюда 👉 @aksana_yaskova
Download Telegram
💡 Статические члены класса в Java — зачем они?
static — это то, что относится не к объекту, а к классу в целом.
🔹 Статические поля — общие для всех объектов
Например, счётчик созданных экземпляров.
🔹 Статические методы — можно вызывать без создания объекта
Классический пример — Math.random().
📌 Основные правила:
• К статическим членам обращаются через имя класса;
• Статический метод не имеет доступа к полям экземпляра напрямую;
• В статическом методе нельзя использовать this;
• Нестатические методы могут обращаться к статическим членам;
• Статические поля инициализируются при первом использовании класса (создание объекта или обращение к static);
• Вызов через объект (obj.method()) допустим, но фактически компилятор заменяет его на вызов через класс.
⚠️ Важно: статические методы нельзя переопределять (override), только скрывать (hide).
Коротко:
static = один на всех 👨‍👩‍👧‍👦
👍6
Заметили? Степик обновил интерфейс задач на программирование…
Как Вам? Мне вообще-то больше нравился старый вариант. Но я известный ретроград 😊
А я напоминаю: распродажа Степика завершится 9 июня. А потом летний застой и повышение цен к осени ☹️. Не только у меня, а вообще.
Задумайтесь: может, стоит запастить курсам впрок?
Если что, ссылки на мои курсы тут:
Основы языка Java
Объектно-ориентированное программирование на Java
Прокачай Java
Java Core: программа курсов
Программа: Java-разработчик [ Java + ООП + SQL + Linux + Git ]
💡 Какие самые частые вопросы на собеседовании по ООП?
🔥 1. База ООП (самое любимое у интервьюеров)
Практически обязательный вопрос:
👉 Абстракция, инкапсуляция, наследование, полиморфизм
Важно не просто знать определения, а уметь объяснить: где это используется в реальном коде, зачем это нужно, и как помогает проектировать системы
⚙️ 2. Интерфейс vs абстрактный класс
Когда использовать интерфейс, а когда абстрактный класс? Можно ли заменить одно другим?
🔁 3. Overloading vs Overriding
Любят задавать каверзные примеры с выводом кода.
🧠 4. Полиморфизм на практике
Где ты его реально использовал в проекте (или учебных задачах)?
🧩 5. Композиция vs наследование
Частый вопрос для более сильных кандидатов:
почему композиция часто лучше наследования
как уменьшить связанность кода
📦 6. Бонус: SOLID-принципы
Не всегда требуют глубоко, но почти гарантированно всплывают.
💬 А какие темы разобрать в отдельных постах?
5👍2
🧠 База ООП: зачем это вообще нужно?
ООП помогает снизить сложность разработки и строить системы, которые можно развивать годами:
✔️ менять код без боли
✔️ переиспользовать логику
✔️ делить систему на понятные части
✔️ масштабировать проект без хаоса
✔️ не сойти с ума от растущей сложности
🔹 Абстракция
Мы описываем объект через главное, убирая лишние детали.
Например: Car — это не набор болтов и проводов, а поведение машины: поехала, остановилась, заправилась.  
💡 В коде это понятные методы, часто собранные в  интерфейсы.
🔹 Инкапсуляция
Мы скрываем внутреннее устройство объекта и даём управляемый доступ к данным.
Например, поле balance нельзя менять напрямую — только через методы deposit() / withdraw().
💡 Это защищает данные от некорректного использования и позволяет менять внутреннюю реализацию класса, не затрагивая код, который его использует.
🔹 Наследование
Позволяет переиспользовать уже существующую логику и расширять её.
class Animal { }
class Dog extends Animal { }
💡 Это экономит время разработки и позволяет сосредоточиться на новых возможностях, а не переписывать базовое поведение.
🔹 Полиморфизм
Один интерфейс — разные реализации. В коде это означает: один и тот же вызов метода может работать по-разному в зависимости от объекта, который его реализует.
Shape s = new Circle();
s.draw();
💡 Это позволяет писать универсальный код на уровне абстракций и хранить разные объекты в одной коллекции.
👍42🔥1
💡 Интерфейс vs абстрактный класс
Когда что использовать и можно ли одно заменить другим?

На первый взгляд кажется, что интерфейс и абстрактный класс — это почти одно и то же:
объекты нельзя создать напрямую, оба задают «контракт» для других классов.

Но разница есть — и она принципиальная 👇

🔹 Интерфейс — описывает поведение, не заботясь о реализации.
Один и тот же интерфейс могут реализовать неродственные классы (например, Flyable для птицы и самолёта).
Класс может реализовать несколько интерфейсов — это ключевое преимущество, которое частично заменяет множественное наследование (например, в C++).

👉 Используй интерфейс, когда:
• нужно задать контракт без привязки к реализации
• класс должен поддерживать несколько ролей
(например: Serializable, Comparable, Runnable)

🔹 Абстрактный класс может содержать поля и методы — как реализованные, так и абстрактные.
Если класс наследуется от абстрактного класса, он не может быть наследником другого класса.

👉 Используй абстрактный класс, когда:
• есть общая базовая реализация и классы тесно связаны между собой
• нужно переиспользовать код базового класса
(например, Shape для всех фигур)

🔥 Идеально — комбинировать оба подхода
(абстрактный класс + интерфейсы для расширения поведения)
🔥4👍2
🔥 Overloading vs Overriding в Java — не путай!
Частый вопрос на собеседованиях и база ООП. Разберёмся быстро 👇
🧩 Overloading (перегрузка)
Это когда в одном классе несколько методов с одинаковым именем, но разными параметрами (разные сигнатуры).
📌 Решается на этапе компиляции
class MathUtils {

int sum(int a, int b) {
return a + b;
}

double sum(double a, double b) {
return a + b;
}

int sum(int a, int b, int c) {
return a + b + c;
}
}

🧬 Overriding (переопределение)
Подкласс меняет поведение метода родителя.
Имя и параметры — те же.
📌 Решается во время выполнения (runtime) → полиморфизм
class Animal {
void makeSound() {
System.out.println("Some sound");
}
}

class Dog extends Animal {
@Override
void makeSound() {
System.out.println("Bark");
}
}

Использование:
Animal a = new Dog();
a.makeSound(); // Bark

💡 Как запомнить:
Overloading — много методов с одним именем
Overriding — меняем поведение метода в наследнике
2🔥1
class A {
void print(int x) {
System.out.println("A int");
}
}

class B extends A {
void print(double x) {
System.out.println("B double");
}
}

public class Main {
public static void main(String[] args) {
A obj = new B();
obj.print(5);
}
}
Что будет выведено на консоль?
Anonymous Quiz
38%
A int
41%
B double
18%
Ошибка компиляции
3%
Runtime Error
👍3
class A {
void show() {
System.out.println("A");
}
}

class B extends A {
void show() {
System.out.println("B");
}
}

public class Main {
public static void main(String[] args) {
A obj = new B();
obj.show();
}
}
👍2
Что будет выведено на консоль?
Anonymous Quiz
35%
A
63%
B
3%
Ошибка компиляции
0%
Runtime Error
Композиция vs наследование в Java
Один из самых частых вопросов при проектировании классов: что выбрать — наследование или композицию?
Оба подхода позволяют переиспользовать код, но делают это по-разному и подходят для разных ситуаций.
🔹 Наследование (Inheritance)
Наследование — это отношение «является» (is-a).
class Animal {
void eat() {
System.out.println("Eating...");
}
}

class Dog extends Animal {
void bark() {
System.out.println("Barking...");
}
}

Здесь Dogявляется Animal. Класс-наследник автоматически получает поведение родителя.
Плюсы:
✔️ Простое повторное использование кода
✔️ Естественно моделирует иерархии
Минусы:
✔️ Жёсткая связность между классами
✔️ Изменения в базовом классе могут ломать наследников
✔️ Ограничение: в Java нет множественного наследования классов
🔹 Композиция (Composition)
Композиция — это отношение «имеет» (has-a).
class Engine {
void start() {
System.out.println("Engine started");
}
}

class Car {
private Engine engine = new Engine();

void start() {
engine.start();
}
}

Car не является Engine, но содержит его.
Плюсы:
✔️ Гибкость (можно менять поведение во время выполнения)
✔️ Лучше подходит для расширяемых систем
Минусы:
✔️ Требует больше кода
🔥 Главное правило - предпочитайте композицию наследованию, если это возможно (Favor composition over inheritance)
Пример сравнения
Через наследование:
class FlyingCar extends Car {
void fly() {}
}

Проблема: машина ≠ самолёт.
Через композицию:
class FlyingAbility {
void fly() {}
}

class Car {
private FlyingAbility flyingAbility;

void fly() {
flyingAbility.fly();
}
}
💡 SOLID-принципы в Java: пишем код, который не ломается через неделю

SOLID — это 5 принципов объектно-ориентированного программирования, которые помогают создавать гибкий, понятный и расширяемый код.

🔹 S — Single Responsibility Principle
Один класс — одна ответственность. Меньше причин для изменения = меньше багов.

🔹 O — Open/Closed Principle
Код открыт для расширения, но закрыт для изменения. Добавляем новое — не ломаем старое.

🔹 L — Liskov Substitution Principle
Наследники должны корректно заменять родительские классы. Без “сюрпризов”.

🔹 I — Interface Segregation Principle
Лучше много маленьких интерфейсов, чем один «жирный».

🔹 D — Dependency Inversion Principle
Зависим от абстракций, а не от конкретных реализаций.

🚀 Итог: SOLID — это не теория ради теории. Это про код, который легче читать, тестировать и поддерживать.

Используешь SOLID — экономишь время себе (и своей команде) в будущем.
3🔥2
Делюсь свежими отзывами о курсе «Основы языка Java».

Спасибо всем, кто находит время их оставить — для меня это действительно очень ценно ❤️
А ещё ваши отзывы помогают другим определиться с траекторией обучения.
⭐️⭐️⭐️⭐️⭐️
Отличный курс, рекомендую всем, кто впервые сталкивается с Java. Так же в курсе содержится полезная информация про JVM (Java Virtual Machine), которая широко распространена в IT. Советую заострить внимание на JVM, полезно получить начальные сведения об этом для общего развития в рамках Computer Science, всем, кто сталкивается с устройством программ, приложений, устройств.
Artur Minnibaev 14 часов назад

 ⭐️⭐️⭐️⭐️⭐️
Отличный курс! Рекомендую всем, кто хочет освоить Основы языка Java с нуля!
Виктор Суглобов 4 дня назад

 ⭐️⭐️⭐️⭐️⭐️ 
Выбрала курс Оксаны Еськовой потому что уже проходила ее курсы по С++ и знала, что все темы будут доступно и подробно объяснены и задачи для закрепления материала интересные, хотя и не всегда даются просто. Так и случилось! Курс очень понравился, прошла его довольно быстро и купила уже остальные ее курсы по Java. И я в предвкушении новых интересных знаний! От всей души благодарю Оксану Ивановну и желаю больших творческих успехов! А тем, кто хочет изучать программирование и получать от этого истинное удовольствие - учитесь на курсах Оксаны Еськовой!
Татьяна Пачина  22 дня назад
int[][] a = {
{10, 20},
{30, 40},
{50, 60}
};

System.out.println(a.length);
System.out.println(a[0].length);
Что выведет программа?
Anonymous Quiz
7%
2 3
65%
3 2
12%
6 2
16%
Ошибка
👍4
int[][] a = new int[2][3];
a[0][1] = 10;
System.out.println(a[1][0]);
👍1
Что будет выведено на консоль?
Anonymous Quiz
8%
Runtime Error
9%
10
32%
0
51%
null
int[][] a = {
{1, 2, 3},
{4, 5, 6}
};
int[] row = a[0];
row[1] = 100;
System.out.println(a[0][1]);
👍1
Что выведет код?
Anonymous Quiz
29%
2
47%
100
6%
0
18%
Runtime error