Программирование. Программирование на Java Конспект лекций (ИТМО 2010). Справочник по языку Java и может использоваться как конспект лекционного курса Системы программирования Интернетприложений
Скачать 0.85 Mb.
|
А.В. Гаврилов, С.В. Клименков, Е.А. Цопа Программирование на Java Конспект лекций Санкт-Петербург 2010 МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ САНКТ-ПЕТЕРБУРГСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ, МЕХАНИКИ И ОПТИКИ А.В. Гаврилов, С.В. Клименков, Е.А. Цопа Программирование на Java Конспект лекций Санкт-Петербург 2010 Гаврилов А.В., Клименков С.В., Цопа Е.А. Программирование на Java. Конспект лекций – СПб: СПбГУ ИТМО, 2010. – 130 с. Данное пособие представляет собой краткий справочник по языку Java и может использоваться как конспект лекционного курса «Системы программирования Интернет-приложений». Рассмотрены основные концепции объектно- ориентированного программирования, описан синтаксис языка Java, а также приведено описание основных классов и интерфейсов, входящих в стандартную библиотеку с алгоритмами и примерами их использования. Для подготовки бакалавров и магистров по направлению 23.01.00 «Информатика и вычислительная техника»; по программам подготовки магистров 23.01.00.11 «Базы данных» и 23.01.00.13 «Сети ЭВМ и телекоммуникации». Рекомендовано к печати Ученым советом факультета КТиУ, протокол №15 от 16.11.2010. В 2009 году Университет стал победителем многоэтапного конкурса, в результате которого определены 12 ведущих университетов России, которым присвоена категория «Национальный исследовательский университет». Министерством образования и науки Российской Федерации была утверждена Программа развития государственного образовательного учреждения высшего профессионального образования «Санкт-Петербургский государственный университет информационных технологий, механики и оптики» на 2009–2018 годы. Санкт-Петербургский государственный университет информационных технологий, механики и оптики, 2010 Гаврилов А.В., Клименков С.В., Цопа Е.А., 2010 Оглавление Введение. Основные концепции ООП......................................................................5 Средства разработки.................................................................................................13 Синтаксис и структура языка...................................................................................20 Работа с текстом и многоязыковая поддержка......................................................39 Использование легковесных процессов..................................................................55 Основы сетевого взаимодействия............................................................................60 Работа с потоками ввода-вывода.............................................................................67 Сериализация объектов............................................................................................74 RMI – вызов удаленных методов ............................................................................77 Графический интерфейс пользователя....................................................................81 Обобщенное программирование ..........................................................................118 Коллекции................................................................................................................121 4 Введение. Основные концепции ООП. Язык программирования Java • простой сходство с C и C++ устранение проблематичных элементов • объектно-ориентированный чистая реализация объектно-ориентированной концепции • распределенный поддержка сетевого взаимодействия удаленный вызов методов • интерпретируемый байт-код выполняется виртуальной машиной Java (JVM) • надежный устранение большинства ошибок на этапе компиляции • безопасный контроль и ограничение доступа • архитектурно-нейтральный работа на любых платформах • переносимый независимость спецификации от реализации • высокоэффективный приближенность байт-кода к машинному сочетание производительности и переносимости • многопотоковый встроенная поддержка многопотокового выполнения приложений • динамический загрузка классов во время выполнения приложений Объекты и классы Объект - это программная модель объектов реального мира или абстрактных понятий, представляющая собой совокупность переменных, задающих состояние объекта, и связанных с ними методов, определяющих поведение объекта. 5 Класс - это прототип, описывающий переменные и методы, определяющие характеристики объектов данного класса. Характеристики объектов Класс Состояние Поведение собака кличка, возраст, порода, цвет лает, кусает, виляет хвостом, грызет новые тапочки автомобиль цвет, марка, скорость, передача ускоряется, тормозит, меняет передачу Point x, y show(), hide() переменные Методы Создание объектов Процесс создания новых объектов по описанию, объявленному в классе, называется созданием или реализацией (instantiation). Объекты создаются с помощью команды new. Классы и объекты: Класс Объявление переменных Объект Переменные color color = red Car speed myCar speed = 90 brand brand = Volvo x x = 40 Point y a y = 25 isVisible isVisible = true Объявление класса Реализация объекта class Point { int x, y; boolean isVisible; } Point a; // объявление объекта a = new Point(); // реализация a.x = 40; a.y = 25; a.isVisible = true; 6 Конструкторы Для инициализации объекта при его создании используются конструкторы. Объявление класса Создание объекта class Point { int x, y; boolean isVisible = false; Point() { x = y = 0; } Point(x0, y0) { x = x0; y = y0; } } Point a = new Point(); a.isVisible = true; Point b = new Point(20,50); Значения переменных объектов: Point a b int x 0 20 int y 0 50 boolean isVisible true false Сообщения Объекты взамодействуют между собой путем посылки друг другу сообщений, которые могут содержать параметры. Посылка сообщения осуществляется с помощью вызова соответствующего метода объекта. Объявление класса Вызов методов class Point { int x, y; boolean isVisible; void hide() { isVisible = false; Point a = new Point(20,30); a.isVisible = true; a.hide(); a.move(60,80); a.show(); 7 } void show() { isVisible = true; } void move(x1, y1) { x = x1; y = y1; } } Point center = new Point(); center.show(); Компоненты сообщения: Объект Имя метода Параметры a. move (60,80) center. show () Инкапсуляция Инкапсуляция - сокрытие данных внутри объекта, и обеспечение доступа к ним с помощью общедоступных методов Объявление класса Доступ к переменным класса public class Point { private int x, y; public void move(x1,y1) { x = x1; y = y1; } public int getX() { return x; } public int getY() { return y; } } Point a = new Point(20,30); int z; a.x = 25; // запрещено z = a.y; // запрещено z = a.getY(); a.move(25,a.getY()); a.move(a.getX()-5,a.getY()+5); 8 Наследование Наследование или расширение – приобретение одним классом (подклассом) свойств другого класса (суперкласса). Объявление суперкласса Наследование public class Point { protected int x, y; public Point() { x = y = 0; } public Point(int x, int y){ this.x = x; this.y = y; } public int getX() { return x; } public int getY() { return y; } } public class Pixel extends Point { private int color; public Pixel() { color = 0; } public Pixel(int x, int y){ super(x,y); color = 0; } public setColor(int c) { color = c; } public int getColor() { return color; } } Point a = new Point(30,40); int ax, ay; ax = a.getX(); ay = a.getY(); Pixel b = new Pixel(20,50); b.setColor(2); int bx, by, bc; bx = b.getX(); by = b.getY(); bc = b.getColor(); Полиморфизм Полиморфизм - способность объекта принимать различные формы, что позволяет использовать один и тот же интерфейс для общего класса действий. 9 Объявление классов Использование полиморфизма public class Shape { abstract void draw(); } public class Rectangle extends Shape { void draw() { } } public class Circle extends Shape { void draw() { } } public class FiguresSet { void drawFigure(Shape s){ s.draw(); } public static void main (String args[]) { Rectangle rect; Circle circ; rect = new Rectangle(); circ = new Circle(); drawFigure(rect); drawFigure(circ); } } Принцип подстановки Барбары Лисков Принцип подстановки Барбары Лисков (Liskov Substitution Principle, LSP) – это важный критерий, используемый при построении иерархии наследования: Наследующий класс должен дополнять, а не замещать поведение базового класса. Таким образом, если объектно-ориентированная модель спроектирована в соответствии с LSP, замена в коде объектов класса-предка на объекты класса- потомка не приведёт к изменениям в работе программы. Интерфейсы Интерфейс - абстрактное описание набора методов и констант, необходимых для реализации определенной функции. Объявление интерфейса Воплощение интерфейса interface Displayable { void hide(); public class Pixel extends Point 10 void show(); } implements Displayable { void hide() { } void show() { } } Класс может воплощать любое количество интерфейсов. Вложенные, локальные и анонимные классы Вложенный класс – это класс, объявленный внутри объявления другого класса. public class EnclosingClass { public class NestedClass { } } Локальный класс – это класс, объявленный внутри блока кода. Область видимости локального класса ограничена тем блоком, внутри которого он объявлен. public class EnclosingClass { public void enclosingMethod(){ // Этот класс доступен только внутри enclosingMethod() public class LocalClass { } } } Анонимный класс – это локальный класс без имени. 11 // Параметр конструктора – экземпляр анонимного класса, // реализующего интерфейс Runnable new Thread(new Runnable() { public void run() {...} }).start(); Связность Связность (cohesion) — это мера сфокусированности обязанностей класса. Считается что класс обладает высокой степенью связности, если его обязанности тесно связаны между собой и он не выполняет огромных объемов разнородной работы. Высокая степень связности (high cohesion) позволяет добиться лучшей читаемости кода класса и повысить эффективность его повторного использования. Класс с низкой степенью связности (low cohesion) выполняет много разнородных функций или несвязанных между собой обязанностей. Такие классы создавать нежелательно, поскольку они приводят к возникновению следующих проблем: • Трудность понимания. • Сложность при повторном использовании. • Сложность поддержки. • Ненадежность, постоянная подверженность изменениям. Классы со слабой связностью, как правило, являются слишком «абстрактными» или выполняют обязанности, которые можно легко распределить между другими объектами. Связанность Связанность (coupling) — это мера, определяющая, насколько жестко один элемент связан с другими элементами, либо каким количеством данных о других элементах он обладает. Элемент с низкой степенью связанности (или слабым связыванием, low coupling) зависит от не очень большого числа других элементов и имеет следующие свойства: • Малое число зависимостей между классами. • Слабая зависимость одного класса от изменений в другом. • Высокая степень повторного использования классов. 12 Средства разработки Инструментальные средства JDK 1.6 javac компилятор java интерпретатор jre интерпретатор для конечных пользователей jdb отладчик jvisualvm профилировщик javah генератор файлов заголовков и исходных текстов на C javap дизассемблер классов javadoc генератор документации appletviewer программа просмотра апплетов jar программа, позволяющая упаковать множество классов в исполняемый архив javaws программа, осуществляющая загрузку и запуск приложений с удалённых web-серверов jconsole консоль, предназначенная для мониторинга и управления исполнением приложений jmap вывод карты памяти процесса jps вывод информации о запущенных процессах keytool программа, управляющая ключами и сертификатами native2ascii конвертер файлов в ASCII-формат orbd ORB-сервер servertool консоль администратора ORB-сервера pack200 архиватор unpack200 программа для распаковки архивов policytool программа для чтения и модификации policy-файлов rmic RMI-компилятор rmid RMI-сервер rmiregistry реестр RMI-объектов schemagen генератор XML-схем serialver вывод serialVersionUID классов в CLASSPATH tnameserv служба имён wsgen генератор stubs для веб-сервисов wsimport генератор ties для веб-сервисов xjc генератор классов на основе XML-схем 13 Переменная окружения CLASSPATH определяет дополнительные пути поиска классов. Путь по умолчанию указывает на jar-архивы с классами Java API, входящими в состав JDK, которые находятся в каталогах lib и jre/lib. В переменной CLASSPATH через символ : (двоеточие) перечисляются директории, zip- и jar-архивы, содержащие классы, необходимые для выполнения программ. Для установки переменной CLASSPATH в UNIX используются следующие команды: 1. Bourne или Korn shell: CLASSPATH=.:/usr/local/java/swing/classes export CLASSPATH 2. C-shell: setenv CLASSPATH .:/usr/local/java/swing/classes javac Компилирует исходные тексты (файлы с расширением .java) в байт-код (файлы с расширением .class). javac [ параметры ] файлы В одном файле с расширением .java должен находиться только один public- класс, и имя этого класса (без имени пакета) должно совпадать с именем файла (без расширения). Параметры: -classpath путь Переопределяет путь поиска классов, заданный переменной CLASSPATH -d каталог Задает каталог для хранения классов (по умолчанию используется текущий каталог). Файлы классов размещаются в подкаталогах в соответствии с именами пакетов классов. -deprecation Устанавливает режим выдачи сообщения при каждом использовании устаревшего API. -nowrite Устанавливает режим проверки, при котором откомпилированный класс не записывается. -O Разрешает использовать оптимизацию классов. 14 -verbose Устанавливается режим выдачи сообщений о ходе компиляции. java Интерпретатор байт-кода. Запускает Java-программы (файлы с расширением .class). java [ параметры ] имя_класса [ аргументы ] Программа, которую необходимо выполнить, должна представлять собой класс с именем имя_класса (без расширения .class, но с указанием пакета, которому принадлежит класс) и содержать метод main() с описанием: public static void main(String args[]) Аргументы, указанные в командной строке, помещаются в массив args[] и передаются методу main() Параметры: -classpath путь Переопределяет путь поиска классов, заданный переменной CLASSPATH -cs (-checksource) Указывают на необходимость сравнения времени модификации файла класса и исходного текста и при необходимости перекомпиляции программы. -Dимя=значение Присваивает системному свойству с заданным именем указанное значение. -noverify Отключает режим проверки байт-кода. -verify Включает режим проверки байт-кода для всех классов (по умолчанию проверяются только классы, загруженные по сети). -verbose Устанавливается режим выдачи сообщений о загрузке классов. javadoc Создает документацию в формате HTML для указанных пакетов или файлов исходных текстов Java. javadoc [ параметры ] файлы 15 javadoc [ параметры ] пакет Данные для документирования берутся из комментариев для документации, имеющих вид /** комментарий */ , в которых могут использоваться форматирующие метки HTML. Параметры: -classpath путь Переопределяет путь поиска классов, заданный переменной CLASSPATH -d каталог Задает каталог для записи документации. -docecoding кодировка Задает кодировку символов для документации. -encoding кодировка Задает кодировку символов для исходных текстов. -author Включает в документацию информацию об авторе. -version Включает в документацию информацию о версии. -verbose Устанавливается режим выдачи сообщений о ходе документирования. Документирующие комментарии /** * Первое предложение является кратким описанием класса или * метода. Далее следуют более подробное дополнительное * описание. После описаний могут располагаться специальные * теги, обеспечивающие дополнительное форматирование. * Для классов могут употребляться следующие теги: * @author автор * @version версия * @see класс * @see пакет.класс#метод * @deprecated объяснение */ public class myClass { /** * Эта переменная содержит очень полезную информацию. 16 * Комментарии должны предшествовать объявлению класса, * метода или переменной. * Для переменных используются: * @see класс * @see класс#метод * @deprecated объяснение */ public int myVariable; /** * Метод, устанавливающий все необходимые значения. * Для методов, кроме тегов, используемых для переменных, * могут также использоваться: * @param параметр описание * @return описание * @exception исключение описание */ public String myMethod(int a, int b) throws myException { return str; } } appletviewer Используется для просмотра апплетов, ссылки на которые имеются в HTML- документах. appletviewer [ параметры ] url/файлы Указанные HTML-файлы загружаются, и все апплеты, на которые в них имеются ссылки в виде тега Элементы HTML для поддержки Java <APPLET CODEBASE = codebaseURL ARCHIVE = archiveList CODE = appletFile or OBJECT = serializedApplet ALT = alternateText NAME = appletInstanceName WIDTH = pixels HEIGHT = pixels ALIGN = alignment VSPACE = pixels HSPACE = pixels> </APPLET> • Eclipse (Eclipse Foundation) http://www.eclipse.org • IntelliJIDEA (JetBrains) http://www.jetbrains.com/idea/ • JBuilder (Borland/CodeGear) http://www.embarcadero.com/products/jbuilder • JDeveloper (Oracle) http://www.oracle.com/technology/products/jdev/index.html 19 Синтаксис и структура языка Приложение Hello, World! public class HelloWorld { public static void main(String args[]) { System.out.println("Hello, World!"); // Print string } } /** * Программа пишет "Hello, World" в стандартный поток вывода * @version 2 */ public class HelloWorld { private String name; public static void main(String args[]) { HelloWorld h; if (args.length > 0) h = new HelloWorld(args[0]); else h = new HelloWorld("World"); } /** * Конструктор создает объект с заданным именем */ public HelloWorld(String s) { name = s; } /** * Метод выводит "Hello" и имя в стандартный поток вывода */ public void sayHello() { System.out.println("Hello, " + name + "!"); } } 1. Создайте текстовый файл с именем HelloWorld.java, содержащий приведенную программу. 2. Скомпилируйте программу: javac HelloWorld.java 20 3. Получившийся в результате файл HelloWorld.class запустите на выполнение: java HelloWorld 4. Создайте документацию (для второго варианта программы): javadoc -version HelloWorld.java Апплет Hello, World! import java.applet.Applet; import java.awt.Graphics; public class HelloWorld extends Applet { public void paint(Graphics g) { g.drawString("Hello world!", 50, 25); } } |