OOP - elements Flashcards
(17 cards)
Что такое переопределение метода (override)?
Переопределение метода — это когда подкласс заменяет реализацию метода, унаследованного от родителя, своей собственной.
Такой метод выглядит точно так же (то же имя, те же параметры), но выполняет другой код.
Чтобы Java понимала, что мы переопределяем, а не случайно создали новый метод, используется аннотация @Override.
Какие правила переопределения метода в Java?
Метод должен быть унаследован от суперкласса.
Сигнатура (имя и параметры) должна совпадать.
Модификатор доступа не должен быть более ограничительным.
Метод не должен быть private, static или final.
Пример переопределения метода в Java:
class Student {
void sayHello() {
System.out.println(“Hello from Student”);
}
}
class Wizard extends Student {
@Override
void sayHello() {
System.out.println(“Hello from Wizard”);
}
}
Что означает ключевое слово static в Java?
Ключевое слово static означает, что метод или переменная принадлежит классу, а не объекту. Статические методы можно вызывать без создания объекта.
Можно ли переопределить или перегрузить статический метод?
❌ Переопределить (override) нельзя — будет происходить скрытие метода (method hiding), не полиморфизм.
✅ Перегрузить (overload) можно — допустимы методы с той же сигнатурой, но разными параметрами в одном классе.
class Example {
static void greet() {
System.out.println(“Hi!”);
}
static void greet(String name) { System.out.println("Hi " + name + "!"); } }
Пример статического метода в Java с классами Student и Wizard
public class Student {
public static void schoolInfo() {
System.out.println(“All students study at Hogwarts.”);
}
}
public class Wizard extends Student {
public static void schoolInfo() {
System.out.println(“Wizards study special magic at Hogwarts.”);
}
}
public class Main {
public static void main(String[] args) {
Student.schoolInfo(); // All students study at Hogwarts.
Wizard.schoolInfo(); // Wizards study special magic at Hogwarts.
}
}
Статические методы не переопределяются, а скрываются (method hiding). Вызываются по имени класса, а не по объекту.
Что такое класс в Java?
В Java класс — это шаблон или “чертёж”, по которому создаются объекты. Он описывает, какие поля (переменные) и методы (функции) будут у объекта.
public class Student {
String name;
int age;
void printInfo() {
System.out.println(name + “, “ + age);
}
}
Что такое объект в Java?
Объект — это экземпляр класса, созданный в памяти.
это экземпляр класса, то есть реальное представление с конкретными значениями.
Мы создаём объект с помощью ключевого слова new:
Student harry = new Student();
Что такое интерфейс в Java?
Интерфейс — это набор методов без реализации. Классы реализуют его с помощью implements.
interface Flyable {
void fly();
}
class Bird implements Flyable {
public void fly() {
System.out.println(“Bird is flying”);
}
}
интерфейс — это контракт: он определяет, какие методы должен реализовать класс, но не описывает, как они работают.
Какие элементы может содержать класс в Java?
Поля (переменные)
Методы (включая геттеры, сеттеры, toString, equals, hashCode)
Конструкторы
Статические и нестатические блоки инициализации
Вложенные классы и интерфейсы
Аннотации и модификаторы доступа (public, private и др.)
Пример кода с элементами класса
public class Student {
private String name; // поле
public Student(String name) { // конструктор this.name = name; } public void sayHello() { // метод System.out.println("Hi, I'm " + name); } @Override public String toString() { // переопределённый метод return "Student: " + name; } static { // статический блок System.out.println("Class loaded"); } }
Можно ли в конструкторе использовать return? Почему?
В конструкторе можно использовать return; без значения, чтобы досрочно завершить выполнение (например, при проверке условий).
Но нельзя использовать return с объектом или значением, потому что конструкторы не возвращают объекты вручную — это делает JVM.
Пример допустимого кода:
public Student(String name) {
if (name == null) {
System.out.println(“Имя не может быть null”);
return;
}
this.name = name;
}
Можно ли выбрасывать исключения в конструкторе? Зачем это делают?
Да, можно. Это нужно, чтобы не создавать объект с неверными данными. При ошибке можно выбросить исключение — объект не будет создан. Например: throw new IllegalArgumentException().
public Student(String name) throws Exception {
if (name == null || name.isEmpty()) {
throw new Exception(“Имя не может быть пустым”);
}
this.name = name;
}
Нужно ли указывать throws в конструкторе при выбрасывании исключений?
Только если выбрасывается checked-исключение (Exception, IOException и т.п.). Unchecked-исключения (RuntimeException, IllegalArgumentException) можно выбрасывать без throws.
Когда и зачем используется ключевое слово this в Java?
Когда нужно различать параметры и поля.
Если параметр конструктора или метода называется так же, как поле, this помогает явно указать, что мы имеем в виду поле класса. Например:
public Student(String name) {
this.name = name;
}
Для вызова одного конструктора из другого.
С помощью this(…) можно сократить дублирование кода между конструкторами:
public Student(String name) {
this(name, 0); // вызывает другой конструктор
}
Для передачи текущего объекта.
Иногда нужно передать ссылку на текущий объект в другой метод или класс, например:
public Student(String name, Registry registry) {
this.name = name;
registry.addStudent(this); // <– передаём самого себя
}
Что такое модификаторы доступа в Java? Назовите их. Для чего используются?
В Java существуют четыре модификатора доступа: public, protected, private и модификатор по умолчанию (package-private). Они определяют, где можно использовать поля, методы и классы.
private — доступ только внутри текущего класса, часто используется для инкапсуляции данных.
public — доступен в любом классе, применяется для методов, которые должны быть вызваны извне.
protected — доступен в одном пакете и в подклассах.
без модификатора — доступ разрешён только внутри одного пакета.
Я активно использую private для полей, public для методов доступа (геттеры/сеттеры), и protected, когда предполагается наследование. Это помогает мне структурировать код и защищать внутреннее состояние объектов.
Какая разница между String, StringBuffer и StringBuilder?
String — неизменяемый, безопасный, но медленный при изменениях
StringBuilder — изменяемый, быстрый, не потокобезопасный
StringBuffer — изменяемый, потокобезопасный, но медленнее
Какой тип выбрать?
String — если строка не будет меняться
StringBuilder — если нужен быстрый однопоточный код
StringBuffer — если нужен безопасный многопоточный доступ
String s = “Hello”;
s = s + “ World”; // создается новый объект
StringBuilder sb = new StringBuilder(“Hello”);
sb.append(“ World”); // изменяется тот же объект