Добавил:
Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
ООП зачет.docx
Скачиваний:
78
Добавлен:
01.04.2022
Размер:
3.08 Mб
Скачать

Переопределение методов

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

Перед переопределяемым методом указывается аннотация @Override. Данная аннотация в принципе не обязательна. При переопределении метода он должен иметь уровень доступа не меньше, чем уровень доступа в базовом класса. Например, если в базовом классе метод имеет модификатор public, то и в производном классе метод должен иметь модификатор public.

Запрет наследования

Хотя наследование очень интересный и эффективный механизм, но в некоторых ситуациях его применение может быть нежелательным. И в этом случае можно запретить наследование с помощью ключевого слова final. Например:

public final class Person {

}

Кроме запрета наследования можно также запретить переопределение отдельных методов. Например, в методе display() запретим его переопределение:

public class Person

//........................

public final void display(){

System.out.println("Имя: " + name);

}

}

Вопрос 9. Полиморфизм. Перегрузка и переопределение.

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

public interface Vegetarian{}

public class Animal{}

public class Deer extends Animal implements Vegetarian{}

Теперь класс Deer считается полиморфным, поскольку он имеет несколько наследований.

Вопрос 10. Ключевое слово final. В java есть ключевое слово – final. Оно может применяться к классам, методам, переменным (в том числе аргументам методов).

Для класса это означает, что класс не сможет иметь подклассов, т.е. запрещено наследование. Это полезно при создании immutable (неизменяемых) объектов, например, класс String объявлен, как final.

public final class String{

}

class SubString extends String{

//Ошибка компиляции

}

Следует также отметить, что к абстрактным классам (с ключевым словом abstract), нельзя применить модификатор final, т.к. это взаимоисключающие понятия.

Для метода final означает, что он не может быть переопределен в подклассах. Это полезно, когда мы хотим, чтобы исходную реализацию нельзя было переопределить.

Для переменных примитивного типа это означает, что однажды присвоенное значение не может быть изменено.

Для ссылочных переменных это означает, что после присвоения объекта, нельзя изменить ссылку на данный объект. Это важно! Ссылку изменить нельзя, но состояние объекта изменять можно.

Вопрос 11. Абстрактные классы и методы

Кроме обычных классов в Java есть абстрактные классы. Абстрактный класс похож на обычный класс. В абстрактном классе также можно определить поля и методы, но в то же время нельзя создать объект или экземпляр абстрактного класса. Абстрактные классы призваны предоставлять базовый функционал для классов-наследников. А производные классы уже реализуют этот функционал.

При определении абстрактных классов используется ключевое слово abstract:

public abstract class Human{

private String name;

public String getName() { return name; }

}

Но главное отличие состоит в том, что мы не можем использовать конструктор абстрактного класса для создания его объекта. Например, следующим образом:

Human h = new Human();

Кроме обычных методов абстрактный класс может содержать абстрактные методы. Такие методы определяются с помощью ключевого слова abstract и не имеют никакой реализации:

public abstract void display();

Производный класс обязан переопределить и реализовать все абстрактные методы, которые имеются в базовом абстрактном классе. Также следует учитывать, что если класс имеет хотя бы один абстрактный метод, то данный класс должен быть определен как абстрактный.

Зачем нужны абстрактные классы? Допустим, мы делаем программу для обслуживания банковских операций и определяем в ней три класса: Person, который описывает человека, Employee, который описывает банковского служащего, и класс Client, который представляет клиента банка. Очевидно, что классы Employee и Client будут производными от класса Person, так как оба класса имеют некоторые общие поля и методы. И так как все объекты будут представлять либо сотрудника, либо клиента банка, то напрямую мы от класса Person создавать объекты не будем. Поэтому имеет смысл сделать его абстрактным. Другим хрестоматийным примером является система геометрических фигур. В реальности не существует геометрической фигуры как таковой. Есть круг, прямоугольник, квадрат, но просто фигуры нет. Однако же и круг, и прямоугольник имеют что-то общее и являются фигурами.