на тему рефераты Информационно-образоательный портал
Рефераты, курсовые, дипломы, научные работы,
на тему рефераты
на тему рефераты
МЕНЮ|
на тему рефераты
поиск
Распределенные системы обработки информации
p align="left">toString() - возвращает строку, отражающую состояние объекта.

clone() - создает копию объекта. Без переопределения недоступен.

Class:

Обьект метаданных о каком либо классе. Позволяет узнать методы, поля, создать экземпляр другого класса. Обьект Class создается либо как жертва.getClass() или как Class.forName(“полное квалификационное имя”). Данный класс - основа отражения (reflection).

1.7 Интерфейсы и обратные вызовы в Java

Интерфейс - спецификация требований к реализуемым классом методам:

public interface MyInterface { int myMethod(); }

Все методы, объявленные в интерфейсе, считаются обьявлеными как public.

Класс может реализовать один или несколько интерфейсов:

class MyClass implements MyInterface { … }class MyClass2 implements MyInterface, MyInterface2 { … }

Интерфейс - не класс, нельзя создать его экземпляр. Но интерфейсная переменная может ссылаться на объект класса, который реализует этот интерфейс. С помощью instanceof можно проверить, реализует ли объект заданный интерфейс.

В Java интерфейсы часто применяются вместо указателей на функции для организации механизма обратного вызова. Объекту, который будет выполнять обратный вызов, передается интерфейсная переменная, метод которой будет вызван. После этого первый объект сохраняет эту переменную и при необходимости вызывает один из ее методов. Например, таймер javax.swing.Timer требует интерфейс java.awt.event.ActionListener для периодического выполнения обратного вызова.

public class MoneyCounter implements ActionListener { public void actionPerformed( ActionEvent e ) { money += money * percent; System.out.println( "Денег сейчас: " + money ); }} 1.8 Вложенные классы и интерфейсы

Вложенный (inner) класс или интерфейс - класс или интерфейс, определенный внутри другого класса. Объект вложенного класса имеет доступ ко всем полям и методам содержащего его класса (включая закрытые). Его можно скрыть от других классов пакета. Можно создавать анонимные вложенные классы.

class MyClass { ... private class MyInnerClass { … }}

Обращение из вложенного класса к методам и полям внешнего: можно просто someMethod(), а можно так: MyClass.this.SomeMethod().

Создание экземпляра вложенного класса:

MyInnerClass obj = new MyInnerClass();MyInnerClass obj = this.new MyInnerClass();

А если вне класса:

MyClass myobj = new MyClass();MyClass.MyInnerClass obj = myobj.new MyInnerClass();

Вложенный класс можно определить даже внутри метода (локальный вложенный класс). Они объявляются без спецификаторов видимости.

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

Чаще всего используется в обработчиках GUI:

MyInterface obj = new MyInterface() { … };myButton.addActionListener( new ActionListener() { public void actionPerformed( ActionEvent e ) { doSmth( ); }} );

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

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

1.9 Цикл for-each, аргументы переменной длины, настраиваемые типы в Java

Цикл for each позволяет последовательно перебрать все элементы набора данных.

for (ElementType element : collection) { … }

Объект collection должен поддерживать интерфейс Iterable или быть массивом:

public interface Iterable<E> { Iterator<E> iterator();}

Метод с переменным числом параметров:

int sum(int… args);void format(String fmt, Object… objs);

Многоточие здесь эквивалентно [], то есть args и objs - массивы аргументов указанного типа.

Настраиваемые типы (generics) - способ параметризации класса другим классом. Обычно применяется в коллекциях объектов.

Использование:

LinkedList<Integer> li = new LinkedList<Integer>();li.add(new Integer(0));

Объявление:

class LinkedList<T> { void add(T element) { … }}

Ограничение:

class MyClass<T extends Exception> { … }

Здесь T - подтип класса Exception.

Можно использовать несколько параметров:

class MyClass<T, E, M> {…}

Можно параметризировать метод:

<T> void method(T[] a, Colletion<T> c) { … }

Параметр ? обозначает любой тип:

ArrayList<?> a = new ArrayList<Number>();

Можно также указать ограничения:

ArrayList<? extends Shape> a = new ArrayList<Triangle>(); /* Triangle - подкласс Shape */ArrayList<? super Triangle> a = new ArrayList<Shape>(); /* Shape - базовый для Triangle */

Ограничения generics: нельзя использовать простые типы в качестве параметров, нельзя определять параметризированные массивы, нельзя использовать generic-типы в исключениях, нельзя использовать instanceof, нельзя задавать значения по умолчанию для параметров типов, нельзя использовать тип-параметр для создания объекта, нельзя клонировать объект, имеющий тип параметра. Механизм generics реализуется компилятором, на уровне виртуальной машины про это ничего не известно. При параметризации не создаются новые классы (ключевое отличие от templates в C++).

1.10 Многопоточность в Java: создание потоков

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

public interface Runnable { void run(); }

Затем действуем так:

MyRunnable r = new MyRunnable();Thread t = new Thread(r);t.start();

Можно также унаследовать свой класс от Thread (он реализует Runnable), так еще проще.

Поток завершает работу, когда метод run() возвращает управление. Можно также запросить прерывание потока, вызвав t.interrupt(). После этого поток может проверить статус прерывания:

if( Thread.currentThread( ).isInterrupted( ) ) { … }

Если interrupt() вызван для заблокированного потока, он завершается и выбрасывает исключение InterruptedException.

Поток блокируется, если для него вызван sleep(), если он выполняет блокирующий ввод-вывод, если он пытается заблокировать заблокированный объект, если он ожидает выполнения условия, если для него вызван метод suspend() (устаревший).

1.11 Многопоточность в Java: синхронизация

Синхронизация в многопоточном приложении требуется в ситуации гонки (race condition). В этом случае требуется ограничить выполнение фрагмента кода одним потоком.

Раньше использовалось ключевое слово synchronized, которым помечается метод класса. Этот метод будет выполняться только одним потоком одновременно. Достигается за счет неявного создания объекта блокировки.

Более гибкий способ - использование объектов блокировок: java.util.concurrent.locks.ReentrantLock.

myLock.lock(); // объект ReentrantLocktry { … }finally { myLock.unlock(); }

Объект ReentrantLock может блокироваться одним потоком несколько раз, но потом должен быть столько же раз разблокирован.

С объектом блокировки можно связать объект условия (типа Condition):

myCondition = myLock.newCondition();

Для условия определены методы:

myCondition.await() // уступить объект блокировки.myCondition.signalAll() /* все ожидающие потоки возобновят выполнение */

Обычно делают так:

while (!(можно продолжать))myCondition.await();

Каждый объект может быть объектом блокировки. Для этого в классе Object есть методы notifyAll(), notify(), wait().

Синхронизированные блоки:

synchronized(obj) { … }

Здесь obj - любой объект, который выступает в качестве объекта блокировки.

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

Блокирующие очереди - используются для ситуации читателей и писателей. Классы: LinkedBlockingQueue, ArrayBlockingQueue, PriorityBlockingQueue, DelayQueue. Такие очереди обеспечивают синхронизированный доступ к своим элементам и имеют методы: add (добавить элемент), remove (удалить из головы), element (возвратить из головы без извлечения), offer (добавляет элемент с проверкой переполнения), poll (удаляет из головы с проверкой пустоты), peek (возвращает из головы без извлечения с проверкой пустоты), put (блокирующее добавление элемента), take (блокирующее удаление из головы).

1.12 Ввод-вывод в Java: общие сведения

В Java ввод-вывод основывается на потоках (streams) и файлах (files).

Поток ввода - объект, из которого можно считывать последовательность байтов или символов, определяется абстрактным классом InputStream (определяет метод int read(), читающий один байт). Поток вывода - объект, в который можно записывать последовательность байтов или символов, определяется абстрактным классом OutputString (определяет метод void write(int b), записывающий один байт). Методы read и write могут блокировать поток. Есть и другие методы: int read(byte[] b), void write(byte[] b) и т.д.

Классы Reader и Writer аналогичны InputStream и OutputStream, но используются для Unicode-текстов.

Потоки ввода-вывода можно объединять в цепочки:

FileInputStream fin = new FileInputStream(“file.dat”);DataInputStream din - new DataInputStream(fin);double s = din.readDouble();

Консольный ввод-вывод осуществляется с помощью объектов System.in (типа InputStream) и System.out (типа PrintStream).

1.13 Форматированный ввод-вывод в Java (J2SE 1.5)

Класс Formatter - основа логики форматирования. Примеры опции форматирования - задание точности и ширины дробного числа (%7.4f), представлеие времени (%tT). Можно применять различные форматы для одного аргумента - в этом случае указываеться порядковый номер аргумента (%3$s для третьего). Общий вид параметра:

%[argument_index$][flags][width][.precision]conversion

Конструктору класса Formatter можно передать локаль желаемого языка. Само форматирование осуществляется методом format(). Подобно printf в него передается строка с шаблоном форматирования и аргументы. Можно использовать локаль, отличную от той, что использовалась в конструкторе:

public Formatter format(String format, Object... args)public Formatter format(Locale l, String format, Object... args)formatter.format("PI = %12.10f", Math.PI);

Классы PrintStream, PrintWriter позволяют перенаправить форматированный текст в поток. В стандартных потоках (System.out, System.err) есть методы, позволяющие сразу передавать в них форматированный текст. Кроме метода format() в классах, работающих с потоками, появляется printf(). Это синонимиы - ведут себя одинаково.

public PrintStream format(String format, Object... args)public PrintStream format(Locale l, String format, Object... args)System.out.format("Сегодня %1$tB %1$te, %1$tY.", Calendar.getInstance());

В классе String имеется метод format(). Работает так же, но возвращает String.

Можно использовать собственные объекты с Formatter - для этого применяется интерфейс Formattable. Реализовав метод formatTo() в своем классе, можно использовать класс в качестве аргумента при форматировании строк:

void formatTo(Formatter formatter, int flags, Integer width, Integer precision);

Класс Scanner - простой сканер, который может считывать простые типы и строки. Есть частичная поддержка регулярных выражений. Scanner разбивает ввод, используя образец разделителя (пробел по умолчанию). Из полученных лексем значения простых типов достаются nextХХХ() методами: nextBoolean(), nextFloat(),nextInt() и т.д. и т.п.

Scanner scanner = new Scanner(System.in);int i = scanner.nextInt();

Методы hasNextXXX() (hasNextInt(), hasNextDouble(), …) проверяют - является ли очередная лексема значением указанного типа.

1.14 О программировании графики в Java

Сначала в Java появилась библиотека AWT (abstract window toolkit) (java.awt), которая использовала платформенно-зависимые средства для отображения элементов GUI. Позже появилась IFC (internet foundation classes), которая все элементы интерфейса рисовала в окне. Ее преемницей стала библиотека Swing (javax.swing), которая используется и сейчас. Swing не может работать самостоятельно, без опоры на AWT. Swing работает медленнее, чем AWT, но предоставляет более богатый набор средств, не зависит от платформы (меньше ошибок) и на всех платформах выглядит одинаково.

Окно верхнего уровня (не содержащееся внутри других окон) называется фреймом: классы Frame (AWT) и JFrame (Swing).

Отображать данные можно непосредственно на фрейме, но обычно он используется как контейнер для других GUI-компонентов. Фрейм состоит из нескольких слоев-областей (корневой области, область слоя, прозрачная область и область отображения). Компоненты размещаются на области отображения. Например, чтобы разместить компонент:

Container contentPane = frame.getContentPane();Component c = …;contentPane.add(c);

Для рисования на компоненте необходимо переопределить его метод void paintComponent(Graphics g). Graphics - набор настроек контекста для рисования. Метод paintComponent вызывается автоматически, когда требуется перерисовка компонента, но можно вызвать его принудительно с помощью метода repaint().

Страницы: 1, 2, 3, 4



© 2003-2013
Рефераты бесплатно, курсовые, рефераты биология, большая бибилиотека рефератов, дипломы, научные работы, рефераты право, рефераты, рефераты скачать, рефераты литература, курсовые работы, реферат, доклады, рефераты медицина, рефераты на тему, сочинения, реферат бесплатно, рефераты авиация, рефераты психология, рефераты математика, рефераты кулинария, рефераты логистика, рефераты анатомия, рефераты маркетинг, рефераты релиния, рефераты социология, рефераты менеджемент.