Лекция 5. Объектно-ориентированный подход для создания сложных сценариев




Приступим к рассмотрению способов совершенствования класса Person, в том числе:

 перегрузка методов;

 переопределение методов;

 сравнение одного объекта с другим;

Перегружаемые методы

Два или несколько методов с одинаковыми именами, но с разными списками аргументов (сигнатурами) называются перегружаемыми (overloaded) методами. Перегружаемые методы всегда располагаются в одном и том же классе, и во время выполнения программы среда исполнения Java (Java Runtime Environment - JRE, или Java Runtime) принимает решение, какой вариант перегружаемого метода вызывается, в зависимости от передаваемых ему аргументов.

Существует два простых правила перегрузки методов, при нарушении которых компилятор выдает сообщение об ошибке:

 нельзя перегружать метод, изменив тип возвращаемого им значения;

 не должно быть двух методов с одной сигнатурой.

Переопределяемые методы

Классы в Java-коде существуют в определенной иерархии. Классы, находящиеся выше данного класса в иерархии, являются суперклассами данного класса. Любой конкретный класс является подклассом каждого класса, находящегося выше в иерархии. Подкласс наследует свойства и поведение своих суперклассов. На вершине иерархии каждого класса находится объект Object. Другими словами, каждый класс является подклассом (и наследует из него) класса Object.

Если подкласс некоторого класса создает свою собственную реализацию метода, определенного в родительском классе (суперклассе), то используется переопределение метода (Overriding). Мы уже рассматривали такую ситуацию при описании наследования и полиморфизма.

Чтобы проанализировать возможности переопределения методов, введем в рассмотрение класс Employee, который является подклассом (или дочерним классом) суперкласса Person, наследующим его атрибуты и поведение, и добавляет специфические особенности.

Члены класса

Переменные и методы, определенные в классах Person и Employee, являются переменными и методами экземпляров класса. Чтобы получить доступ к ним, необходимо иметь ссылку на экземпляр класса. Каждый экземпляр класса (объект) имеет переменные и методы, и для каждого из объектов конкретное поведение будет отличаться, поскольку оно основано на состоянии экземпляра класса, т.е. на значении атрибутов объекта.

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

 каждый экземпляр класса - объект - совместно использует общую копию переменной класса;

 методы класса вызываются в самом классе без создания экземпляра класса;

 методы экземпляра имеют доступ к переменным класса, а методы класса не имеют доступа к переменным экземпляра;

 методы класса могут обращаться только к переменным класса.

Определение переменных и методов класса

Использование переменных и методов класса полезно в ряде случаев, а именно:

 для объявления констант, чтобы любой экземпляр класса получал к ним доступ;

 для отслеживания "счетчиков" созданных экземпляров класса;

 для класса с методами утилитами, когда экземпляр класса не понадобится (например, ранее применяемый метод print() класса Person).

Переменные класса

Для объявлении переменной класса используется ключевое слово static:

<модификатор доступа> static <тип данных> <имя переменной> [= <начальное значение>];

(Здесь квадратные скобки указывают на необязательность того, что в них заключено и не являются частью синтаксиса объявления.)

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

В Java используются следующие правила объявления констант:

 имена записываются прописными буквами;

 имена состоят из нескольких слов, разделенных символами подчеркивания (_);

 используется ключевое слово final (значения окончательны, и не могут быть изменены);

 объявляются с модификатором доступа public (доступны для других классов, которым необходимо ссылаться на их значения по имени).

Методы класса

Для объявлении метода класса используется ключевое слово static:

<модификатор доступа> static <тип возвращаемого значения>

<имя метода>([<список аргументов>])

(Здесь квадратные скобки указывают на необязательность того, что в них заключено и не являются частью синтаксиса объявления.)

Также методы класса иногда еще называют статическими методами.

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

Использование методов класса

В классе Person метод print объявлен как статический, и по этой причине является методом класса. В этой связи для использования данного метода отсутствует необходимость создавать экземпляр класса Person при использовании данного метода. Если в классе Person для вызова метода print достаточно просто указать его имя, то для использования метода вне класса нужно использовать имя класса, в котором метод объявлен: Person.print("");

Сравнение объектов

