
- •Введение
- •Основы программирования на java Язык программирования Java
- •Базовый синтаксис языка
- •Объектная модель Java
- •Наследование
- •Жизненный цикл объекта
- •Примитивные типы данных
- •Управляющие конструкции
- •Исключительные ситуации
- •Механизм фоновых процессов
- •Класс Thread и интерфейс Runnable
- •Средства синхронизации процессов
- •Принципы построения Java-программы
- •Автоматическое освобождение памяти в Java-программе
- •Java и безопасность
- •Оконный пользовательский интерфейс в Java-программе
- •Основы построения графического пользовательского интерфейса Компоненты и контейнеры
- •Организация интерфейса
- •События
- •Методы класса Component, связанные с обработкой событий
- •Лабораторный практикум Общие указания
- •Лабораторная работа № 1
- •Методические указания.
- •Требования к выполнению лабораторной работы
- •Варианты заданий
- •Лабораторная работа № 2
- •Методические указания
- •Требования к выполнению лабораторной работы
- •Варианты заданий
- •Методические указания
- •Требования к выполнению лабораторной работы
- •Варианты задания
- •Методические указания
- •Требования к выполнению лабораторной работы
- •Варианты заданий
- •Разработать апплет – стрелочный секундомер.Список литературы
Лабораторный практикум Общие указания
Изложение материала по языку ориентированно на Java версии 1.1. При выполнении лабораторных работ предполагается использование в качестве инструментальных средств программирования Java Development Kit версий 1.1.x., распространяемый фирмой Sun бесплатно. Если вы используете другую среду разработки, убедитесь что она поддерживает данную версию Java. В случае работы с Java 1.0, методические указания, представленные ниже, могут оказаться недействительными. Также предполагается, что процесс разработки java-программ производится на платформе Windows95/NT.
Java Development Kit (JDK) представляет собой набор средств создания и отладки Java-программ и набор стандартных классов, причем весь инструментарий в свою очередь написан на Java. Все средства имеют интерфейс "командная строка" и, под Windows95, запускаются из окна MS-DOS
Для компиляции Java-программ используется компилятор javac.exe. При его запуске, в качестве параметров, следует указать имя компилируемого файла (*.java). Для подготовки текстов можно использовать любой текстовый редактор, позволяющий записать текст в формате ASCII (например Notepad) Результатом работы компилятора является класс-файл(ы) (*.class), представляющие собой скомпилированный код Java-класса.
Запуск Java-программы выполняется путем вызова интерпретатора Java-кода, именуемого java.exe. В качестве параметра следует указать имя класс-файла (*.class) в котором определен главный класс программы.
При работе с апплетами, для их запуска следует использовать либо интерент-броузер, поддерживающий Java 1.1 (например, Internet Explorer 4.0), либо пользоваться утилитой appletviewer.exe, входящей в состав JDK.
Лабораторная работа № 1
Цель работы: Изучение синтаксиса, основных операций и базовых классов Java, изучение общих принципов программирования на языке Java.
Методические указания.
Синтаксис языка Java во многом похож на C++, однако, он в значительной степени упрощен, благодаря отсутствию указателей и структурированных типов данных. Многие конструкции на Java выглядят значительно проще и понятнее, нежели их эквиваленты на C++.
Основой Java программы являются классы. Класс служит описанием типа объекта в объектно-ориентированном языке, и включает в себя набор данных, методы класса, и родительские классы. В Java не существует исполнимого кода вне методов. То есть, единственным способом написать выполняемую программу на java является определение в этой программе класса (классов) и задание методов класса.
public class MyProgram extends Object { // описание данных и методов}
При описании класса указывается его видимость (public – общедоступный), далее ключевое слово class и имя класса, после чего может следовать указание родительского класса в виде: extends <имя род. класса>. Описание данных и методов класса располагается между фигурными скобками { и }, причем определение данных и методов может выполняться в любой последовательности.
Определение переменных может производиться в произвольном месте описания класса, метода класса и может быть объединено с присваиванием значения:
int maxSize = 10;public string hello = "Hello word";private URL url;public static final int MAX_WINDOW_HIGHT = 100;
Определение переменной имеет вид: [<спецификаторы> ]<тип> <имя> [ = <значение>] и представляет собой законченную конструкцию языка, завершаемую символом "точка с запятой". Переменная может быть простого (встроенного) или классового типа (строка и массив также являются классами Java ).
Спецификаторы определяют видимость (private, public, protected) и свойства переменной. Переменные, объявленные как static существуют в единственном числе для всех экземпляров класса (глобальные переменные для класса) и доступ к ним возможен без предварительного создание экземпляра класса, а только указанием имени класса и имени его статической переменной.
Значения переменных, объявленных как final невозможно изменить в процессе работы программы. Значение, которым инициализируется переменная, может задаваться константой, выражением, или оператором языка, интерпретация которого возвращает значение заданного типа. Выражение должно быть вычисляемым в данной точке программы.
Существуют некоторые особенности в объявлении переменных типа массив и строка, которые могут быть объявлены либо обычным образом:
int[][] array2; // объявление многомерного массиваString s1 = "Test";
либо используя тот факт, что и то и другое является объектами в Java:
int[] arr = new int[5];String s = new String("Test");
В первом случае, размерность массива не может быть указанна в объявлении переменной и для доступа к элементам массива требуется предварительно его создать с помощь оператора new. Для строк действует правило неявного распределения памяти, и new не требуется. Массив тоже может быть создан используя неявное распределение памяти, но в таком случае он должен быть инициализирован при объявлении:
int array1 [] = {1,3,5}; // инициализация массива
Определение метода класса выполняется конструкцией вида:[<спецификаторы>] <тип> <имя>( [<параметры>]) { [ программный код ] }Например:
public int getMaxNumber ( int x, int y ) { return ( (x > y) ? x : y ); }
Так же как и при описании переменных, спецификаторы метода задают видимость и такие свойства метода как "статичность" и "переопределяемость". Статические методы (имеющие директиву static ), также как и переменные, принадлежат всем экземплярам класса и могут быть вызваны без создания конкретного экземпляра. Методы, объявленные как final, невозможно переопределить в объектах – наследниках. По умолчанию, все методы класса - виртуальные, и могут быть перекрыты с целью их модификации действий в наследниках.
Тип метода определяет значение, возвращаемое данным методом класса (все методы – функции). Тип может быть любым. Для методов, возвращаемое значение которых не определено, указывается тип void. Выход из метода выполняется либо после выполнения всех операторов в соответствии с логикой метода, либо при выполнении команды return. Для методов, возвращающих значение, в команде return следует указывать значение для возврата.
Список аргументов метода заключен в круглые скобки. Метод может не принимать никаких параметров, в этом случае указываются только круглые скобки за именем метода. Синтаксически, объявление формального параметра метода имеет вид: <тип> <имя параметра>. Все параметры перечисляются через запятую.
Тип параметров метода может быть произвольным. Все параметры передаются по значению, то есть их модификация в методе не отражается на значении фактического параметра, переданного методу при вызове. Отличия существуют при передаче параметра классового типа. Переменная классового типа есть ссылка на класс, поэтому сам класс может быть модифицирован в методе, однако ссылка на него не может.
Основные конструкции языка перешли в Java из C/C++ и для их детального изучения следует обратится к справочному руководству по Си. Рассмотрим их вкратце на примерах.
Составной оператор, есть блок операторов, заключенный в фигурные скобки { и }. Подобная конструкция рассматривается с точки зрения синтаксиса Java как единое целое и применима в любом месте, где допустим оператор языка.
Оператор присваивания, позволяет выполнить модификацию значения некоторой переменной, и может быть совмещен с некоторой операцией над исходным значением переменной.
a = 10;b -= 10; // b = b - 10с = a + b;url = new URL ("www.javasoft.com"); // создание объекта, // url содержит ссылку
Следует помнить, что при выполнении целочисленных операций, по умолчанию операнды приводятся к типу int. Это может оказаться важным при выполнении логических побитовых операций | (or) и & (and), а также операций сдвига вправо: >>> и >> . При необходимости, можно выполнять явное преобразование типов:
byte b;b = (byte)(b – 10);
Оператор условного ветвления "if" может иметь как полную (if else ) так и сокращенную (if) форму.
if ((size > 0) && (size <= 10)) { // && - лог. операция "And" setSize (size); size = 0;}else throw new Exception ("Bad Size"); // возбудить исключение
Цикл "while", позволяет задать цикл с предусловием. Цикл выполняется до тех пор, пока условие не станет ложным (равным 0).
while (i < a.length) { System.out.println ( a[i++] ); // вывод на системную консоль}
Цикл "do" выполняется хотя бы один раз, выход из цикла осуществляется после того как вычисление условного выражения на даст "ложь" (false).
String [] a = {"CONTINUE", "QUIT"}; // определение данныхint i = 0;do System.out.println ( a[i] ); //вывод на системную консольwhile ("CONTINUE".equals (a[i++])) ); // сравнение строк
Оператор интерационного цикла "for" позволяет выполнить действия определенное количество раз. Синтаксис данного оператора следующий:
for ( int i = 0; i < 10; i++ ) a[i] = 0;
Оператор выбора "switch" , позволяет выполнить выбор из нескольких вариантов, при этом остановить выполнение группы операторов для данного варианта, следует использовать оператор break;:
switch (i) { case 10: i +=15; break; case 15: i +=10; case 20: i +=5; break; default: i -=5; break}
И последний оператор, который присутствует в Java и современных диалектах C++, это оператор обработки исключений "try – catch - finally". Исключение, это класс, наследованный от Exception и создаваемый в программе при возникновении ошибочной ситуации (возможно автоматически). Блок операторов, следующий после ключевого слова try, считается "охраняемым". При возникновении исключения, выполнение блока операторов прекращается и выполнение передается, в зависимости от типа исключения, на блок catch операторов обработки данной ошибки, а далее на блок finally (если он задан) который выполняется независимо от наличия или отсутствия исключения в "охраняемом" блоке.
try { Socket sock; sock = new Socket (InetAddress.getByName("www.sun.com") ); } catch (IOException e ) { System.exit (-1); } catch (MallNotFormedException { System.out.println ("Bad address"); } fianlly { sock = null; }
Как уже отмечалось, данные и код программы на Java инкапсулирован в классах. Для доступа к методами и переменным класса используется конструкция вида: <объект>.<переменная\метод> Например:
Panel p = new Panel(); // создание экземпляра класса Panelp.setLayout(new GridLayout(3,2)); // вызов метода setLayout
При обращении к переменным и методам класса внутри метода того же класса достаточно только указать имя переменной или метода.
Так как классы Java могут наследовать поля и методы своих предков, то существует специальный механизм доступа к подобным компонентам класса. Зарезервированное слово super используется вместо имени объекта при вызове метода или доступа к данным предка. Система Java поддерживает специальную переменную this, которая указывает на текущий загруженный класс, и может быть использованна для доступа к компонентам класса.
Экземпляр любого класса (объект) создается с помощью оператора new. Формат: <перемнная классового типа> = new <конструктор класса>. Каждый Java класс может иметь специальный метод, именуемый конструктором. Имя подобного метода совпадает с именем класса, и для него не указывается тип возвращаемого значения т.к. конструктор ни чего не возвращает. Например:
public class MyClass extends Object{ String str; public MyClass (String s) { // конструктор класса super() // вызов конструктора предка str = s; }}
Назначение подобного метода – инициализация переменных класса и выполнения подготовительных операций.
Для уничтожения объекта, ставшего ненужным, требуется присвоить перемной, указывающей на этот объект, зачение null. Объект будет уничтожен автоматически. Объект также уничтожается автомтически, если в программе потеряны все ссылки на него.
Программа на языке Java состоит как минимум из одного объекта – экземпляра главного класса программы. Это тот класс, который загружается в виртуальную java-машину при пуске программы. В данном классе должна быть определена точка входа в программу, которая оформляется как общедоступный статический метод c именем main и единственным параметром в виде массива строк. Массив строк содержит параметры командной строки запущенной программы.
public class MyProgram { private String s; // перемнная класса public MyProgram (String str) { // конструктор s = str; System.out.println ( s ); } public static void main ( String [] aStrArgs ) { MyProgram p = new MyProgram(aStrArgs[0]); //создать объект System.exit(0); // выход из программы }}
Любая программа теряет всякий смысл, если в ней не предусмотрены операции ввода и вывода. В простейшем случае, на Java можно использовать для этой цели стандартные потоки класса System, связанны с системной консолью. Экземпляр данного класса создается в виртуальной машине при старте и доступ к нему возможен в любой точке программы. В классе определены: поток ввода System.in, типа InputStream и поток System.out типа OutputStream.
Для облегчения программирования вывода, в классе OutputStrem (к которому принадлежит поток out) определен метод println(String s), выводящий строку в поток out. Данные прочих типов приводятся к строковому автоматически.
int age = 23;System.out.println ("My age " + age ); // вывод на экран
Ввод данных с клавиатуры требует больших усилий. Требуется создать дополнительные объекты: InputStreamReader, для чтения символов из входного потока, и BufferedReader, для формирования из символов, возвращаемых InputStreamReader, строк. Объект InputStreamReader следует связать со стандартным потоком ввода in. Чтение строк выполняется методами BufferedReader, строка ограничивается символом "перевод каретки", полученные строки можно преобразовывать в числовые типы int, float, используя статические методы классов Integer и Float: parseInt(String) и parseFloat(String). Следует также обратить внимание на то, что при вводе строк и их преобразовании в число могут возникать исключения, которые следует обрабатывать конструкцией try - catch
import java.io.* // подключение пакетаBufferedReader in = new BufferedReader( new InputStreamReader ( System.in ) ); // создание объектов, обеспечивающих чтение строк символов // ограниченных символом "перевод строки" // с системной консолиString s = in.readLine(); // чтение строки Int i = Integer.parseInt ( s ) // перевод в число (типа Int)
Следует обратить внимание, что классы InputStreamReader и BufferedReader объявлены в пакете java.io, который следует импортировать. Звездочка означает импорт всех классов из пакета.
Классы Java могут быть объединены в пакеты. Пакет – набор взаимосвязанных классов, ориентированных на выполнение конкретной задачи и располагающихся в одной директории на диске. Имя пакета образуется из полного имени директории, например, пакет java.awt. расположе в каталоге %CLASSPATH%\java\awt. Переменная среды CLASSPATH используется виртуальной машиной для определения корневой директории для всех Java-пакетов. Например, если CLASSPATH = D:\JDK;, то пакет java.awt расположен в каталоге D:\jdk\java\awt.
Для указания того факта, что класс принадлежит к пакету, первой строкой в файле определения класса указывается package <имя пакета>; Внутри одного пакета допустимы любые ссылки между классами с указанием только их имени. Ссылки между классами разных пакетов требуют импортирования класса, с помощью предложения import <имя пакета>.<имя класса> в заголовке файла определения класса, сылающегося на другой класс иного пакета. Любой класс Java по умолчанию импортирует все классы из стандартного пакета java.lang.
С детальными описаниями классов, входящих в стандартные пакеты, можно ознакомится в документации по Java, входящей в поставку Java Development Kit, распространяемый фирмой Sun бесплатно.
Определение класса размещается в файле с именем, совпадающем с именем класса, и расширением *.java. В одном файле может быть объявлен только один public класс. В процессе компиляции создается класс-файл, с именем файла исходного текста и расширением *.class. Для запуска программы следует вызвать интерпретатор java-кода, указав в качестве параметра имя основного класса программы.
Следует обратить внимание на то, что компилятор Java различает строчные и прописные буквы в ключевых словах, именах переменных, методов и классов. Все ключевые слова, включая имена простых типов записываются строчными буквами: class, int.
В примерах java, поставляемых фирмой Sun приняты следующие соглашения по наименованию:
классы, первая буква имени и первые буквы каждого нового смыслового слова в названии – прописные, остальные буквы строчные. Например: Applet, CardLayout;
переменные, именуются всегда начиная со строчной буквы. Первые буквы каждого следующего смыслового слова в названии – прописные: popups, minSize;
константы класса - всегда строчными буквами, смысловые слова названия разделены символом "подчеркивание": WINDOW_EVENT_MASK
методы класса – строчными буквами, первая бува каждого следующего смыслового слова прописная: setLayout()