Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:

java / java-intro_part_2_ibm-developerworks

.pdf
Скачиваний:
69
Добавлен:
11.05.2015
Размер:
4.53 Mб
Скачать

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

Выберитевсеатрибуты (как показано на рисунке5) и нажмитекнопку OK. Eclipseсгенерирует методequals(), который выглядит, как в листинге8.

Листинг 8. Метод equals(), сгенерированныйEclipse

@Override

public boolean equals(Object obj) { if (this == obj)

return true;

if (obj == null) return false;

if (getClass() != obj.getClass()) return false;

Person other = (Person) obj; if (age != other.age)

return false;

if (eyeColor == null) {

if (other.eyeColor != null) return false;

}else if (!eyeColor.equals(other.eyeColor)) return false;

if (gender == null) {

if (other.gender != null) return false;

}else if (!gender.equals(other.gender)) return false;

if (height != other.height) return false;

if (name == null) {

if (other.name != null) return false;

}else if (!name.equals(other.name))

return false;

if (weight != other.weight) return false;

return true;

}

О методеhashCode()пока небеспокойтесь - его можно сохранить или удалить. Методequals(), сгенерированный Eclipse, кажется сложным, но делает он довольно простую вещь: если переданный объект –тот же, что в листинге8, то equals() возвратит значениеtrue. Если переданный объект –это null, он возвратит значениеfalse.

Затем методпроверяет на совпадениеобъекты Class(что означает, что переданный объект должен быть объектом Person). Если они совпадают, то каждоезначениеатрибута переданного объекта проверяется на совпадениесо значением экземпляра Person. Если атрибуты имеют значениеnull (то есть отсутствуют), equals()проверит всечто есть, и если они совпадают, объекты будут считаться равными. Такоеповедениеподойдет недля каждой программы, но для большинства задач это работает.

Упражнение: создание метода equals()дляобъекта Employee

Попробуем создать методequals()для класса Employee, следуя пунктам раздела Автоматическоесозданиеметода. Сгенерировав методequals(), добавьтенадним следующий код:

www.ibm.com/developerworks/ru/edu/j-introtojava2/section2.html

9/11

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

public static void main(String[] args) {

Logger l = Logger.getLogger(Employee.class.getName());

Employee employee1 = new Employee(); employee1.setName("J Smith"); Employee employee2 = new Employee(); employee2.setName("J Smith");

l.info("Q: employee1 == employee2? A: " + (employee1 == employee2)); l.info("Q: employee1.equals(employee2)? A: " + employee1.equals(employee2));

}

Выполнив этот код, вы должны увидеть следующий результат:

Apr 19, 2010 5:26:50 PM com.makotogroup.intro.Employee main

INFO: Q: employee1 == employee2? A: false

Apr 19, 2010 5:26:50 PM com.makotogroup.intro.Employee main

INFO: Q: employee1.equals(employee2)? A: true

В данном случаеодного только совпадения по Nameдостаточно, чтобы equals()посчитал объекты равными. Добавьтек этому другиеатрибуты и посмотрите, что получится.

Упражнение: переопределение toString()

ПомнитеметодprintAudit(), о котором говорилось в самом началеэтого раздела? Если вы подумали, что он сложноват, то были правы! Форматированиесостояниеобъекта в String- столь распространенная операция, что разработчики Java встроили еепрямо в Object, в видеметода, называемого (что неудивительно) toString(). Реализация метода toString()по умолчанию неочень полезна, но она есть в каждом объекте. В этом упражнении мы сделаем методtoString()по умолчанию немного болееполезным.

Если вы подозреваете, что Eclipseв состоянии сгенерировать для вас методtoString(), то вы правы. Вернитесь в Project Explorer и щелкнитеправой кнопкой мыши на классеEmployee, затем выберитеSource >Generate toString().... Вы увидите диалоговоеокно, подобноепоказанному на рисунке5. Выберитевсеатрибуты и нажмитекнопку OK. Код, сгенерированный Eclipseдля Employee, приведен в листинге9.

Листинг 9. Метод toString(), сгенерированныйEclipse

@Override

public String toString() {

return "Employee [employeeNumber=" + employeeNumber + ", salary=" + salary

+", taxpayerIdentificationNumber=" + taxpayerIdentificationNumber

+"]";

}

Код, созданный Eclipseдля toString, несодержит метода toString()суперкласса (суперклассом для Employeeявляется Person). Это можно исправить с помощью Eclipse, сделав следующеепереопределение:

@Override

public String toString() { return super.toString() +

"Employee [employeeNumber=" + employeeNumber + ", salary=" + salary

+", taxpayerIdentificationNumber=" + taxpayerIdentificationNumber

+"]";

}

ДобавлениеtoString()значительно упрощает методprintAudit():

@Override

public void printAudit(StringBuilder buffer) { buffer.append(toString());

}

Теперь toString()выполняет всю тяжелую работу по форматированию текущего состояния объекта, и вы просто беретето, что он возвращает в StringBuilder.

Я рекомендую всегда вставлять методtoString()в свои классы, хотя бы просто для целей поддержки. В какой-то момент вы

www.ibm.com/developerworks/ru/edu/j-introtojava2/section2.html

10/11

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

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

2 из 14 | предыдущая | следующая

Печатьстраницы

Сделать этустраницуобщей

 

 

Помощь

 

Ленты

Конфиденциальность

Портал для студентов

Запрос на использование

Сообщить о нарушениях

Доступность (Английский)

Бизнес-партнеры IBM

материалов developerWorks

Условия использования

 

 

 

 

 

 

 

 

 

 

 

www.ibm.com/developerworks/ru/edu/j-introtojava2/section2.html

11/11

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

IBM

Русский

Войти (или Регистрация)

Техническиематериалы ПробноеПО Сообщество

Введение в Java-программирование: Часть 2. Конструкции реальных приложений

Дополнительные возможности языка Java

Дж. Стивен Перри, главный консультант, Makoto Consulting Group, Inc.

Описание: В Части 1 этого руководства профессиональный Java™-программист Дж. Стивен Перри рассказал о синтаксисе языка Java и библиотеках, требуемых для написания простых Java-приложений. Часть 2 по-прежнему ориентирована на программистов, осваивающих разработку приложений Java, и вводит болеесложныеконструкции программирования, необходимыедля построения Java-приложений, рассчитанных на практическоеприменение. Еетематика охватывает обработку исключений, наследованиеи абстракции, регулярныевыражения, родовыетипы, операции ввода/вывода Java и Java-сериализацию.

Дата: 26.10.2011

Уровеньсложности: простой

Активность: 91195 просмотров

Средний показатель рейтинга (основанный на 55 голосов)

Исключения

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

Основы обработки исключений

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

Чтобы приступить к обработкеисключений, взглянитена код, приведенный в листинге10.

Листинг 10. Видите ошибку?

// . . .

public class Employee extends Person { // . . .

private static Logger logger;// = Logger.getLogger(Employee.class.getName());

public static void main(String[] args) { Employee employee1 = new Employee(); employee1.setName("J Smith");

Employee employee2 = new Employee(); employee2.setName("J Smith");

logger.info("Q: employee1 == employee2? A: " + (employee1 == employee2)); logger.info("Q: employee1.equals(employee2)? A: " + employee1.equals(employee2));

}

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

Exception in thread "main" java.lang.NullPointerException at com.makotogroup.intro.Employee.main(Employee.java:54)

Он говорит о том, что вы пытаетесь сослаться на несуществующий объект, что является довольно серьезной ошибкой

www.ibm.com/developerworks/ru/edu/j-introtojava2/section3.html

1/3

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

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

Блокиtry,catchиfinally

В листинге11 приведен кодс ошибкой из листинга 10, очищенный с помощью стандартных блоков для обработки

исключений try, catchи finally.

Листинг 11. Вылавливание исключений

// . . .

public class Employee extends Person { // . . .

private static Logger logger;// = Logger.getLogger(Employee.class.getName());

public static void main(String[] args) { try {

Employee employee1 = new Employee(); employee1.setName("J Smith"); Employee employee2 = new Employee(); employee2.setName("J Smith");

logger.info("Q: employee1 == employee2? A: " + (employee1 == employee2)); logger.info("Q: employee1.equals(employee2)? A: " + employee1.equals(employee2));

}catch (NullPointerException npe) { // Обработка...

System.out.println("Yuck! Outputting a message with System.out.println() " + "because the developer did something dumb!");

}finally {

// Всегда выполняется

}

}

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

В листинге11 программа восстанавливается послеошибки и выводит сообщениео том, что произошло.

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

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

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

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

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

В случаеисключения механизм времени выполнения языка Java ищет обработчик исключений где-то впереди. Если он достигнет вершины стека, ненайдя его, он внезапно остановится, как мы видели в листинге10.

Несколько блоковcatch

Блоков catchможет быть несколько, но они должны быть определенным образом структурированы. Если какие-то исключения являются подклассами других исключений, то дочерниеклассы размещаются передродительскими классами в порядкеследования блоков catch. Вот пример:

try {

//Код...

}catch (NullPointerException e) {

//Обработка NPE...

}catch (Exception e) {

//Обработка других общих исключений...

www.ibm.com/developerworks/ru/edu/j-introtojava2/section3.html

2/3

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

В этом примереNullPointerException- это дочерний класс (в конечном счете) исключения Exception, так что его следует поместить передболееобщим блоком Exception catch.

Здесь мы всего лишь касаемся темы обработки исключений Java. На эту тему можно написать отдельноеруководство. Подробнееоб обработкеисключений в Java-программах можно узнать по ссылкам в разделеРесурсы.

3 из 14 | предыдущая | следующая

Печатьстраницы

Сделать этустраницуобщей

 

 

Помощь

 

Ленты

Конфиденциальность

Портал для студентов

Запрос на использование

Сообщить о нарушениях

Доступность (Английский)

Бизнес-партнеры IBM

материалов developerWorks

Условия использования

 

 

 

 

 

 

 

 

 

 

 

www.ibm.com/developerworks/ru/edu/j-introtojava2/section3.html

3/3

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

IBM

Русский

Войти (или Регистрация)

Техническиематериалы ПробноеПО Сообщество

Введение в Java-программирование: Часть 2. Конструкции реальных приложений

Дополнительные возможности языка Java

Дж. Стивен Перри, главный консультант, Makoto Consulting Group, Inc.

Описание: В Части 1 этого руководства профессиональный Java™-программист Дж. Стивен Перри рассказал о синтаксисе языка Java и библиотеках, требуемых для написания простых Java-приложений. Часть 2 по-прежнему ориентирована на программистов, осваивающих разработку приложений Java, и вводит болеесложныеконструкции программирования, необходимыедля построения Java-приложений, рассчитанных на практическоеприменение. Еетематика охватывает обработку исключений, наследованиеи абстракции, регулярныевыражения, родовыетипы, операции ввода/вывода Java и Java-сериализацию.

Дата: 26.10.2011

Уровеньсложности: простой

Активность: 91195 просмотров

Средний показатель рейтинга (основанный на 55 голосов)

СозданиеJava-приложений

В этом разделемы продолжим наращивать Personв качествеJava-приложения. По ходу дела вы получителучшее представлениео том, как объект или коллекция объектов перерастает в приложение.

Элементы Java-приложения

Каждому Java-приложению требуется точка входа, чтобы система Java времени выполнения знала, откуда начать выполнение кода. Такой точкой входа служит методmain(). Объекты предметной области обычно неимеют методов main(), но, по крайней мере, один класс в каждом приложении должен его иметь.

Начиная с Части 1, мы работаем с примером приложения для отдела кадров, котороевключает в себя класс Personи его подклассы Employee. Теперь вы увидите, что происходит при добавлении к приложению нового класса.

Создание классадрайвера

Цель класса драйвера (как следует из названия) состоит в том, чтобы "вести" приложение. Обратитевнимание, что этот простой драйвер для кадрового приложения содержит методmain():

package com.makotogroup.intro;

public class HumanResourcesApplication { public static void main(String[] args) {

}

}

Создадим класса драйвера в Eclipse, используя ту жепроцедуру, которую мы применяли для создания классов Personи Employee. Назовем этот класс HumanResourcesApplicationи незабудем выбрать добавлениек классу метода main(). Eclipse сгенерирует класс.

Добавим немного кода в свой новый класс main(), чтобы он выглядел примерно так:

public static void main(String[] args) { Employee e = new Employee(); e.setName("J Smith"); e.setEmployeeNumber("0001");

e.setTaxpayerIdentificationNumber("123-45-6789"); e.printAudit(log);

}

www.ibm.com/developerworks/ru/edu/j-introtojava2/section4.html

1/2

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

Теперь запустим класс HumanResourcesApplicationи последим за его выполнением. Вы должны увидеть следующий результат (обратная косая черта здесь указывает на продолжениестроки):

Apr 29, 2010 6:45:17 AM com.makotogroup.intro.Person printAudit

INFO: Person [age=0, eyeColor=null, gender=null, height=0, name=J Smith,\ weight=0]Employee [employeeNumber=0001, salary=null,\ taxpayerIdentificationNumber=123-45-6789]

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

4 из 14 | предыдущая | следующая

Печатьстраницы

Сделать этустраницуобщей

 

 

Помощь

 

Ленты

Конфиденциальность

Портал для студентов

Запрос на использование

Сообщить о нарушениях

Доступность (Английский)

Бизнес-партнеры IBM

материалов developerWorks

Условия использования

 

 

 

 

 

 

 

 

 

 

 

www.ibm.com/developerworks/ru/edu/j-introtojava2/section4.html

2/2

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

IBM

Русский

Войти (или Регистрация)

Техническиематериалы ПробноеПО Сообщество

Введение в Java-программирование: Часть 2. Конструкции реальных приложений

Дополнительные возможности языка Java

Дж. Стивен Перри, главный консультант, Makoto Consulting Group, Inc.

Описание: В Части 1 этого руководства профессиональный Java™-программист Дж. Стивен Перри рассказал о синтаксисе языка Java и библиотеках, требуемых для написания простых Java-приложений. Часть 2 по-прежнему ориентирована на программистов, осваивающих разработку приложений Java, и вводит болеесложныеконструкции программирования, необходимыедля построения Java-приложений, рассчитанных на практическоеприменение. Еетематика охватывает обработку исключений, наследованиеи абстракции, регулярныевыражения, родовыетипы, операции ввода/вывода Java и Java-сериализацию.

Дата: 26.10.2011

Уровеньсложности: простой

Активность: 91195 просмотров

Средний показатель рейтинга (основанный на 55 голосов)

Наследование

В данном руководствемы уженесколько раз встречались с примерами наследования. В этом разделеповторяется кое-что из материала Части 1 о наследовании и болееподробно объясняется, как работает наследованиевключая иерархию наследования, конструкторы и наследование, а такжеабстракцию наследования.

Как работает наследование

Классы в Java-коденаходятся в иерархиях. Классы, которыепо иерархии находятся вышеданного класса, называются суперклассами этого класса. Каждый конкретный класс является подклассом каждого класса, расположенного в иерархии вышеего. Подкласс наследует свойства своего суперкласса. Класс java.lang.Objectнаходится в вершинеиерархии классов, то есть каждый класс Java является подклассом Objectи наследует его свойства.

Например, предположим, что существует класс Person, который выглядит как в листинге12.

Листинг 12. Public-класс Person

package com.makotogroup.intro;

// . . .

public class Person {

public static final String GENDER_MALE = "MALE"; public static final String GENDER_FEMALE = "FEMALE"; public Person() {

//Делать больше нечего......

}

private String name; private int age; private int height; private int weight;

private String eyeColor; private String gender;

// . . .

}

Класс Personв листинге12 неявно наследует свойства Object. Так как это предполагается для каждого класса, ненужно вводить фразу extends Objectдля каждого определяемого класса. Но что означает, что класс наследует свойства своего суперкласса? Лишь то, что Personимеет доступ к представленным переменным и методам своего суперкласса. В данном случаеPersonможет "видеть" и использовать общедоступныеметоды и переменныеобъекта Object, а такжеего защищенныеметоды и переменные.

www.ibm.com/developerworks/ru/edu/j-introtojava2/section5.html

1/6

02.09.13Введениев Java-программирование: Часть 2. Конструкцииреальныхприложений

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

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

public class Employee extends Person {

private String taxpayerIdentificationNumber; private String employeeNumber;

private BigDecimal salary; // . . .

}

Множественное и одиночное наследование

Такиеязыки, как C++, поддерживают концепцию множественного наследования: в любой точкеиерархии класс может наследовать свойства одного или нескольких классов. Язык Java поддерживает только одиночноенаследование, то есть ключевоеслово extendsможно использовать только с одним классом. Так что иерархия классов для любого заданного класса Java всегда состоит из прямой, охватывающей весь путь вплоть до java.lang.Object.

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

Граф наследования для Employeeуказывает на то, что Employeeимеет доступ ко всем общедоступным и защищенным переменным и методам Person(потому что он непосредственно расширяет его), а такжеObject(потому что он фактически расширяет и этот класс, хотя и опосредованно). Однако поскольку Employeeи Personнаходятся в одном и том жепакете, Employeeимеет такжедоступ к переменным и методам package-private(их ещеиногда называют дружественными (friendly)) класса Person.

Чтобы углубиться в иерархию классов ещена один шаг, можно создать третий класс, который расширяет Employee:

public class Manager extends Employee { // . . .

}

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

Конструкторы и наследование

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

Основы конструкторов

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

public class Person { public Person() {

}

}

У каждого класса есть по крайней мереодин конструктор, и если явно неопределить конструктор для класса, то компилятор сгенерирует так называемый конструктор по умолчанию. Следующееопределениекласса функционирует точно так же, как предыдущее:

public class Person {

}

Вызовконструкторасуперкласса

www.ibm.com/developerworks/ru/edu/j-introtojava2/section5.html

2/6

Соседние файлы в папке java