Язык Java предоставляет два способа сравнения объектов:

 с использованием оператора "==";

 с использованием метода equals().

Сравнение объектов с помощью оператора "=="

Оператор "==" сравнивает объекты на равенство, так что выражение a == b возвращает значение истина (true), если а и b имеют одно и то же значение. Для объектов это означает, что оба ссылаются на один и тот же экземпляр объекта. Для примитивных типов это означает, что значения идентичны.

Сравнение объектов с помощью метода equals()

equals() - это метод, который каждый объект языка Java наследует от метода экземпляра java.lang.Object. Вызывается метод equals() точно так же, как любой другой метод - a.equals(b); - оператор вызывает метод equals() объекта а, передавая ему ссылку на объект b. При использовании данного метода в Java-программе по умолчанию при проверке на эквивалентность выполняется с помощью синтаксиса ==. Однако поскольку equals() - это метод, его можно переопределить.

Как правило, разработчкики определяют метод equals() в соответствии с создаваемым приложением.

Исключения- Exception

Не существует сложной программы, которая выполняется правильно во всех случаях, и язык Java поддерживает механизм обработки ситуаций, в которых код может работать не совсем так, как предусматривает алгоритм вычислений.

Exception (Исключение) - это событие, которое происходит во время выполнения программы, нарушая нормальный ход выполнения ее команд. Обработка исключений - важная часть Java-программирования, которая позволяет помещать потенциально опасный код в блок try (что означает: "попробуем так и посмотрим, вызовет ли это исключение") и добавлять средства для обнаружения исключений (ошибок) различного типа.

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

Scanner in = new Scanner(System.in);

int input;

System.out.print("Введите целое число: ");

input = Integer.parseInt(in.next());//для ввода int

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

Exception in thread "main" java.lang.NumberFormatException: For input string: "4r"

at java.lang.NumberFormatException.forInputString(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at java.lang.Integer.parseInt(Unknown Source)

at ru.ifmo.practicejava.Except.main(Except.java:12)

В сообщении говорится о том, что произошло исключение (NumberFormatException), связанное с преобразованием в числовое значение введенного пользователем набора символов с клавиатуры. Конечно же, уж не пользователю следует разбираться в этом, достаточно информативном для разработчика, сообщении об ошибке, и разработчику программы следует не допускать таких ситуаций.

В процессе выполнения программы на языке Java, как правило, имеется связь с внешней средой (пользователями, ресурсами файловых систем, связностью с сетевыми ресурсами и т.п.), которая не является предсказуемой и, в этой связи, несет потенциальную угрозу успешному выполнению программы.

Java предоставляет возможность использования блоков try - catch-finally, чтобы пытаться выявлять и программно обрабатывать ошибки времени исполнения.

Блоки try, catch и finally

В ниже следующем классе реализован цикл ввода данных от пользователя, до тех пор, пока не будет введено правильное значение. Здесь используются стандартные блоков для обработки исключений try, catch и finally.

package ru.ifmo.practicejava;

import java.util.Scanner;

public class Except {

public static void main(String[] args) {

// TODO Auto-generated method stub

Scanner in = new Scanner(System.in);

int input = 0;

Boolean er = true;

while (er) {

System.out.print("Введите целое: ");

try {

input = Integer.parseInt(in.next());// для ввода int

er=false;

} catch (NumberFormatException nfe) {

System.out.println("Придется повторить - неверный формат данных"+nfe.getMessage());

in.nextLine(); // Очищаем поток

continue;

} finally {

if (er) System.out.println("Пока еще значение равно = " + input);

}

}

System.out.println("Вы ввели целое число = " + input);

in.close();

}

}

Блоки try, catch и finally вместе образуют "капкан для ловли исключений". Вначале код, который является потенциально опасным и может вызвать исключение, заключается в состав оператора try.

Если предполагаемое исключение происходит, управление сразу передается соответствующему блоку catch, который обрабатывает исключение. Когда один или оба оператора выполнены, управление передается блоку finally, который выполняется всегда, вне зависимости от того, имело место исключение или нет. "Поймав" исключение, можно попытаться аккуратно обойти его или же выйти из программы (или метода).

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

Иерархия исключений

Язык Java поддерживает иерархию исключений, состоящую из большого количества типов исключений, сгруппированных в две основные категории:

Контролируемые исключения проверяются компилятором (то есть компилятор проверяет, что ваш код где-то обрабатывает их).

Неконтролируемые исключения (или исключения времени выполнения) не проверяются компилятором.

Контролируемые исключения представляют собой ошибки, которые можно и нужно обрабатывать в программе, к этому типу относятся все потомки класса Exception. Они проверяются компилятором (то есть компилятор проверяет, что ваш код где-то обрабатывает их, а Eclipse будет этому способствовать).

Исключения делятся на несколько классов, но все они имеют общего предка — класс java.lang.Throwable. Только объекты этого класса или его наследники могут вызваны JVM при возникновении какой-нибудь исключительной ситуации, а также только эти объекты могут вызывать исключения во время выполнения программы с помощью ключевого слова throw. Потомками этого класса являются подклассы Exception и Error.

Error - это подкласс, который представляет серьезные проблемы, возникающие во время выполнения приложения. Большинство из этих ошибок сигнализируют о ненормальном ходе выполнения программы, т.е. о наступлении критических проблемах и эти ошибки не рекомендуется отмечать в методах посредством throws-объявления, и поэтому они называются не проверяемые (unchecked).

Exception - это подкласс в иерархии, на который при программировании на Java следует уделять основное внимание. Этот уровень иерархии также разделяется на две ветви: исключения, производные от класса RuntimeException, и IOExeption. Исключения типа RuntimeException возникают вследствие ошибок программирования. Исключения типа IOExeption являются следствием непредвиденного стечения обстоятельств, возникающих, как правило, из-за ошибок ввода-вывода, при выполнении вполне корректных программ.

Ниже представлены некоторые типы исключений, наследованные от RuntimeException:

 IndexOutOfBoundsException - выбрасывается (thrown), когда указанный индекс некоторого элемента в структуре данных (массив/коллекция) не попадает в диапазон существующих индексов.

 NullPointerException - выбрасывается, когда ссылка на объект, к которому выполняется обращение не определен и содержит значение null.

 ClassCastException – выбрасывается, когда происходит ошибка приведения типов. Всякий раз при приведении типов выполняется проверка на возможность приведения (проверка осуществляется с помощью оператора instanceof.

 ArithmeticException - выбрасывается, когда выполняются недопустимые арифметические операции, например деление на ноль.

Типы исключений, наследованные от класса Error:

 ThreadDeath - вызывается при неожиданной остановке потока посредством метода Thread.stop().

 StackOverflowError - ошибка переполнение стека. Часто возникает в рекурсивных функциях из-за неправильного условия выхода.

 OutOfMemoryError - ошибка переполнения памяти.

Когда программа вызывает исключение, говорят, что она выбрасывает (throws) его. Если метод способен выбрасывать исключения, которые он сам не обрабатывает, он должен объявить об этом, чтобы вызывающие его методы могли обеспечить обработку этих исключений. Для определения списка исключений, которые могут выбрасываться методом, используется оператор throws. Если метод в явном виде (т.е. с помощью оператора throw) выбрасывает исключение соответствующего класса, тип класса исключений должен быть указан в операторе throws в объявлении этого метода.

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

В Java имеется пять ключевых операторов для работы с исключениями:

 try - данное ключевое слово используется для отметки начала блока кода, который потенциально может привести к ошибке.

 catch - ключевое слово для отметки начала блока кода, предназначенного для перехвата и обработки исключений.

 finally - ключевое слово для отметки начала блока кода, которое является дополнительным. Этот блок помещается после последнего блока catch. Управление обычно передаётся в блок finally в любом случае.

 throw - служит для генерации исключений. Оператор throw используется для возбуждения исключения «вручную».

 throws - ключевое слово, которое прописывается в сигнатуре метода и обозначающее, что метод потенциально может выбросить исключение с указанным типом.



Поделиться:




Поиск по сайту

©2015-2024 poisk-ru.ru
Все права принадлежать их авторам. Данный сайт не претендует на авторства, а предоставляет бесплатное использование.
Дата создания страницы: 2021-05-26 Нарушение авторских прав и Нарушение персональных данных


Поиск по сайту: