
Лекции, Кокарева, TR_TKC / 3. Абстрактные классы и интерфейсы
.docx
Абстрактные
классы и интерфейсы
Лекция
3
по дисциплине: Технология разработки
ТК сервисов
СибГУТИ
Автор:
Е.В. Кокорева
1. Обработка исключений
Исключения - это ошибки, возникшие в программе во время её работы.
Все исключения в Java являются объектами. Поэтому они могут порождаться не только автоматически при возникновении исключительной ситуации, но и создаваться самим разработчиком.
Иерархия классов исключений:
В Java все исключения делятся на три типа:
-
контролируемые исключения (checked);
-
неконтролируемые исключения (unchecked), к которым относятся ошибки (Errors);
-
исключения времени выполнения (RuntimeExceptions, потомок класса Exception).
Контролируемые исключения можно и нужно обрабатывать в программе, к этому типу относятся все потомки класса Exception (но не RuntimeException).
Обработка исключения может быть произведена с помощью операторов try…catch…finally.
try…catch…finally
Синтаксис:
try { // попытка выполнения }
catch() { // не получилось }
finally { // выполнится в любом случае }
Выполняется блок try и при возникновении ошибки управление передаётся одному из блоков catch.
Пример
import java.util.Scanner; class Main { public static void main(String[] args) { int[] m = {-1,0,1}; Scanner sc = new Scanner(System.in); try { int a = sc.nextInt(); m[a] = 4/a; System.out.println(m[a]); } catch (ArithmeticException e) { System.out.println("Недопустимая арифмет. операция"); } catch (ArrayIndexOutOfBoundsException e) { System.out.println("Недопустимый индекс массива"); } finally {
System.out.println("Выполнится в любом случае");
} } } //Конец класса
throws
Если метод способен возбуждать исключения, которые он сам не обрабатывает, он должен объявить о таком поведении, чтобы вызывающие методы могли защитить себя от этих исключений.
Для задания списка исключений, которые могут возбуждаться методом, используется ключевое слово throws.
Пример:
public static void main(String[] args) throws Exception {
…
}
2. Абстрактные классы Java
Классы, которые не производят объекты, называются абстрактными. Они необходимы для реализации наследования.
Абстрактным также является класс, имеющий хотя бы один абстрактный метод (не имеющий реализации в данном классе).
Пример:
abstract class Shape { //фигура
public double area, perimeter; //площадь, периметр
public Shape() { //конструктор
this.area = 0;
this.perimeter = 0;
}
abstract double areaCalc();
abstract double perimeterCalc();
}
//вывод результата
public void shapeMethod() {
System.out.println("Площадь фигуры " + this.area);
System.out.println("Периметр фигуры " + this.perimeter);
System.out.println();//отступ
}
} // конец описания класса
Классы-наследники Circle, Triangle и Square должны определить абстрактные методы класса, Shape, чтобы можно было создавать объекты этих классов.
3. Интерфейсы Java
Понятие интерфейса (interface) можно интерпретировать как полностью абстрактный класс. Разработчик интерфейса определяет имена методов, списки аргументов и типы возвращаемых значений, но не тела методов.
Полями интерфейса могут быть только константы (static final).
Интерфейсы могут расширять другие интерфейсы через ключевое слово extends. Класс, который реализует интерфейс, должен содержать ключевое слово implements, а его методы должны быть public.
Интерфейс имеет следующий общий синтаксис:
// Заголовок интерфейса
<модификатор доступа> interface имя интерфейса <extends имя интерфейса>
// Тело интерфейса
<объявления констант>
<объявления прототипов методов>
Пример:
В примере реализована схема наследования, представленная на рисунке:
Код примера:
//Интерфейс
interface InShape { //фигура
double areaCalc(); //нет реализации методов
double perimeterCalc();
public void shapeMethod();
} // конец описания интерфейса
//Класс, реализующий интерфейс
class Shape implements InShape { //фигура
public double area, perimeter; //площадь, периметр
public Shape() { //конструктор
this.area = 0;
this.perimeter = 0;
}
public double areaCalc() {
…
}
public double perimeterCalc() {
…
}
public void shapeMethod() {
…
} } // конец описания класса
Множественное наследование
В Java невозможно наследование от нескольких родителей. Применение интерфейсов позволяет это сделать.
Пример:
Добавим еще интерфейс InDraw и класс Draw, который расширяет (наследует) Shape и реализует InDraw.
Схема взаимодействия представлена на следующем рисунке:
//Ещё один интерфейс
interface InDraw { //фигура
void draw(); //нет реализации методов
} // конец описания интерфейса
//Класс-потомок
public class Polygon extends Shape implements InDraw {
public void draw() {
System.out.println("Polygon draw");
}
}
Пример реализации метода main()
public static void main(String[] args) {
Shape sh0 = new Shape();
InDraw sh1 = new Polygon();
Polygon sh2 = new Polygon();
Shape sh3 = new Polygon();
System.out.print("\nТип объекта " + sh0.getClass().getName());
sh0.shapeMethod();
System.out.print("\nТип объекта " + sh1.getClass().getName());
sh1.draw();
System.out.print("\nТип объекта " + sh2.getClass().getName());
sh2.shapeMethod();
sh2.draw();
System.out.print("\nТип объекта " + sh3.getClass().getName());
sh3.shapeMethod(); } }
Результат работы:
Тип объекта Shape
Площадь фигуры 0.0
Периметр фигуры 0.0
Тип объекта Polygon
Poligon draw
Тип объекта Polygon
Площадь фигуры 0.0
Периметр фигуры 0.0
Poligon draw
Тип объекта Polygon
Площадь фигуры 0.0
Периметр фигуры 0.0
В сетевых приложениях (RMI, CORBA и пр.) интерфейсы служат для удалённого доступа, скрывая реализацию сервера от клиента.
Спасибо
за внимание!