Студопедия
Главная страница | Контакты | Случайная страница

АвтомобилиАстрономияБиологияГеографияДом и садДругие языкиДругоеИнформатика
ИсторияКультураЛитератураЛогикаМатематикаМедицинаМеталлургияМеханика
ОбразованиеОхрана трудаПедагогикаПолитикаПравоПсихологияРелигияРиторика
СоциологияСпортСтроительствоТехнологияТуризмФизикаФилософияФинансы
ХимияЧерчениеЭкологияЭкономикаЭлектроника

Динамическая диспетчеризация методов

Читайте также:
  1. Amp;Сравнительная характеристика различных методов оценки стоимости
  2. VII. Определение методов исследования.
  3. Адресный тип. Динамическая память. Адреса и указатели.
  4. Анализ методов разработки электронного учебника
  5. Анализ методов регулирования производительности насосов
  6. В социально-культурной деятельности ныне сложились три группы методов.
  7. Важное значение для повышения производительности труда в обработке резанием имеет применение групповых методов обработки.
  8. Взаимосвязь методов и средств в воспитании.
  9. Виды методов в деятельности органов управления.
  10. Влияние школьных методов обучения арифметике на развитие методики формирования элементарных математических представлений.

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

WeightBox box1=new WeightBox();

Box box2=new Box();

Box1.volume();

Box2=box1;

Box2.volume();

Box1.weight();

В данном примере Box является суперклассом с методом volume, и его подкласс WeightBox с методом Weight. Первые три команды выполнятся, последняя нет, потому что Box2 – объект суперкласса, а Box1 – это подкласс.

 

(пропустила)

 

Классы Vector и Rectangle.

Класс Vector.

Массивы в Ява имеют фиксированную длину, то есть при определении массива необходимо задать его размер, за который в процессе выполнения программы выйти нельзя. В Ява есть возможность создавать массивы переменной длины из ссылок на объекты. Первоначально объект Vector ограничен определенным количеством элементов. При его превышении вектор автоматически увеличивается, а при удалении объектов уменьшается. В классе определены два конструктора: 1) Vector без параметров – задает вектор с параметрами по умолчанию, его размер 10 элементов; 2) Vector с одним целочисленным параметром (размер) – задает вектор с заданным размером. При использовании любого конструктора Vector инициализируется нулевыми значениями и ссылкой.

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

addElement (Object объект) – добавляет указанный объект к вектору

contain (Object объект) – проверяет, содержится ли указанный объект в вектора (логическая)

elementAt (int индекс) – выдает по указанному индексу содержащийся векторе объект, функция возвращает объект типа Object

FirstElement, LastElement - выдает соответственной первый и последний элемент вектора

Size – возвращает количество элементов, содержащихся в данный момент в векторе

removeElement (Object объект) – функция удаляет указанный объект из вектора. Если вектор содержит несколько таких элементов, то удаляется первый из них. Если удаление успешно, то возвращает True, если нет, то False.

Класс Vector содержится в пакете JavaUtil.

 

Класс Rectangle.

Данный класс определен в пакете JavaAvt, описывает прямоугольную область, задаваемую координатами верхней левой вершины и размерами по ширине и высоте. При этом в классе определены 4 глобальные переменные: height, width, x, y.

Конструкторы:

Rectangle без параметров – создает прямоугольную область в точке (0;0) с шириной 0 и высотой 0.

Rectangle (width, height) - создает прямоугольную область в точке (0;0) с указанной шириной и высотой.

Rectangle (x, y, width, height) - создает прямоугольную область в точке (x,y) с указанной шириной и высотой.

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

Equals (Object объект) - Возвращает true, если параметр является объектом типа Rectangle и имеет такие же координаты верхнее левой вершины, ширины и высоты, что и объект, который вызван.

Inside (int x, int y) - Проверяет, находится ли указанная точка x,y внутри прямоугольной области

Move (int x, int y) - Перемещает прямоугольную область в соответствии с новыми координатами x,y

Reshape (x,y, width, height) – перечерчивает прямоугольную область с новыми указанными параметрами

Resize (width, height) – изменяет размеры прямоугольника по заданным размерам ширины и высоты.

Многопоточное программирование в Ява

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

1. Потоки могут выполняться

2. Потоки могут быть готовыми к выполнению

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

4. Поток может быть заблокирован из-за ожидания ресурсов

5. Поток может быть завершенным и после этого не может быть продолжен

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

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

2. Поток может быть отложен потоком с более высоким приоритетом. При этом поток с низким приоритетом останавливается, поток с более высоким приоритетом может получить ресурсы процессора в любое время, когда ему это требуется (многозадачность с вытеснением). Если два потока с равным приоритетом претендуют на ресурсы, то в Ява данная ситуация решается следующим образом: потоки, претендующие на ресурсы, запускаются, и каждому отводится определенное процессорное время на выполнение своей задачи (это не всегда может быть по принципу карусели, как в Windows).

Многопоточная система в Ява базируется на классе Thread и интерфейсе Runnable. Класс Thread инкапсулирует методы, необходимые для выполнения потока. При создании потока программа или расширяет класс, или реализует интерфейс Runnable. При запуске программы Ява в ней уже есть один поток, главный поток приложения. Он важен по двум причинам:

1. Он способен порождать дочерние потоки

2. Он должен быть последним потоком при завершении выполнения программы

У класса Thread есть метод sleep (), который приводит к тому, что поток, из которого он вызывается, приостанавливает выполнение на определенный период времени. Имеет 2 версии:

1. Метод Sleep с одним параметром типа long. В параметре указывается задержка в миллисекунду

2. С двумя параметрами – задержка в миллисекундах и задержка в наносекундах

Метод очень часто бросает исключение, которое необходимо обрабатывать вручную. Класс исключения – InterruptedException. И есть два метода в этом классе, которые позволяют определять и давать имена потокам: setName(параметр string) и getName(). Данные методы применяются в том случае, если в ходе работы программы им необходимо оперативное управление работой потоков и контроль за их возобновление и остановкой.

Создание потоков

 

То есть, метод Hold должен описываться следующим образом: ………

Это один из способов решения проблемы синхронизации. Однако, бывает необходимость в синхронизации работы объекта класса, который не был разработан для мноопоточного прогарммирования. Соответственно, в своей структуре не имеет параллельно выполняющихся или синхронизируемых методов. В этом случае используют следующую форму записи для синхронизируемых объектов: synchronized (Объект) {…}. В фигурных скобках указываются операторы класса, которые необходимо синхронизировать, при этом объект – это ссылка на синхронизируемый объект. Исходя из этой формы записи, пример можно переписать следующим образом:

public void run () {

synchronized (target) {

target.call (msg);

}}

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

Сетевые приложения Java. Пакеты Java.io и Java.net

Для реализации практически любого сетевого приложения на Ява используется пакет Java.net, а точнее его основные классы URL, URL Connection. Класс URL описывает унифицированный локатор ресурсов, представляет собой простой сетевой интерфейс, и загрузка объекта, на который ссылается URL, сводится к вызову единственного метода. При использовании этого класса можно открыть поток для чтения из объекта и поток для записи в апплет. При этом объект класса URL может быть задан как в виде единой строки указания адреса, так и путем раздельного указания порта, узла и протокола. Для работы с относительными URL класс URL работает совместно с классом string и у обоих классов есть соответствующие конструкторы.

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

- SetDoInput (),SetDoOutput () (позволяют показать, будет ли объект URL Connection использоваться для ввода данных или для вывода, по умолчанию разрешен лишь ввод данных)

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

Если URL-протокол поддерживает операции чтения и записи, то методы getInputStream() и обратный метод getOutputStream() возвращают соответственно потоки ввода и вывода данных, которые взаимодействуют с объектами URL и URL Connection.

Ввод-вывод Ява

Ввод-вывод Ява осуществляется через потоки Stream. Поток ввода-вывода – это абстрактный объект, который может принимать и выдавать информацию. Поток связан с физическим устройством через систему ввода-вывода Ява. Все потоки ведут себя одинаково, независимо от того, с каким реальным физическим устройством они связаны, и к ним могут применяться одни и те же методы. Все классы, которые работают с потоками, располагаются в пакете java.io. На вершине иерархии классов находятся два абстрактных класса: InputStream и OutputStream. Их подклассы предназначены для учет различных реальных устройств и работы с ними. InputStream является предком всех классов входных потоков. В нем определены основные методы ввода данных:

-метод read читает из потока 1 байт, массив или часть массива байтов, возвращает прочитанные байты, или -1, если встретился конец потока.

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

Класс OutputStream является предком всех классов выходных потоков. В нем определены основные методы вывода данных:

- write – записывает в поток 1 байт, массив или часть массива байтов

- close – закрывает выходной поток и освобождает системные ресурсы, связанные с ним

Непосредственными наследниками классов InputStream и OutputStream являются классы FilterInputStream и FilterOutputStream. Классы используются для фильтрации входных и выходных потоков. При создании класса FilterInputStream, определяется и класс InputStream, данные которого подлежат фильтрации. При вызове метод read класса FilterInputStream вызывает метод read своего потока данных, обрабатывает считанные байты, а затем возвращает отфильтрованную информацию. Аналогично ведет себя и работает класс FilterOutputStream. По сути, эти классы не работают с данными на прямую. Данные предоставляют им их подклассы DataInputStream и DataOutputStream. DataInputStream считывает байты из потока данных и преобразует их в двоичный формат. Данный класс имеет методы для чтения данных и передачи данных своему суперклассу FilterInputStream. Класс DataOutputStream дает возможность записывать данные простых типов в двоичном формате и передавать их своему суперклассу FilterOutputStream.

 

 

Классы-члены.

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

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

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

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

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

Import java.util.*:

Public class LinkedList {

Public interface Linkable …}

(не успела дописать пример)

 

Следующий метод возвращает объект enumeration для данного объекта LinkedList, при этом никакой из объектов LinkedList не передается конструктору в явном виде.

Public linkable remove Head ()

{…}

Public Enumeration enumerate () {…}

Return now enumerator ();}

Private class Enumerator

(не успела дописать пример)

Класс Enumerator – класс-член, описывающий интерфейс LinkedList.

Linkable current;

Public Enumerator () {

Current=head;}

} // закрывается Enumerator

} // закрыли включающий класс

 

В данном примере конструктор класса Enumerator не явно ссылается на переменную head включающего класса. При компиляции класс-член Enumerator будет откомпилирован в файл байт-кода с именем LinkedList$Enumerator.class. Классы-члены могут использовать переменные, методы и даже классы своего включающего класса, объявленные как private. Включающий класс может использовать закрытые переменные и методы тех классов, которые в него встроены. Данная возможность появилась в версии языка Ява 2.0. До версии Ява 1.1 этой возможности не было.

Новый синтаксис для классов-членов в Ява

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

Classname.this, где Classname – имя включающего класса

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

Public class A {

Public string name =”a”;

Public class B {

Public string name =”b”;

Public class C {

Public string name =”c”;

Public void print_name {

System.out.println (name);

System.out.println (this.name);

System.out.println (C.this.nsme);

System.out.println (B.this.nsme);

System.out.println (A.this.nsme);

Public Enumeration enumerate () {

Последний метод позволяет правильно использовать интерфейс к вложенным классам-членам.

В данном примере нигде в выражении new не указывается, каким должен быть экземпляр включающего класса, соответствующего новому экземпляру Enumerator. Для явного указания данной информации в Ява 1.1 определен новый синтаксис для оператора new при использовании классов-членов.

<Containing>.new

Containing – выражение, которое вычисляется для получения экземпляра класса, где определен данный класс-член. Соответственно, для приме с классами A, В и С, которые вложены иерархически в друг друга, оператор new будет использоваться следующим образом:

A a=new A();

A.B b=a.new B();

A.B.C c=new C();

c.print_name();

В выражении new используются имена классов, экземпляры которых необходимо создать в сочетании с именами экземпляров, где они будут содержаться. С появлением классов-членов возникает 2 иерархии, которые следует учитывать для каждого класса-члена:

1. Иерархия, прослеживаемая от суперкласса до подкласса, где определены переменные, наследуемые классом-членом.

2. Иерархия вложенности, прослеживаемая от включаемого класса до вложенного класса, в котором определяются переменные, находящиеся в области видимости класса-члена.

Эти 2 иерархии для классов-членов различны. Когда происходит конфликт между именами наследуемых переменных или методов и именами аналогичных элементов включающего класса, Ява требует явного указания класса, к которому относится вызываемая переменная или метод. Если класс-член В наследует переменную х от класса А, где также определена переменная х, то необходимо использовать конструкцию this.x для ссылки на наследуемую переменную, или конструкцию A.this.x для ссылки на переменную включающего класса. На классы-члены накладываются 2 важных ограничения:

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

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

Локальные классы

 




Дата добавления: 2014-12-15; просмотров: 117 | Поможем написать вашу работу | Нарушение авторских прав




lektsii.net - Лекции.Нет - 2014-2025 год. (0.021 сек.) Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав