Избранное сообщение

Фетісов В. С. Комп’ютерні технології в тестуванні. Навчально-методичний посібник. 2-ге видання, перероблене та доповнене / Мои публикации

В 10-х годах я принимал участие в программе Европейского Союза Tempus "Освітні вимірювання, адаптовані до стандартів ЄС". В рамк...

Благодаря Интернету количество писателей и поэтов увеличивается в геометрической прогрессии. Поголовье читателей начинает заметно отставать.

суббота, 4 февраля 2017 г.

Абстрактные классы и методы / Программирование на Java

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

Абстрактный метод не завершён. Он состоит только из объявления и не имеет тела:

abstract void yourMethod();
По сути, мы создаём шаблон метода. Например, можно создать абстрактный метод для вычисления площади фигуры в абстрактном классе Фигура. А все другие производные классы от главного класса могут уже реализовать свой код для готового метода. Ведь площадь у прямоугольника и треугольника вычисляется по разным алгоритмам и универсального метода не существует.
Если вы объявляете класс, производный от абстрактного класса, но хотите иметь возможность создания объектов нового типа, вам придётся предоставить определения для всех абстрактных методов базового класса. Если этого не сделать, производный класс тоже останется абстрактным, и компилятор заставит пометить новый класс ключевым словом abstract.
Можно создавать класс с ключевым словом abstract даже, если в нем не имеется ни одного абстрактного метода. Это бывает полезным в ситуациях, где в классе абстрактные методы просто не нужны, но необходимо запретить создание экземпляров этого класса.
В тоже время абстрактный класс не обязательно должен иметь только абстрактные методы. Напомню ещё раз, что если класс содержит хотя бы один абстрактный метод, то он обязан быть сам абстрактным.
Абстрактный класс не может содержать какие-либо объекты, а также абстрактные конструкторы и абстрактные статические методы. Любой подкласс абстрактного класса должен либо реализовать все абстрактные методы суперкласса, либо сам быть объявлен абстрактным. Короче, я сам запутался. Пойду лучше кота поглажу.
Я вернулся. Давайте напишем пример для абстрактного класса.
Допустим, мы хотим создать абстрактный класс СферическийКонь и не менее идиотский класс СферическийКоньВВакууме, наследующий от первого класса.
package ru.alexanderklimov.expresscourse;
public abstract class SphericalHorse {
abstract void neigh();
// абстрактный метод ржать()
void gallop() {
// абстрактный класс может содержать и обычный метод
class SphericalHorseInVacuum extends SphericalHorse {
System.out.println("Куда прёшь?"); } }
}
Когда вы напишете такой код, то студия подчеркнёт второй класс красной волнистой линией и предложит реализовать обязательный метод, который определён в абстрактном классе.
Abstract
Abstract
Соглашаемся и дописываем в созданную заготовку свой код для метода.
@Override
void neigh() {
System.out.println("Чё ты ржёшь?");
}
В главной активности напишем код для щелчка кнопки.
public void onClick(View view) {
SphericalHorseInVacuum horse = new SphericalHorseInVacuum();
horse.neigh(); // на основе абстрактного метода
}
horse.gallop(); // обычный метод
Обратите внимание, что абстрактный класс может содержать не только абстрактные, но и обычные методы.
Раннее мы создавали класс Фигура, у которого был метод вычисления площади фигуры. Метод ничего не делал, так как невозможно вычислить площадь неизвестной фигуры. Поэтому, этот метод можно сделать абстрактным, а в классах, производных от Фигуры, переопределить данный метод.
// абстрактный класс Фигура
abstract class Figure {
double dim2;
double dim1;
dim1 = a;
Figure(double a, double b) { dim2 = b;
// абстрактный метод для вычисления площади
} abstract double area(); }
Triangle(double a, double b) {
// Клас Треугольник class Triangle extends Figure {
double area() {
super(a, b); } // переопределяем метод
public void onClick(View view) {
return dim1 * dim2 / 2; } } // В активности
Triangle triangle = new Triangle(10, 8);
// Figure figure = new Figure(10, 10); // так нельзя
mInfoTextView.append("Площадь равна " + figure.area());
Figure figure; // так можно, так как объект мы не создаем figure = triangle;
}
Фигура - это абстрактное понятие и мы не можем создать универсальный метод для вычисления площади. Поэтому мы создаём другой класс Треугольник и пишем код, вычисляющий площадь треугольника (загляните в учебник геометрии). Также вы можете создать новый класс Прямоугольник и написать свой код для вычисления площади этой фигуры.
Вам вряд ли придётся часто создавать абстрактные классы для своих приложений, но встречаться с ними вы будете постоянно, например, классы AsyncTaskService и др.

Смотри также:

Комментариев нет:

Отправить комментарий