В. В. Кулямин Лекция Язык программирования Java и технологии Java




Скачать 319.25 Kb.
НазваниеВ. В. Кулямин Лекция Язык программирования Java и технологии Java
страница1/2
Дата23.02.2013
Размер319.25 Kb.
ТипЛекция
  1   2

Технологии программирования. Компонентный подход


В. В. Кулямин

Лекция 5. Язык программирования Java и технологии Java.


После разработки архитектуры можно переходить к разработке отдельных компонентов будущей системы.

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

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

В этот набор входят следующие основные элементы.

  • Платформа Java Platform, Standard Edition (J2SE).
    Предназначена для разработки обычных однопользовательских приложений.

  • Платформа Java Platform, Enterprise Edition (J2EE).
    Предназначена для разработки распределенных приложений уровня предприятия.

  • Платформа Java Platform, Micro Edition (J2ME).
    Предназначена для разработки встроенных приложений, работающих на ограниченных ресурсах.

  • Платформа Java Card.
    Предназначена для разработки ПО, управляющего функционированием цифровых карт.

В рамках данного курса будут рассмотрены основные элементы платформы J2EE, а также элементы J2SE, на которых базируются первые.

Основные элементы языка Java


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

30 сентября 2004 года вышла версия платформы J2SE, основанная на языке Java 5.

Основные элементы языка Java в версии 5 следующие.

  • Код компонентов Java программы хранится в файлах с расширением .java (имя такого файла без расширения совпадает с именем единственного общедоступного класса, декларированного в нем). При компиляции программы для каждого класса или интерфейса строится .class файл, содержащий его байт-код — код в командах виртуальной машины Java.
    Файлы с исходным кодом и файлы с байт-кодом должны располагаться в поддиректориях некоторых корневых директорий в соответствии с именами их пакетов. Набор имен корневых директорий для поиска в них Java-кода перечисляется в опции компилятора -sourcepath, набор имен корневых директорий для поиска в них байт-кода перечисляется в опции компилятора и Java-машины -classpath.
    Пример: Java-код класс ru.msu.cmc.prtech.examples.ClassA должен лежать в поддиректории ru/msu/cmc/prtech/examples некоторой директории, упомянутой в sourcepath, в файле ClassA.java. Его байт-код должен находиться в файле ClassA.class поддиректории с тем же именем одной из директорий, упомянутых в classpath.
    Кроме имен корневых директорий, опция classpath может содержать имена архивных JAR-файлов, каждый из которых содержит упакованный с сохранением структуры пакетов набор class-файлов классов. Программа, исполняемая Java машиной, запущенной с указанием такого архива в classpath может использовать классы, байт-код которых содержится в этом архиве.
    При работе Java программы виртуальная машина выполняет метод public static void main(String[]) указанного при ее запуске класса, подгружая при необходимости код других классов из директорий или архивов, перечисленных в classpath.

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

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

      • boolean для данных логического типа. Обертка — java.lang.Boolean.
        Константы этого типа — true и false.
        Для таких данных определены операции
        == , !=, !, &&, ||, &, |, ^
        проверки равенства и неравенства, отрицание, короткие конъюнкция и дизъюнкция, длинные конъюнкция и дизъюнкция, исключающее или.

      • char для данных символьного типа. Обертка — java.lang.Character.
        Используются символы в кодировке Unicode, on '\u0000' до '\uffff'.
        Константы этого типа — '<символ>', '\', '\<одна-две-три восьмеричные цифры>', '\u<четыре шестнадцатеричных цифры>'.
        Определены те же операции, что и для целочисленных данных.

      • Целочисленные типы
        byte для значений [-128..127]. Обертка — java.lang.Byte.
        short для значений [-32768..32767]. Обертка — java.lang.Short.
        int для значений [-231..231-1]. Обертка — java.lang.Integer.
        long для значений [-263..263-1]. Константы этого типа помечаются суффиксом l или L — 9223372036854775808L. Обертка — java.lang.Long.
        Для них определены операции
        ==, !=, <, <=, >, >=, +, -, *, /, %, ++, --, <<, >>, >>>, ~, &, |, ^
        << — побитовый сдвиг влево
        >> — побитовый сдвиг вправо, с учетом знакового бита
        >>> — побитовый сдвиг вправо, без учета знакового бита
        ~, &, |, ^ — побитовые операции дополнения, конъюнкции, дизъюнкции и исключающего или

      • Типы данных с плавающей точкой.
        float и double для типов данных с плавающей точкой, соответствующих стандарту IEEE 754-1985 в 32-х и 64-хбитном представлении. Соответствующие классы-обертки — java.lang.Float и java.lang.Double.
        Константы этих типов — 0.0, -213.568e-6f. Константы типа float помечаются суффиксом f или F, константы типа double могут быть непочены или помечены суффиксом d или D.
        Такие числа представляются в виде набора битов длины 32 или 64, делящегося на знаковый бит s, экспоненту e (8 или 11 бит) и мантиссу m (23 или 52 бита). Итоговое число вычисляется как (+/-)m*2(e-N+1), где N — 24 или 53, соответственно (m вычисляется некоторым образом по своему битовому представлению).
        Значения float 0x7f800000 и 0xff800000, и double 0x7ff0000000000000 и 0xfff0000000000000 представляют положительную и отрицательную бесконечности (Float.POSITIVE_INFINITY, Float.NEGATIVE_INFINITY, Double.POSITIVE_INFINITY, Double.NEGATIVE_INFINITY). Все значения, у которых экспонента больше указанных или равна им, но мантисса отлична от 0, представляют специальное значение NaN — Not a Number (Float.NaN, Double.NaN).
        Значения этих типов упорядочены, кроме NaN. Любая операции сравнения, кроме !=, с одним из аргументов NaN возвращает false (!= возвращает всегда true). Поэтому, для проверки равенства числа NaN надо пользоваться специальными операциями Float.isNaN(float), Double.isNaN(double). Кроме того, отдельные (!) значения -0.0 и 0.0 считаются равными.
        Определены операции
        ==, !=, <, <=, >, >=, +, -, *, /, %, ++, --
        Операции соответствуют требованиям стандарта IEEE 754-1985, кроме %. Это, в частности, означает, что если один из аргументов операции NaN, то результат ее тоже NaN. Кроме того, действуют достаточно естественные правила: 1/0.0 = +, -1/0.0 = -, 0/0.0 = NaN, -+1 = -, +*1 = +, +- = NaN, +/- = NaN, и пр. — операции дают бесконечные результаты и обрабатывают бесконечные аргументы в соответствии с их математическим смыслом, NaN возникает при неопределенностях.
        Операция % действует не в соответствии со стандартом IEEE 754-1985— если b != 0, +/-, NaN, то выполнено тождество (a/b)*b + (a%b) == a

    • Классы и интерфейсы.
      Представляют собой объявления типов объектов, чаще всего имеющих операции (методы). Объекты классов моугт иметь внутренние данные (описываемые в классе как поля). Интерфейсы содержат набор деклараций констант (final static полей) и методов, без реализаций последних. Неабстракные классы определяют реализации для всех своих методов. Абстракные (abstract) классы могут не определять реализации для некоторых методов, задавая только их декларации. Объекты, принадлежащие непосредственно к интерфейсу или абстрактному классу, нельзя создать — в программе можно создавать лишь объекты неабстракных классов, реализующих данный интефрейс или наследующих данному абстрактному классу.
      Классы могут наследовать друг другу, переопределяя методы (но не поля, которые можно только перекрыть, использовав их имена в наследниках — по такому имени становится доступно поле наследника, а поле предка становится недоступно напрямую). Класс может наследовать только одному классу и реализовывать несколько интерфейсов. Метод, определенный в классе-наследнике всегда переопределяет метод с той же сигнатурой в классе-предке.
      Сигнатура метода включает его имя и типы параметров. В Java 5 появились методы с неопределенным числом параметров — последний параметр может быть декларирован как <тип>… <имя> и при конкретных вызовах передаваться как в виде массива данных этого типа, так и в виде последовательности таких данных.
      При переопределении метода требуется соблюдать следующие правила: помимо такой же сигнатуры, переопределяющий метод должен иметь не больший список возможных исключений (убирать исключения из списка можно) и (в Java 5) тип его результата должен быть подтипом типа результата переопределяемого метода (в версиях до Java 5 требовалось в точности сохранять тип результата).
      Все эти требования являются синтакисческой поддержкой для принципа подстановки Лисковой (Liskov substitution principle), утверждающего, что объект класса-наследника в хорошо спроектированной системе должен быть в состоянии использоваться без возникновения ошибок в любом месте, где может использоваться объект класса-предка (это означает, в частности, что во всякой ситуации, в которой можно вызвать некоторый метод предка, должно быть возможно вызвать и соответствующий метод потомка, а также, что множество ситуаций, в которых система может оказаться в результате работы метода потомка, должно быть подмножеством ситуаций, возможных после работы метода предка).
      Методы и поля могут быть статическими (static), что означает, что они принадлежат не объектам, а самому классу. Такие методы не могут быть переопределены, но могут быть перекрыты в классах-наследниках (т.е., вызывая этот метод в классе, где он определен, мы всегда будем обращаться к нему, но вызывая его в классах-наследниках, мы будем обращаться к нему же, если он не перекрыт в этом наследнике, и к другому методу, если в классе-наследнике определен статический метод с той же сигнатурой).
      Методы и поля могут быть final, что для методов означает невозможность их переопределения в потомках, а для полей — невозможность изменить значение, присвоенное им в конце работы конструктора объекта, если поле не static, или инициализации класса, если оно статическое. Класс может быть объявлен как final — такой класс не может быть унаследован.
      Декларации полей могут содержать инициализации их некоторыми значениями соответсвующих типов. Поле (так же, как и локальная переменная) будет инициализированы автоматически значением по умолчанию (для объектных типов — null, для числовых — 0, для логического — true), даже если явной инициализации у него нет — при этом использование значения неициализированного поля или переменной считается ошибкой во время компиляции.
      Помимо этого, в классах и интефейсах могут объявляться константы (final static поля) и вложенные типы — классы, интерфейсы, перечисления. Вложенные классы могут быть статическими или нет (последние — довольно запутанная конструкция, поскольку такой класс привязан к конкретному объекту объемлющего класса и в своих методах может использовать ссылку на этот объект).
      Классы, интерфейсы, шаблоны, перечисления, методы, поля и конструкторы могут иметь модификатор доступа — private, пустой, protected или public. В первом случае соответствующий элемент доступен только внутри кода объемлющего класса, во втором — всюду в объемлющем пакете, в третьем — в объемлющем пакете и в наследниках объемлющего класса, в последнем — из любого места. При этом классы и интерфейсы верхнего уровня (не вложенные в другие) могут быть только public или без модификатора доступа, причем в файле с именем <имя>.java должен быть декларирован ровно один public класс или интерфейс верхнего уровня с именем <имя> (регистр существенен!).
      Классы могут иметь инициализаторы — блоки кода в фигурных скобках, расположенные непосредственно в рамках декларации класса и, возможно, помеченные модификатором static. Статические инициализаторы выполняются при загрузке класса в виртуальную машину, после инициализации статических полей, в порядке их появления в теле класса. Нестатические инициализаторы выполняются тоже в порядке их появления в теле класса при конструировании объекта данного класса после выполнения конструкторов всех его классов-предков и инициализации нестатических полей, но до выполнения тела конструктора самого этого класса.
      Методы, конструкторы и инициализаторы класса могут обращаться к методам, конструкторам и полям его непосредственного предка, используя для этого специальный идентификатор super. Обращение к полю в этом случае выглядит как super.<имя поля предка>, к методу — super.<имя метода>(<аргументы>), к конструктору (возможно только в конструкторах) — super(<аргументы конструктора предка>)

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

    • Шаблонные классы и интерфейсы. (Введены в Java 5).
      Представляют собой классы и интерфейсы с типовыми параметрами.

    • Перечисления. (Введены в Java 5).
      Представляют собой классы специального вида, объявляющие несколько констант данного класса и не имеющие конструкторов.

  • Операторы Java ключают в себя, помимо обычного вычисления выражений, оператор возврата значения return …, условный оператор if(…) … (возможно, продолжающийся else …), оператор выбора switch(…), операторы циклов for(…; …; …), while(…) …, do … while(…); (все они имеют синтаксис и смысл, аналогичный их смыслу в С++). Кроме того, имеются операторы break и continue, которые могут сопровождаться именем метки. Без метки они прекращают/продолжают работу непосредственно включающего их цикла (а break также выводит управление из непосредственно включающего его блока), с меткой — соответственно, цикла/блока, начало которого помечено этой меткой.
    Про операторы создания/проверки исключительных ситуаций и синхронизации потоков см. далее.

  • Выражения Java включают создание новых объектов при помощи оператора new <вызов конструктора>. Создание массивов выглядит как new <тип элемента>[<длина>]. Кроме того, используются инициализаторы массивов при декларации вида
    <тип элемента>[] <имя> = new <тип элемента>[] { <список элементов через запятую> };
    Выражения Java могут использовать ссылку this (в рамках нестатических методов и конструкторов) для указания на объект, в котором выполняется данный метод, super — для указания на соответствующий объект класса-предка.
    Кроме того, можно использовать выражение <имя класса>.class для получения ссылки на объект, представляющий в виртуальной машине указанный класс.
    Операция +, помимо обычного сложения числовых значений, обозначает также конкатенацию строк, имеющих тип java.lang.String.

  • Исключения.
    Исключения могут быть только объектных типов, наследующих классу java.lang.Throwable.
    Создаются исключения при помощи оператора throw <выражение типа исключения>;
    Проверка возникновения исключения и его обработка оформляются в виде оператора try {…} catch(…) {…} finally {…}, в котором блоков catch может быть несколько для разных типов исключений, блок finally может отсутствовать (как и блок catch, но не оба сразу). Если блок finally есть, он выполняется после выполнения блока try (и, если возникло исключение, после соответствующего обработчика catch) всегда.
    При этом типы исключений, которые могут дойти не обработанными до границ тела метода, должны декларироваться в заголовке метода, если эти типы проверяемы, т.е. не наследуют классам java.lang.RuntimeException или java.lang.Error. Для наследников этих двух типов декларация их в заголовке метода, способного создать такие исключения, необязательна.

  • Помимо поддержки обычных вычислений, Java имеет встроенные в язык конструкции для разрабокти многопоточных программ.
    Для определения участков синхронизации используется модификатор synchronized, который может помечать метод (тогда работать в рамках этого метода в одном объекте, или классе, если метод статический, одновременно может только один поток, все остальные потоки приостанавливаются на входе в метод и ожидают, пока он не освободится) или блок внутри тела метода, вместе с некоторым выражением synchronized(<выражение>) {...} (в этом случае только один поток из множества тех, где это выражение разрешается в один объект, может войти в данный блок).

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

package ru.msu.cmc.prtech.examples;


import java.util.ArrayList;


public class Program

{

static long result = 1;

static int counter = 0;

public static void main (String[] args)

{

int n = 0;

switch(args.length)

{

case 0:

System.out.println("No arguments provided");

return;

default:

n = Integer.parseInt(args[0]);

break;

}

ArrayList threads = new ArrayList();

for(int i = 0; i < n; i++)

threads.add(new MyThread(i+1));

for(Thread t : threads)

t.start();

while(true)

{

if(counter >= n) break;

}

System.out.println("Final result = " + result);

}

static class MyThread extends Thread

{

long d = 1;

public MyThread(long d)

{

if(d != 0) this.d = d;

}

public void run()

{

synchronized(Program.class)

{

System.out.println(" thread " + d + " is working");

result *= d;

counter++;

System.out.println(" result = " + result);

}

}

}

}

  1   2

Похожие:

В. В. Кулямин Лекция Язык программирования Java и технологии Java iconПрограмма по курсу: современные технологии программирования на языке
Данный курс предполагает базовое знание языка java. Курс рассчитан на изучение не самого языка, а технологии программирования на...
В. В. Кулямин Лекция Язык программирования Java и технологии Java iconОбщие представления о языке Java 6
Виртуальная Java-машина, байт-код, jit-компиляция. Категории программ, написанных на языке Java 9
В. В. Кулямин Лекция Язык программирования Java и технологии Java iconТрансляция кода из Groovy в Java в Intellij idea
Это Scala [10], Clojure [11], Groovy [12], Jruby [13] и Jython [14]– портированные версии Ruby и Python. Все они появились как альтернатива...
В. В. Кулямин Лекция Язык программирования Java и технологии Java iconЯзык программирования Java и среда NetBeans в какие компоненты может быть включен компонент JavaBeans?
...
В. В. Кулямин Лекция Язык программирования Java и технологии Java iconJava. В частности, с помощью Java программисты создают Web-приложения, назы­ваемые атлетами
Отображение с помощью аплета отрывка, случайным образом выбранного из текстового файла
В. В. Кулямин Лекция Язык программирования Java и технологии Java iconМобильных телефонов на c++ и java 2 me м осква, 2005 удк 004. 438
Г26 Symbian os. Программирование мобильных телефонов на C++ и Java 2 me. — М: дмк пресс, 2005. 448 с: ил
В. В. Кулямин Лекция Язык программирования Java и технологии Java iconРазработка графической системы поддержки программирования контроллеров с использованием языка java

В. В. Кулямин Лекция Язык программирования Java и технологии Java iconКашина о. А., Андрианова а. А. Практикум по программированию на языке java удк 004. 43
Практикум по программированию на языке Java.: Учебное пособие/ О. В. Пинягина, О. А. Кашина, А. А. Андрианова – Казань: Казанский...
В. В. Кулямин Лекция Язык программирования Java и технологии Java iconПрограмма дисциплины составлена кафедрой информационных систем в искусстве и гуманитарных науках в соответствии с государственным образовательным стандартом
Цель курса: закрепить теоретическое представление об объектно-ориентированном программировании практикой программирования на языке...
В. В. Кулямин Лекция Язык программирования Java и технологии Java iconЯзык JavaScript. Общие сведения, выражения, операторы. Общие сведения
За синтаксическую основу нового языка был взят язык Java, в свое время разработанный компанией Sun Microsystems. В последнее время...
Разместите кнопку на своём сайте:
Библиотека


База данных защищена авторским правом ©lib.znate.ru 2014
обратиться к администрации
Библиотека
Главная страница