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

java / java-intro_part_2_ibm-developerworks

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

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

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

Листинг 13. Инициализациянового объекта Employee

public class Person { private String name; public Person() {

}

public Person(String name) { this.name = name;

}

}

// Между тем, в Employee.java

public class Employee extends Person { public Employee() {

super("Elmer J Fudd");

}

}

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

Листинг 14. Единообразныйвызовсуперкласса

public class Person { private String name;

public Person(String name) { this.name = name;

}

}

// Между тем, в Employee.java

public class Employee extends Person { public Employee(String name) { super(name);

}

}

Объявление конструктора

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

public class Person { public Person() {

}

}

// Между тем, в Employee.java

public class Employee extends Person { public Employee() {

}

}

или:

public class Person { public Person() {

}

}

// Между тем, в Employee.java

public class Employee extends Person { public Employee() {

super();

}

}

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

3/6

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

Конструкторы без аргументов

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

public class Person { private String name;

public Person(String name) { this.name = name;

}

}

// Между тем, в Employee.java

public class Employee extends Person { public Employee() {

}

}

В этом примеренет конструктора по умолчанию, потому что он содержит альтернативный конструктор без включения явного конструктора по умолчанию. Поэтому конструктор по умолчанию иногда называют конструктором без аргументов (no-arg); поскольку существуют условия, при которых он невключается, это несовсем конструктор по умолчанию.

Какконструкторы вызывают конструкторы

Конструктор может быть вызван другим конструктором изнутри класса с использованием ключевого слова thisи списка аргументов. Как и super(), вызов this()должен быть первой строкой конструктора. Например:

public class Person { private String name; public Person() {

this("Some reasonable default?");

}

public Person(String name) { this.name = name;

}

}

// Между тем, в Employee.java

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

Уровнидоступа кконструкторам

Конструкторы могут иметь любой уровень доступа; при этом применяются определенныеправила видимости. Правила доступа для конструкторов приведены в таблице1.

Таблица 1. Правила доступа кконструкторам Модификатор доступа кконструктору Описание

public

Конструктор может быть

protected

Конструктор может быть

Без модификатора (package-private)

Конструктор может быть

private

Конструктор может быть

вызван любым классом.

вызван классом из того жепакета или любым подклассом. вызван любым классом из того жепакета.

вызван только тем классом, в котором он определен.

Можно придумать случаи, когда конструкторы объявляются как protectedили дажеpackage-private, но зачем нужен конструктор private? Яиспользовал конструкторы private, когда нехотел допустить прямого создания объекта с помощью ключевого слова newпри реализации, скажем, модели Factory (см. раздел Ресурсы). В этом случаедля создания экземпляров класса может использоваться статический метод, и этот метод, будучи включенным в сам класс, может вызвать конструктор private.

Наследованиеи абстракция

Если подкласс переопределяет методиз суперкласса, этот метод, по существу, скрыт, потому что вызов этого метода с помощью ссылки на подкласс вызывает версии метода подкласса, а неверсию суперкласса. Это неозначает, что метод суперкласса становится недоступным. Подкласс может вызвать методсуперкласса, добавив передименем метода ключевое слово super(и в отличиеот правил для конструкторов, это можно сделать в любой строкеметода подкласса или дажесовсем

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

4/6

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

другого метода). По умолчанию Java-программа вызывает методподкласса, если он вызывается с помощью ссылки на подкласс.

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

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

Абстрактные классы иметоды

Бывают моменты, когда нужно создавать классы, которыеслужат только как абстракции, и создавать их экземпляры, быть может, никогда непридется. Такиеклассы называются абстрактными классами. К тому жевы обнаружите, что бывают моменты, когда определенныеметоды должны быть реализованы по-разному для каждого подкласса, реализуемого суперклассом. Это абстрактные методы. Вот некоторыеосновныеправила для абстрактных классов и методов:

любой класс может быть объявлен абстрактным;

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

абстрактный методнеможет содержать тела метода; класс, содержащий абстрактный метод, должен объявляться как абстрактный.

Использование абстрагирования

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

public abstract class Employee extends Person { // и т.д.

}

Если вы попытаетесь выполнить этот код, вы получитеошибку компиляции:

public void someMethodSomwhere() {

Employee p = new Employee();// ошибка компиляции!!

}

Компилятор жалуется, что Employee- это абстрактный класс, и его экземпляр неможет быть создан.

Возможностиабстрагирования

Предположим, что вам нужен методдля изучения состояния объекта Employeeи проверки его правомерности. Это требованиеможет показаться общим для всех объектов Employee, но между всеми потенциальными подклассами поведение будет существенно различаться, что дает нулевой потенциал для повторного использования. В этом случаевы объявляете методvalidate()как абстрактный(заставляя всеподклассы реализовывать его):

public abstract class Employee extends Person { public abstract boolean validate();

}

Теперь каждый прямой подкласс Employee(такой как Manager) должен реализовать методvalidate(). Однако как только подкласс реализовал методvalidate(), ни одному из его подклассов непридется этого делать.

Например, предположим, что имеется объект Executive, который расширяет класс Manager. Такоеопределениебыло бы вполнедопустимо:

public class Executive extends Manager { public Executive() {

}

}

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

5/6

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

Когда (не) следует абстрагировать: два правила

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

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

Присвоения: классы

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

Manager m = new Manager(); Employee e = new Employee(); Person p = m; // нормально

p = e; // тоже нормально

Employee e2 = e; // да, так можно e = m; // тоже нормально

e2 = p; // Неверно!

Вызываемая переменная должна быть супертипом класса, принадлежащего к источнику ссылки, иначекомпилятор выдаст сообщениеоб ошибке. В принципе, все, что справа от присвоения, должно быть подклассом или тем жеклассом, того, что слева. В противном случаепри присвоении объектов с разными графами наследования (например, Managerи Employee)

можно присвоить переменную недопустимого типа. Рассмотрим следующий пример:

Manager m = new Manager();

Person p = m; // пока все хорошо

Employee e = m; // нормально

Employee e = p; // Неверно!

Employee(сотрудник) - это Person(человек), но это определенно неManager(начальник), и компилятор следит за этим.

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

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

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

 

 

Помощь

 

Ленты

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

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

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

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

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

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

материалов developerWorks

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

 

 

 

 

 

 

 

 

 

 

 

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

6/6

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.

Определениеинтерфейса

Интерфейс - это именованный набор моделей поведения (и/или постоянных элементов данных), который должен обеспечить реализатор. Интерфейс определяет поведениереализации, но нето, каким образом оно достигается.

Определить интерфейс легко:

public interface interfaceName { returnType methodName( argumentList );

}

Объявлениеинтерфейса выглядит как объявлениекласса, за исключением того, что при этом используется ключевоеслово interface. Интерфейс можно назвать как угодно (в соответствии с правилами языка), но, по соглашению, имена интерфейсов выглядят так же, как имена классов.

Методы, определенныев интерфейсе, неимеют тела метода. За предоставлениетела метода отвечает реализатор интерфейса (как в случаес абстрактными методами).

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

public class Manager extends Employee implements BonusEligible, StockOptionRecipient { // и т.д.

}

Интерфейсы-маркеры

Интерфейс может вообщенеиметь никакого тела. На самом деле, вполнеприемлемо следующееопределение:

public interface BonusEligible {

}

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

1/3

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

Вообщеговоря, такиеинтерфейсы называются интерфейсами-маркерами (marker interfaces), потому что они маркируют класс как реализацию этого интерфейса, но непредлагают особого явного поведения.

Зная всеэто, интерфейс определить очень легко:

public interface StockOptionRecipient {

void processStockOptions(int numberOfOptions, BigDecimal price);

}

Реализация интерфейсов

Чтобы использовать интерфейс, его нужно реализовать, что означает просто предоставлениетела метода, которое, в свою очередь, обеспечивает поведениедля решения задачи интерфейса. Это делается с помощью ключевого слова implements:

public class className extends superclassName implements interfaceName { // Тело класса

}

Предположим, что мы реализуем интерфейс StockOptionRecipientдля класса Manager, как показано в листинге15.

Листинг 15. Реализацияинтерфейса

public class Manager extends Employee implements StockOptionRecipient { public Manager() {

}

public void processStockOptions (int numberOfOptions, BigDecimal price) { log.info("I can't believe I got " + number + " options at $" + price.toPlainString() + "!"); }

}

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

Создание интерфейсов в Eclipse

Если вы решите, что один из классов должен реализовать интерфейс, Eclipseлегко сгенерирует правильную сигнатуру метода. Для реализации интерфейса достаточно изменить сигнатуру класса. Eclipseподчеркивает класс красной волнистой линией, помечая его как ошибочный, потому что класс несодержит метода (методов) интерфейса. Щелкнитекнопкой мыши на имени класса, нажмитеCtrl +1, и Eclipseпредложит подсказки. Выберитеиз них Add Unimplemented Methods (Добавить нереализованныеметоды), и Eclipseсгенерирует методы, поместив их в нижнюю часть исходного файла.

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

должен реализовать всеметоды, нереализованныеиерархией.

Использованиеинтерфейсов

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

Листинг 16. Присвоение нового экземпляра Managerссылке StockOptionEligible

public static void main(String[] args) {

StockOptionEligible soe = new Manager();// Вполне допустимо calculateAndAwardStockOptions(soe); calculateAndAwardStockOptions(new Manager());// Тоже работает

}

. . .

public static void calculateAndAwardStockOptions(StockOptionEligible soe) { BigDecimal reallyCheapPrice = BigDecimal.valueOf(0.01);

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

2/3

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

int numberOfOptions = 10000; soe.processStockOptions(numberOfOptions, reallyCheapPrice);

}

Как видите, вполнедопустимо назначить новый экземпляр ManagerссылкеStockOptionEligible, а такжепередать новый экземпляр Managerметоду, который ожидает ссылку StockOptionEligible.

Присвоения: классы

Из класса, реализующего интерфейс, можно присвоить ссылку переменной типа interface, но существуют определенные правила. В листинге16 видно, что присвоениеэкземпляра Managerссылкена переменную StockOptionEligibleвполне допустимо. Причина в том, что класс Managerреализует этот интерфейс. Тем неменее, следующееприсвоениебудет недействительно:

Manager m = new Manager();

StockOptionEligible soe = m; // Нормально

Employee e = soe; // Неверно!

Так как Employee- это супертип по отношению к Manager, на первый взглядэто может показаться правильным, но это нетак. Потому что Managerявляется специализацией Employee, он *другой*и в данном конкретном случаереализует интерфейс, который нереализует Employee.

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

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

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

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

 

 

Помощь

 

Ленты

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

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

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

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

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

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

материалов developerWorks

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

 

 

 

 

 

 

 

 

 

 

 

www.ibm.com/developerworks/ru/edu/j-introtojava2/section6.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 голосов)

Вложенныеклассы

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

Гдеиспользовать вложенныеклассы

Как следует из названия, вложенный класс - это класс, определенный в другом классе. Вот вложенный класс:

public class EnclosingClass {

. . .

public class NestedClass {

. . .

}

}

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

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

Область видимости вложенных классов

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

Предположим, что имеется следующеесоотношениемежду менеджером Managerи вложенным классом DirectReports, который отражает группу сотрудников Employee, которыеподчиняются начальнику Manager:

public class Manager extends Employee { private DirectReports directReports; public Manager() {

this.directReports = new DirectReports();

}

. . .

private class DirectReports {

. . .

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

1/3

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

}

}

Так жекак каждый объект Managerсоответствует отдельному человеку, объект DirectReportsсоответствует группереальных людей (работников), которыеподчиняются начальнику. У разных начальников будут разныеподчиненныеDirectReports. В этом случаена вложенный класс DirectReportsимеет смысл ссылаться только в контекстеэкземпляра содержащего его класса Manager, поэтому я сделал его классом private.

Вложенные классы public

Так как это класс private, экземпляр объекта DirectReportsможет создать только Manager. Но что, если нужно предоставить возможность создания экземпляров DirectReportsвнешнему объекту? Казалось бы, в этом случаеможно присвоить классу DirectReportsобласть видимости public, и тогда любой внешний кодсможет создавать экземпляры DirectReports, как показано в листинге17.

Listing 17. Creating DirectReports instances: First attempt

public class Manager extends Employee { public Manager() {

}

. . .

private class DirectReports {

. . .

}

}

//

public static void main(String[] args) {

Manager.DirectReports dr = new Manager.DirectReports();// Это не будет работать!

}

Код, приведенный в листинге17, неработает. Почему? Проблема (а такжееерешение) связана со способом определения DirectReportsв Managerи с правилами для данной области видимости.

Правила областивидимости: повторение

Если есть переменная-член класса Manager, то можно ожидать, что компилятор потребует сначала сослаться на объект Manager, верно? То жеотносится и к классу DirectReports, по крайней мере, как мы определили его в листинге17.

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

public class Manager extends Employee { public Manager() {

}

. . .

private class DirectReports {

. . .

}

}

// Между тем, где-нибудь в другом методе...

public static void main(String[] args) { Manager manager = new Manager();

Manager.DirectReports dr = manager.new DirectReports();

}

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

Статическиевнутренниеклассы

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

public class Manager extends Employee {

. . .

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

2/3

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

public static class ManagerComparator implements Comparator<Manager> {

. . .

}

}

// Между тем, где-нибудь в другом методе...

public static void main(String[] args) { Manager.ManagerComparator mc = new Manager.ManagerComparator();

. . .

}

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

Анонимныевнутренниеклассы

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

Листинг 18 опирается на пример из листинга 15 с добавлением метода по умолчанию для обработки типов Employee,

отличных от StockOptionEligible:

Листинг 18. Обработка типов Employee, отличных от StockOptionEligible

public static void main(String[] args) {

Employee employee = new Manager();// Вполне допустимо handleStockOptions(employee);

employee = new Employee();// не StockOptionEligible handleStockOptions(employee);

}

. . .

private static void handleStockOptions(Employee e) { if (e instanceof StockOptionEligible) {

calculateAndAwardStockOptions((StockOptionEligible)e); } else {

calculateAndAwardStockOptions(new StockOptionEligible() { @Override

public void awardStockOptions(int number, BigDecimal price) { log.info("Sorry, you're not StockOptionEligible!");

}

});

}

}

. . .

private static void calculateAndAwardStockOptions(StockOptionEligible soe) { BigDecimal reallyCheapPrice = BigDecimal.valueOf(0.01);

int numberOfOptions = 10000; soe.processStockOptions(numberOfOptions, reallyCheapPrice);

}

В этом примересоздается реализация интерфейса StockOptionEligibleс помощью анонимного внутреннего класса для экземпляров Employee, которыенереализуют этот интерфейс. Анонимныевнутренниеклассы могут такжеиспользоваться для реализации методов обратного вызова и при обработкесобытий.

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

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

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

 

 

Помощь

 

Ленты

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

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

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

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

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

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

материалов developerWorks

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

 

 

 

 

 

 

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

3/3

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