WWW.PDF.KNIGI-X.RU
БЕСПЛАТНАЯ  ИНТЕРНЕТ  БИБЛИОТЕКА - Разные материалы
 

Pages:   || 2 | 3 | 4 | 5 |

«Java 2 ПРАКТИЧЕСКОЕ РУКОВОДСТВО Минск УП «УниверсалПресс» УДК 004.432.45 ББК 32.973.26-018.1 Б69 Рекомендовано к изданию Ученым советом факультета ...»

-- [ Страница 1 ] --

И.Н. Блинов, В.С. Романчик

Java 2

ПРАКТИЧЕСКОЕ РУКОВОДСТВО

Минск

УП «УниверсалПресс»

УДК 004.432.45

ББК 32.973.26-018.1

Б69

Рекомендовано к изданию

Ученым советом факультета прикладной математики

и информатики БГУ

Авторы:

доцент кафедры ИПМОАП БГУ,

кандидат физико-математических наук И.Н. Блинов

доцент, зав. кафедрой численных методов и программирования БГУ,

кандидат физико-математических наук В.С. Романчик

Рецензенты:

профессор, докт. физ.-матем. наук В.Б. Таранчук;

доц. канд. физ.-матем. наук И.М. Галкин;

доц. канд. техн. наук А.Е. Люлькин;

доц. канд. физ.-матем. наук С.В. Суздаль Блинов, И.Н.

Б69 Java 2: практ. рук. / И.Н. Блинов, В.С. Романчик. – Мн.: УниверсалПресс, 2005.

– 400 с.

ISBN 985-6699-37-1 Книга предназначена для начинающих и продолжающих изучение Java-технологий. В первой части даны основы языка Java и концепции объектно-ориентированного программирования. Во второй части изложены наиболее важные аспекты применения языка. В третьей части приведены основы программировании распределенных информационных систем с применением сервлетов, JSP, баз данных и собственных тегов разработчика.

В конце каждой главы даны тестовые вопросы по материалу главы и задания для выполнения по рассмотренной теме. В приложениях приведены дополнительные материалы, относящиеся к использованию HTML, XML в информационных системах, основанных на применении Javaтехнологий, а также краткое описание популярной технологии Struts для разработки распределенных систем, объединяющей возможности J2EE и XML.

Дополнительно представлены расширения версии платформы JSDK 1.5.0 (Java 5.0.) УДК ББК © Блинов И.Н., Романчик В.С., 2005 ISBN 985-6699-37-1 © Оформление, УП «УниверсалПресс», 2005 Часть 1. Глава 1.

Приложения и апплеты. Классы и объекты 9

ПРЕДИСЛОВИЕ

Эта книга является обобщением материала, который авторы предлагали студентам механико-математического факультета и факультета прикладной математики и информатики БГУ, а также слушателям курсов повышения квалификации учебного центра IBA при изучении компьютерных технологий. Изучение Java-технологий по учебному плану следует за изучением технологий C++, поэтому авторы при изложении материала довольно часто ссылаются на соответствующие структуры языка C++. При этом знания языка C++ не требуется и никакой зависимости от языка C++ не используется, кроме ссылок на похожий синтаксис языка и на общие концепции объектно-ориентированного программирования. Книгу можно использовать для обучения программированию на языке Java с “нуля”.

Интересы авторов, направленные на обучение, определили структуру данной книги. Книга предназначена для начинающих изучение Javaтехнологий и для продолжающих обучение на среднем уровне. Авторы считают, что “профессионалов” обучить нельзя, ими становятся только после участия в разработке нескольких серьезных Java-проектов. В то же время данный курс может служить ступенькой к мастерству. Прошедшие обучение по данному курсу успешно сдают различные экзамены, получают международные сертификаты и в состоянии участвовать в командной разработке достаточно больших проектов.

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

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

В приложениях приведены дополнительные материалы, относящиеся к использованию HTML, XML в информационных системах, основанных на применении Java-технологий, а также краткое описание популярной технологии Struts для разработки распределенных систем, в полной мере объединяющей возможности J2EE и XML.

Рассмотренный материал относится к программированию на языке Java 2, однако дополнительно представлены нововведения версии платформы JSDK 1.5.0, которую создатели языка назвали Java 5.0.

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

АВТОРЫ БЛАГОДАРЯТ

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

Выражаем благодарность директору отделения интернет-технологий компании IBA В.Ю. Никуленко – за техническую и технологическую поддержку проекта, директору учебного центра IBA В.К. Дюбкову – за финансирование проекта, а также директору отделения управления персоналом И.И. Врублевскому – за поддержку и расширение проекта.

Благодарим наших рецензентов: проректора Белорусского государственного педагогического университета, профессора, докт. физ.-матем.

наук В.Б. Таранчука, доцентов механико-математического факультета БГУ И.М. Галкина, А.Е. Люлькина, С.В. Суздаля, сотрудника IBA В.В.

Леоновича за ценные замечания и предложения.

Выражаем свою признательность студентам факультетов прикладной математики и информатики и механико-математического Белгосуниверситета А. Домино, А. Орлову, А. Шелуховскому, А. Шуманскому, Д. Зюкову, Д. Глиндзичу, А. Казакевичу, А. Полюху, П. Краснопевцеву, П. Шавелю, К. Чернышу, С. Доманову, В. Козловскому, Л. Паримской за подготовку и тестирование целого ряда примеров, иллюстраций и диаграмм.

Часть 1. Глава 1.

Приложения и апплеты. Классы и объекты 11 Часть 1.

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

Глава 1

ПРИЛОЖЕНИЯ И АППЛЕТЫ. КЛАССЫ И ОБЪЕКТЫ

Обзор языка Java 2 Язык Java – это объектно-ориентированный, платформенно-независимый язык программирования, используемый для разработки распределенных приложений, работающих в сети Internet. Проект Java был представлен корпорацией Sun Microsystems в 1995 году. Система программирования Java позволяет использовать World Wide Web (WWW) для распространения небольших интерактивных прикладных программ – апплетов. Они размещаются на серверах Internet, транспортируются клиенту по сети, автоматически устанавливаются и запускаются на месте как часть документа WWW. Апплет имеет весьма ограниченный доступ к ресурсам компьютера клиента, поэтому он может предоставлять произвольный мультимедийный интерфейс и выполнять сложные вычисления без риска повреждения данных на диске. Другим видом программ являются приложения Java, представляющие собой переносимые коды, которые могут выполняться на любом компьютере, независимо от его архитектуры. Генерируемый при этом виртуальный код представляет набор инструкций для выполнения на интерпретаторе виртуального кода – виртуальной Javaмашине (JVM – Java Virtual Machine). Широкое распространение получили сервлеты и JSP (Java Server Pages), предоставляющие клиентам возможность доступа к серверным приложениям и базам данных.

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

Язык Java использует синтаксис языка C++. Основные отличия от C++ связаны с необходимостью уменьшения размеров программ и увеличения требований к безопасности переносимых приложений, работающих в сети.

Java не поддерживает указателей (наиболее опасного средства языка С++), так как возможность работы с произвольными адресами памяти через безтиповые указатели позволяет игнорировать защиту памяти.

Системная библиотека классов языка содержит классы и пакеты, реализующие различные базовые возможности языка. Методы классов, включенных в эти библиотеки, вызываются из JVM во время интерпретации Java-программы.

В Java все объекты программы расположены в динамической памяти (heap) и доступны по объектным ссылкам, которые, в свою очередь, хранятся в стеке (stack). Это решение исключило непосредственный доступ к памяти, но усложнило работу с элементами массивов и сделало ее менее эффективной по сравнению с программами на C++. Необходимо отметить, что объектные ссылки языка Java содержат информацию о классе объектов, на которые они ссылаются, так что объектные ссылки – это не указатели, а дескрипторы объектов. Наличие дескрипторов позволяет JVM выполнять проверку совместимости типов на фазе интерпретации кода, генерируя исключение в случае ошибки. В Java пересмотрена и концепция динамического распределения памяти: отсутствуют способы освобождения динамически выделенной памяти. Вместо этого реализована система автоматического освобождения памяти (сборщик мусора), выделенной с помощью оператора new.

Стремление разработчиков упростить Java-программы и сделать их более понятными привело к необходимости удаления из языка файловзаголовков (h-файлов) и препроцессорной обработки. Файлы-заголовки С++, содержащие прототипы классов и распространяемые отдельно от двоичного кода этих классов, усложняют управление версиями, что дает возможность несанкционированного доступа к частным данным. В Javaпрограммах спецификация класса и его реализация всегда содержатся в одном и том же файле.

Java не поддерживает структуры и объединения, являющиеся частными случаями классов в C++. Язык Java не поддерживает перегрузку операторов и typedef, беззнаковые целые (если не считать таковым char), а также использование методами аргументов по умолчанию. В Java отсутствует множественное наследование, существуют конструкторы, но отсутствуют деструкторы (применяется автоматическая сборка мусора), не используется оператор goto и слово const, хотя они являются зарезервированными словами языка.

Часть 1. Глава 1.

Приложения и апплеты. Классы и объекты 13 Наиболее существенные новые возможности, появившиеся в Java, – это интерфейсы (аналог абстрактных классов C++) и многопоточность (возможность одновременного выполнения частей кода).

Изменения в версии J2SE 5.0

В версии языка J2SE 5.0 внесены некоторые изменения и усовершенствования:

• введено понятие шаблона класса;

• поддерживаются перечисления типов;

• упрощен обмен информацией между примитивными типами данных и их классами-оболочками;

• разрешено определение метода с переменным количеством параметров;

• возможен статический импорт констант и методов;

• улучшен механизм формирования коллекций;

• добавлен форматированный консольный ввод/вывод;

• увеличено число математических методов;

• введены новые способы управления потоками;

• добавлены новые возможности в ядре и др.

Простое приложение

Изучение любого языка программирования удобно начинать с программы вывода обычного сообщения:

// пример # 1 : простое приложение: First.java public class First { public static void main (String[] args) { System.out.println("Первая программа на Java!");

} } Здесь класс First используется для того, чтобы определить метод main() который запускается автоматически интерпретатором Java.

Метод main() содержит аргументы-параметры командной строки String[] args в виде массива строк и является открытым (public) членом класса. Это означает, что метод main() виден и доступен любому классу. Ключевое слово static объявляет методы и переменные класса, используемые для работы с классом в целом, а не только с объектом класса. Символы верхнего и нижнего регистров здесь различаются, как и в C++. Вывод строки "Первая программа на Java!" в примере осуществляет метод println() (ln – переход к новой строке после вывода) свойства out класса System, который включается в пакет автоматически

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

вместе с пакетом lang. Приведенную программу необходимо поместить в файл с расширением.java, имя которого совпадает с именем класса.

Простейший способ компиляции – вызов строчного компилятора:

javac First.java

При успешной компиляции создается файл First.class. Выполнить этот виртуальный код можно с помощью интерпретатора Java:

java First Чтобы выполнить приложение, необходимо загрузить и установить последнюю версию пакета, например с сайта java.sun.com. При инсталляции рекомендуется указывать для размещения корневой каталог.

Если JSDK установлена в директории (для Windows) c:\jdk1.5.0, то каталог, который компилятор Java будет рассматривать как корневой для иерархии пакетов, можно задавать с помощью переменной среды окружения СLASSPATH в виде:

СLASSPATH=.;c:\jdk1.5.0\src.zip Переменной задано еще одно значение ‘.’ для использования текущей директории, например с:\temp, в качестве рабочей для хранения своих собственных приложений.

Чтобы можно было вызывать сам компилятор и другие исполняемые программы, переменную PATH нужно проинициализировать в виде PATH=c:\jdk.5.0\bin Этот путь указывает на месторасположение файлов javac.exe и java.exe. В различных версиях путь к JSDK может указываться различными способами.

Следующая программа отображает в окне консоли аргументы командной строки метода main(). Аргументы представляют массив строк, разделенных пробелами, значения которых присваиваются объектам массива String[] args. Объекту args[0] присваивается значение первой строки и т.д. Количество аргументов определяется значением args.length.

/* пример # 2 : вывод аргументов командной строки :

OutArgs.java */ public class OutArgs { public static void main(String[] args) { for (int j = 0; j args.length; j++) System.out.println("Aрг #" + j + "- " + args[j]);

} }

Запуск этого приложения с помощью следующей командной строки:

java OutArgs 2005 argument-2 "Java string" приведет к выводу на консоль следующей информации:

Часть 1. Глава 1.

Приложения и апплеты. Классы и объекты 15 Арг #0- 2005 Арг #1- argument-2 Арг #2- Java string Аргументы командной строки могут быть использованы как один из способов ввода строковых данных.

В следующем примере рассматривается ввод строки из потока ввода, связанного с консолью.

// пример # 3 : ввод строки с консоли : InputStr.java import java.io.*;//подключение пакета классов public class InputStr { public static void main(String[] args) { /* байтовый поток ввода System.in передается конструктору при создании объекта класса InputStreamReader */ InputStreamReader is = new InputStreamReader (System.in);

/* производится буферизация данных, исключающая необходимость обращения к источнику данных при выполнении операции чтения */ BufferedReader bis = new BufferedReader(is);

try { System.out.println( "Введите Ваше имя и нажмите Enter:");

/*чтение строки из буфера; метод readLine() требует обработки возможной ошибки при вводе c консоли в блоке try */ String name = bis.readLine();

System.out.println("Привет, " + name);

} catch (IOException e) { System.out.print("ошибка ввода " + e);

} } } Обработка исключительной ситуации IOException, которая возникает в операциях ввода/вывода, осуществляется в методе main() с помощью реализации блока try-catch.

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

В этом примере использованы конструкторы и методы классов InputStreamReader и BufferedReader из библиотеки java.io, в

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

частности метод readLine() для чтения строки из буфера, связанного с потоком ввода System.in. Подробности действий указанных классов будут рассмотрены в главе, посвященной потокам ввода/вывода.

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

// пример # 4 : простой апплет : FirstApplet.java import java.awt.*;

public class FirstApplet extends java.applet.Applet { private String date;

public void init() { date = new java.util.Date().toString();

} public void paint(Graphics g) { g.drawString("Апплет запущен:", 50, 15);

g.drawString(date, 50, 35);

} } Для вывода текущего времени и даты в этом примере был использован объект Date из пакета java.util. Метод toString() используется для преобразования информации, содержащейся в объекте, в строку для последующего вывода в апплет с помощью метода drawString(). Цифровые параметры этого метода обозначают горизонтальную и вертикальную координаты начала рисования строки, считая от левого верхнего угла апплета.

Апплету не нужен метод main() код его запуска помещается в метод init() или paint(). Для запуска апплета нужно поместить ссылку на его класс в HTML-документ и просмотреть этот документ Web-браузером, поддерживающим Java.

При этом можно обойтись очень простым фрагментом (тегом) applet в HTML-документе view.html:

htmlbody applet code= FirstApplet.class width=300 height=300 /applet/body/html Сам файл FirstApplet.class при таком к нему обращении должен находиться в той же директории, что и HTML-документ. Исполнителем HTML-документа является браузер Microsoft Internet Explorer или какой-либо другой, поддерживающий Java.

Часть 1. Глава 1.

Приложения и апплеты. Классы и объекты 17 Результат выполнения документа view.html изображен на рис.1.1.

–  –  –

Классы и объекты Классы в Java содержат переменные-члены класса, а также методы и конструкторы. Основные отличия от классов C++: все функции определяются внутри классов и называются методами; невозможно создать метод, не являющийся методом класса, или объявить метод вне класса; ключевое слово inline как в C++ не поддерживается; спецификаторы доступа public, private, protected воздействуют только на то, перед чем они стоят, а не на участок от одного до другого спецификатора, как в С++;

элементы по умолчанию не устанавливаются в private, а доступны для классов из данного пакета. Объявление класса имеет вид:

[спецификаторы] class имя_класса [extends суперкласс] [implements список_интерфейсов]{/*определение класса*/} Спецификатор доступа к обычному внешнему классу может быть public (класс доступен объектам данного пакета и вне пакета), final (класс не может иметь подклассов),

Abstract

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

// пример # 5 : простой пример класса : Subject.java class Subject { public String name;

private int age;

public Subject() { //конструктор name = "NoName";

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

age = 0;

} public Subject(String n) {//конструктор name = n;

} public void setAge(int a) {//метод age = a;

} public int getAge() {//метод return age;

} void show() { //метод System.out.println("Имя: " + name + ", Возраст: " + age);

} } Класс Subject содержит два поля name и age, помеченные как public и private. Значение поля age можно изменять только при помощи методов, например setAge(). Поле name доступно и напрямую через объект класса Subject. Доступ к методам и public-полям данного класса осуществляется только после создания объекта данного класса.

/* пример # 6 : создание объекта, доступ к полям и методам объекта : SubjectDemo.java */ public class SubjectDemo { public static void main(String[] args) { Subject ob = new Subject("Балаганов");

ob.name = "Шура Балаганов";

//ob.age = 19;// поле недоступно ob.setAge(19);

ob.show();

} }

Компиляция и выполнение данного кода приведут к выводу на консоль следующей информации:

Имя: Шура Балаганов, Возраст: 19 Классы из примеров 5 и 6 можно сохранять перед компиляцией в одном файле SubjectDemo.java, причем имя этому файлу дается по имени public класса, то есть SubjectDemo.

Часть 1. Глава 1.

Приложения и апплеты. Классы и объекты 19 Объект класса создается за два шага. Сначала объявляется ссылка на объект класса. Затем с помощью оператора new создается экземпляр объекта, например:

String str; //объявление ссылки str = new String(); //создание объекта

Однако эти два действия обычно объединяют в одно:

String str = new String();/*объявление ссылки и создание объекта*/ Оператор new вызывает конструктор, поэтому в круглых скобках могут стоять аргументы, передаваемые конструктору. Операция присваивания для объектов означает, что две ссылки будут указывать на один и тот же участок памяти.

Операции сравнения ссылок не имеют особого смысла. Для сравнения значений объектов необходимо использовать соответствующие методы, например equals(). Этот метод наследуется в каждый класс из суперкласса Object, который лежит в корне дерева иерархии классов.

x.equals(y) возвращает true, если содержимое объектов x и y эквивалентно, как, например:

/* пример # 7 : сравнение строк и объектов :

ComparingStrings.java */ public class ComparingStrings { public static void main(String[] args) { String s1, s2;

s1 = "abc";

s2 = s1; // переменная ссылается на ту же строку System.out.println("сравнение ссылок " + (s1 == s2));

// результат true //создание нового объекта добавлением символа s1 += 'd';

//s1-="a";//ошибка, вычитать строки нельзя System.out.println("сравнение ссылок " + (s1 == s2));

// результат false //создание нового объекта копированием s2 = new String(s1);

System.out.println("сравнение ссылок " + (s1 == s2));

// результат false System.out.println("сравнение значений " + s1.equals(s2)); // результат true } }

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

Объекты можно преобразовывать один к другому с помощью соответствующих методов и конструкторов. В следующем примере с консоли (из потока System.in) считываются три цифровые строки, преобразуются в объекты класса Integer с помощью метода Integer.valueOf(), а затем объекты класса Integer преобразуются в целые числа типа int с помощью метода intValue() этого же класса.

/* пример # 8 : преобразование массива строк в массив целых чисел : ConsoleStringToInt.java */ import java.io.*;

public class ConsoleStringToInt { public static void main(String[] args) { //буферизация входного потока BufferedReader br = new BufferedReader(new InputStreamReader(System.in));

//объявление массива строк String masStr[] = new String[3];

//объявление массива целых чисел int masInt[] = new int[3];

try { System.out.println("введите три целых числа,");

System.out.println("после каждого нажмая Enter -");

for (int i = 0; i 3; i++) { //чтение строки, содержащей целое число masStr[i] = br.readLine();

//преобразование строки в целое число masInt[i] = Integer.valueOf(masStr[i]).intValue();

} System.out.print("массив: ");

for (int i = 0; i 3; i++) { System.out.print(masInt[i] + "; ");

} // обработка ошибки чтения с консоли } catch (IOException e) { System.out.print("ошибка ввода " + e);

/* обработка ошибки при неправильном формате целого числа */ } catch (NumberFormatException e) { System.out.print( "неправильный формат числа " + e);

} } } Часть 1. Глава 1.

Приложения и апплеты. Классы и объекты 21

В качестве примера в консоль в ответ на запрос следует ввести некоторые целые числа и получить, например, следующий результат:

Введите три целых числа, после каждого нажмая Enter массив: 35; 7; 58;

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

В языке Java используются однострочные и блочные комментарии // и /* */, аналогичные комментариям, применяемым в C++.

Введен также новый вид комментария /** */, который может содержать дескрипторы вида:

@author – задает сведения об авторе;

@exception – задает имя класса исключения;

@param – описывает параметры, передаваемые методу;

@return – описывает тип, возвращаемый методом;

@throws – описывает исключение, генерируемое методом.

Из java-файла, содержащего такие комментарии, соответствующая утилита javadoc.exe может извлекать информацию для документирования классов и сохранения ее в виде HTML-документа.

Задания к главе 1 Вариант A

1. Написать приложение, выводящее n строк с переходом и без перехода на новую строку.

2. Написать приложение для ввода пароля из командной строки и сравнения его со строкой-образцом.

3. Написать программу ввода целых чисел как аргументов командной строки, подсчета их суммы (произведения) и вывода результата на консоль.

4. Написать приложение, выводящее фамилию разработчика, дату и время получения задания, а также дату и время сдачи задания.

Для получения последней даты и времени использовать класс Date из пакета java.util (Объявление объекта Date d = new Date();) или статический метод класса System.currentTimeMillis().

5. Написать апплет с выводом в окно фамилии разработчика и даты.

6. Добавить комментарий в программы 1-7 в виде /** комментарий */, с помощью программы javadoc.exe извлечь эту

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

документацию в HTML-документ и просмотреть полученную страницу Web-браузером.

Вариант B Ввести с консоли n целых чисел и поместить их в массив.

На консоль вывести:

1. Четные и нечетные числа.

2. Числа, которые делятся на 3 или на 9.

3. Числа, которые делятся на 5 или на 10.

4. Наибольший общий делитель и наименьшее общее кратное этих чисел.

5. Простые числа.

6. “Счастливые” числа.

7. Числа Фибоначчи: f0 = f1 = 1, f (n) = f (n–1) + f (n–2).

8. Числа-палиндромы, значения которых в прямом и обратном порядке совпадают.

9. Период десятичной дроби p = m/n для первых двух целых положительных чисел n и m, расположенных подряд.

10. Построить треугольник Паскаля для первого положительного числа.

Тестовые задания к главе 1 Вопрос 1.1.

Дан код:

class Quest1 { private static void main (String a) { System.out.println("Java 2");

}} Какие исправления необходимо сделать, чтобы класс Quest1 стал запускаемым приложением? (выберите 2 правильных варианта)

1) объявить класс Quest1 как public;

2) заменить параметр метода main() на String[] a;

3) заменить параметр доступа к методу main() на public;

4) убрать параметр из объявления метода main().

Вопрос 1.2.

Выберите истинные утверждения:

1) в Java можно использовать оператор goto;

2) в Java можно создавать методы, не принадлежащие ни одному классу;

3) Java поддерживает множественное наследование классов;

4) в Java нельзя перегрузить оператор;

Часть 1. Глава 1.

Приложения и апплеты. Классы и объекты 23

5) Java поддерживает многопоточность.

Вопрос 1.3.

Дан код:

class Quest3 { public static void main(String s[ ]) { String args;

System.out.print(args + s);

}}

Результатом компиляции кода будет:

1) ошибка компиляции: метод main() содержит неправильное имя параметра;

2) ошибка компиляции: переменная args используется до инициализации;

3) ошибка компиляции: несовпадение типов параметров при вызове метода print();

4) компиляция без ошибок.

Вопрос 1.4.

Дан код:

public class Quest4 { public static void main(String[] args) { byte b[]=new byte[80];

for (int i=0;ib.length;i++) b[i]=(byte)System.in.read();

System.out.print(“Ok”); } }

Результатом компиляции и запуска будет:

1) вывод: Ok;

2) ошибка компиляции: так как метод read() может порождать исключительную ситуацию типа IOException;

3) ошибка компиляции: так как длина массива b может не совпадать с длиной считываемых данных;

4) ошибка времени выполнения: так как массив уже проинициализирован.

Вопрос 1.5.

Дан код:

public class Quest5{ public static void main(){ System.out.print("А"); } public static void main(String args){ System.out.print("Б"); }

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

public static void main(String[] args){ System.out.print("В"); }}

Что будет выведено в результате компиляции и запуска:

1) ошибка компиляции;

2) Б;

3) ВБА;

4) В;

5) АБВ.

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

Глава 2

ТИПЫ ДАННЫХ. ОПЕРАТОРЫ. МАССИВЫ

Базовые типы данных и литералы В языке Java определено восемь базовых типов данных, размер каждого из которых остается неизменным независимо от платформы. Беззнаковых типов в Java не существует.

Значения Размер По Тип (бит) умолчанию (диапазон или максимум) boolean 8 false true, false byte 8 0 –128..127 char 16 '\u0000' 0..65535 short 16 0 –32768..32767 int 32 0 -2147483648..2147483647 long 64 0 922372036854775807L float 32 0.0f 3.40282347E+38 double 64 0.0 1.797693134486231570E+308 В отличие от C++ тип char использует формат UNICODE длиной два байта, что позволяет использовать множество наборов символов, включая иероглифы.

В Java используются целочисленные литералы: 1024, 015 – восьмеричное значение, 0х51 – шестнадцатеричное значение. Целочисленные литералы создают значение типа int.

если необходимо определить длинный литерал типа long, в конце указывается символ L (например:

0xffffL). Литералы с плавающей точкой записываются в виде 1.918 или в экспоненциальной форме 0.112E-05 и относятся к типу double.

Если необходимо определить литерал типа float, то в конце следует добавить символ F. Символьные литералы определяются в апострофах (‘a’, ‘\n’, ‘\141’, ‘\u005a’ ). Строки заключаются в двойные апострофы и представляют собой объекты. Литералами считаются булевские значения true и false, а также null – значение по умолчанию для объектов.

В арифметических выражениях автоматически выпоняются расширяющие преобразования типа byte short int long double. Java автоматически расширяет тип каждого byte float Часть 1. Глава 2.

Типы данных. Операторы. Массивы 25 или short операнда до int. Для сужающих преобразований необходимо производить явное преобразование вида (тип)значение.

Например:

byte b=(byte)128;

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

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

Имена переменных не могут начинаться с цифры, в именах не могут использоваться символы арифметических и логических операторов, а также символ ‘#’. Применение символов ‘$’ и ‘_’ допустимо, в том числе и в первой позиции имени.

/* пример # 1 : типы данных и операции над ними :

TypeByte.java */ class TypeByte { public static void main(String[] args) { int i = 3;

byte b = 1, b1 = 1 + 2;

//b = b1 + 1; //ошибка приведения типов b = (byte)(b1 + 1);//0 //b = -b; //ошибка приведения типов b = (byte)-b;//1 //b = +b1; //ошибка приведения типов b = (byte) + b1; //2 b1 *= 2; //3 b1++; //4 //b = i; //ошибка приведения типов b = (byte)i; //5 b += i++; //работает!!! //6 float f = 1.1f;

b /= f; //работает!!! //7 } } Переменные базовых типов, объявленные как члены класса, хранят нулевые значения, соответствующие своему типу. Если переменные объявлены как локальные переменные в методе, то перед использованием они обязательно должны быть проинициализированы.

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

Классы-оболочки Кроме базовых типов данных широко используются соответствующие классы-оболочки (wrapper-классы): Boolean, Character, Integer, Byte, Short, Long, Float, Double. Объекты этих классов могут хранить те же значения, что и соответствующие им базовые типы.

Рис. 2.1. Классы-оболочки

Объекты этих классов представляют ссылки на участки динамической памяти, в которой хранятся их значения, и являются классами-оболочками для значений базовых типов. Указанные классы находятся в библиотеке java.lang, являются наследниками абстрактного класса Number и реализуют интерфейс Comparable, представляющий собой интерфейс для работы со всеми скалярными типами.

Объекты классов-оболочек не могут принимать участия в арифметических операциях и по умолчанию получают значение null.

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

Для приведения объектов к другому типу используются также методы valueOf(), toString() и др. Объекты класса могут быть преобразованы к любому базовому типу методами intValue(), digit(), longValue()и др.

Однако класс Character не наследуется от Number, так как этому классу нет необходимости поддерживать интерфейс классов, предназначенных для хранения результатов арифметических операций. Класс Character имеет целый ряд специфических методов для обработки символьной информации. У класса Character, в отличие от других классов оболочек, не существует конструктора с параметром типа String.

Часть 1. Глава 2.

Типы данных. Операторы.

Массивы 27 /* пример # 2 : преобразование типов данных :

Types.java */ public class Types { public static void main(String[] args) { Float f1 = new Float(10.01); //double в Float String s1 = Float.toString(0f); //float в String String s2 = String.valueOf(f1); //Float в String Byte b = Byte.valueOf("120"); //String в Byte double d = b.doubleValue(); //Byte в double short s = (short) d; //double в short /* Character в int */ Character ch = new Character('3');

int i = Character.digit(ch.charValue(), 10);

System.out.println("s1=" + s1 + ", s2=" + s2);

System.out.print("b=" + b + ", s=" + s + ", d=" + d + ", i=" + i);

} }

Результатом выполнения данного кода будет:

s1=0.0, s2=10.01 b=120, s=120, d=120.0, i=3 Статический метод valueOf(String str) класса Number переопределен для всех подклассов, соответствующих примитивным типам, и выполняет действия по преобразованию значения, заданного в виде строки, к значению соответствующего объектного типа данных.

Методы вида byteValue(), intValue() и др. преобразуют значение объектного типа данных к базовому типу. Определены для всех объектных типов.

Статические методы getNumericValue(char ch) или digit (char ch, int radix) преобразуют символ к соответствующему целочисленному значению типа int в заданной системе счисления.

Java включает два класса для работы с высокоточной арифметикой – BigInteger и BigDecimal, которые поддерживают целые числа и числа с фиксированной точкой произвольной точности.

Строка в Java представляет объект класса String. При работе со строками можно использовать перегруженную операцию "+" объединения строк, а также методы класса String. Строковые константы заключаются в двойные кавычки и не заканчиваются символом '\0', это не ASCIIстроки, а массивы символов.

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

Классы-оболочки в J2SE 5.0 Серьезных различий между базовыми типами и классами-оболочками стало меньше. Теперь разрешено участие объектов в арифметических операциях, в том числе с использованием базовых типов:

Integer j = new Integer(1);

Integer k = ++j;

int i = 2;

k = i + j + k;

Однако следующий код генерирует исключительную ситуацию NullPointerException при попытке присвоить базовому типу значение null объекта класса Integer.

class NewProperties { static Integer i = null;

public static void main(String[] args) { int j = i; //генерация исключения } } Несмотря на то, что значения базовых типов могут быть присвоены объектам классов-оболочек, сравнение объектов между собой происходит по ссылкам.

int i = 7;

Integer oa = i;

Integer ob = i;

System.out.print("oa == i" + (oa == i));//true System.out.print("ob == i" + (ob == i));//true System.out.print("oa == ob" + (oa == ob));//false System.out.print("oa.equals(i)" + oa.equals(i) + oa.equals(ob));//true

Значение базового типа может быть передано в метод equals(). Однако ссылка на базовый тип не может вызывать методы:

boolean b = i.equals(oa));//ошибка компиляции При инициализации объекта класса-оболочки значением базового типа преобразование типов необходимо указывать явно, то есть код Float f = 7;//правильно будет (float)7 вместо 7 вызывает ошибку компиляции.

Часть 1. Глава 2.

Типы данных. Операторы. Массивы 29

–  –  –

141 = 7 141 = 28 142 = 3

Тернарный оператор "?" используется в выражениях:

booleanexp ? value0 : value1 Если booleanexp равно true, вычисляется значение value0 и оно становится результатом выражения, иначе результатом является значение value1.

Оператор instanceof возвращает значение true, если объект является экземпляром данного класса, например:

Font obj = new Font("Courier", 1, 18);

if (obj instanceof java.awt.Font) {/*операторы*/} Числовые параметры при объявлении объекта класса Font указывают на стиль и размер шрифта.

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

Операторы управления Оператор if и три вида операторов цикла аналогичны операторам

C++:

if (boolexp) { /*операторы*/} else { /*операторы*/ }//может отсутствовать while (boolexp) { /*операторы*/ } do { /*операторы*/ } while (boolexp);

for(exp1; boolexp; exp3){ /*операторы*/ }

–  –  –

Цикл for в J2SE 5.0 Появилась возможность при работе с массивами и коллекциями получать доступ к их элементам без использования индексов или итераторов.

int[] array = {1, 3, 5, 11};

for(int i : array) System.out.printf("%d ", i);//вывод всех элементов В то же время изменить значения элементов массива с помощью такого цикла нельзя.

Часть 1. Глава 2.

Типы данных. Операторы. Массивы 33 Массивы Массивы элементов базовых типов состоят из значений, проиндексированных начиная с нуля. Все массивы в языке Java являются динамическими, поэтому для создания массива требуется выделение памяти с помощью оператора new или инициализации. Значения элементов неинициализированных массивов, для которых выделена память, устанавливается в нуль. Имена массивов являются ссылками. Для объявления ссылки на массив можно записать пустые квадратные скобки после имени типа, например: int a[]. Аналогичный результат получится при записи int[] a.

/* пример # 5 : замена отрицательных элементов массива на максимальный : FindReplace.java */ public class FindReplace { public static void main(String[] args) { int myArray[];//объявление ссылки //объявление с инициализацией значениями по умолчанию int mySecond[] = new int[100];

/*объявление с инициализацией */ int a[] = {5, 10, 0, -5, 16, -2};

int max = a[0];

//поиск max-элемента for(int i = 0; i a.length; i++) if(max a[i]) max = a[i];

for(int i = 1; i a.length; i++) { //замена if( a[i] 0 ) a[i] = max;

mySecond[i] = a[i];

System.out.println("a[" + i + "]= " + a[i]);

} myArray = a; //установка ссылки на массив а } }

В результате выполнения программы будет выведено:

a[0]= 5 a[1]= 10 a[2]= 0 a[3]= 16 a[4]= 16 a[5]= 16 Присваивание mySecond[i]=a[i] приведет к тому, что части элементов массива mySecond, а именно шести, будут присвоены значения элементов массива a. Остальные элементы mySecond сохранят значения,

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

полученные при инициализации, то есть нули. Если же присваивание организовать в виде mySecond=a или myArray=a, то оба массива, участвующие в присваивании, получат ссылку на массив a, то есть оба будут содержать по шесть элементов и ссылаться на один и тот же участок памяти.

Многомерных массивов в Java не существует, но можно объявлять массивы массивов.

Для задания начальных значений массивов существует специальная форма инициализатора, например:

int arr[][] = { { 1 }, { 2, 3 }, { 4, 5, 6 }, { 7, 8, 9, 0 } };

Первый индекс указывает на порядковый номер массива, например arr[2][0] указывает на первый элемент третьего массива, а именно на значение 4.

В следующей программе создаются и инициализируются массивы массивов равной длины (матрицы) и выполняется произведение одной матрицы на другую.

/* пример # 6 : произведение двух матриц :

Matrix.java */ public class Matrix { private int[][] a;

Matrix(int n, int m) { // создание и заполнение случайными значениями a = new int[n][m];

for (int i = 0; i n; i++) for (int j = 0; j m; j++) a[i][j] = (int) (Math.random() * 5);

show();

} public Matrix(int n, int m, int k) { a = new int[n][m];

for (int i = 0; i n; i++) for (int j = 0; j m; j++) { a[i][j] = k;

} if(k!=0) show();

} public void show() { System.out.println("Maтрица : " + a.length + " на " + a[0].length);

for (int i = 0; i a.length; i++) { Часть 1. Глава 2.

Типы данных. Операторы. Массивы 35 for (int j = 0; j a[0].length; j++) System.out.print(a[i][j] + " ");

System.out.println();

} } public static void main(String[] args) { int n = 2, m = 3, l = 4;

Matrix p = new Matrix(n, m);

Matrix q = new Matrix(m, l);

Matrix r = new Matrix(n, l, 0);

for (int i = 0; i p.a.length; i++) for (int j = 0; j q.a[0].length; j++) for (int k = 0; k p.a[0].length; k++) r.a[i][j] += p.a[i][k] * q.a[k][j];

System.out.println("Произведение матриц: ");

r.show();

} }

Так как значения элементам массивов присваиваются при помощи метода random(), то одним из вариантов выполнения кода может быть следующий:

Maтрица : 2 на 3 Maтрица : 3 на 4

Произведение матриц:

Maтрица : 2 на 4 Если объект создан внутри класса, то он имеет прямой доступ к полям, объявленным как private.

Массивы объектов при объявлении в действительности представляют собой массивы ссылок, проинициализированных по умолчанию значением null.

/* пример # 7 : копирование массива :

ArrayCopyDemo.java */ public class ArrayCopyDemo {

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

public static void main(String[] args) { int mas1[] = { 1, 2, 3 }, mas2[] = { 4, 5, 6, 7, 8, 9 };

System.out.print("mas1[]: ");

show(mas1);

System.out.print("\nmas2[]: ");

show(mas2);

//копирование массива mas1[] в mas2[] System.arraycopy(mas1, 0, mas2, 2, 3);

/* 0 – mas1[] копируется начиная с первого элемента, 2 – элемент, с которого начинается замена, 3 – количество копируемых элементов */ System.out.println("\n после arraycopy(): ");

System.out.print("mas1[]: ");

show(mas1);

System.out.print("\n mas2[]: ");

show(mas2);

} private static void show(int[] mas) { int i;

for (i = 0; i mas.length; i++) System.out.print(" " + mas[i]);

} } mas1[]: 1 2 3 mas2[]: 4 5 6 7 8 9 после arraycopy():

mas1[]: 1 2 3 mas2[]: 4 5 1 2 3 9 Все массивы хранятся в куче (heap), одной из подобластей памяти, выделенной системой для работы виртуальной машины. Определить общий объем памяти и объем свободной памяти можно с помощью методов totalMemory() и freeMemory() класса Runtime.

/* пример # 8 : информация о состоянии оперативной памяти : RuntimeDemo.java */ public class RuntimeDemo { public static void main(String[] args) { Runtime rt = Runtime.getRuntime();

System.out.println("Полный объем памяти: " + rt.totalMemory());

System.out.println("Свободная память: " + rt.freeMemory());

Часть 1. Глава 2.

Типы данных. Операторы. Массивы 37 double d[] = new double[10000];

System.out.println("Свободная память после" + " объявления массива: " + rt.freeMemory());

try { rt.exec("mspaint"); //запуск mspaint.exe } catch (java.io.IOException e) { System.out.println(e.getMessage());

} System.out.println("Свободная память после " + "запуска mspaint.exe: " + rt.freeMemory());

} }

В результате выполнения этой программы может быть выведена, например, следующая информация:

Полный объем памяти: 2031616 Свободная память: 1903632 Свободная память после объявления массива: 1823336 Свободная память после запуска mspaint.exe: 1819680 Объект класса Runtime создается при помощи вызова статического метода getRuntime(), возвращающего объект Runtime, который ассоциирован с данным приложением. Запуск внешних приложений осуществляется с помощью метода exec(), в качестве одного из параметров которого может применяться строка с именем запускаемого приложения. Внешнее приложение использует для своей работы память операционной системы.

Класс Маth Рассмотрим пример обработки значения случайного числа, полученного с помощью метода random() класса Math. В классе Math существует ряд других полезных методов, таких как floor(), ceil(), rint(), round(), max(параметр, параметр), min(параметр, параметр), которые выполняют задачи по округлению, поиску экстремальных значений, нахождению ближайшего целого и т.д.

/* пример # 9 : использование методов класса Math :

MathMethods.java */ public class MathMethods { public static void main(String[] args) { final int MAX_VAL = 10;

double d, max = 0, min = MAX_VAL;

d = Math.random() * MAX_VAL;

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

System.out.println("Округленное до ближайшего"

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

+ " целого =" + Math.round(d));

System.out.println("Наибольшее целое, " + " = исходного числа =" + Math.floor(d));

System.out.println("Наименьшее целое, " + " = исходного числа =" + Math.ceil(d));

System.out.println("Ближайшее целое значение" + " исходного числа =" + Math.rint(d));

} }

Один из вариантов выполнения кода представлен ниже:

d = 0.08439575016076173 Округленное до ближайшего целого =0 Наибольшее целое, = исходного числа =0.0 Наименьшее целое, = исходного числа =1.0 Ближайшее целое значение исходного числа =0.0 Перечисления в J2SE 5.0 Типобезопасные перечисления (typesafe enums) в Java представляют собой значительно более серьезный механизм, чем в С/С++, хотя внешне очень похожи:

enum MyDay { MORNING, NIGHT, DAY, EVENING } В качестве простейшего примера можно рассмотреть следующий код.

/* пример # 10 : применение перечисления :

DemoEnum.java */ public class DemoEnum { enum MyDay { MORNING, NIGHT, DAY, EVENING } public static void main(String args[]) { MyDay day = MyDay.NIGHT;

System.out.print("Мое время: ");

switch (day) { case NIGHT : System.out.print(day);

} } }

Результатом выполнения будет:

Мое время: NIGHT Перечисления – это к тому же классы, которые могут содержать поля и методы, реализовывать интерфейсы. Каждый тип enum содержит статический метод values(), который возвращает массив, содержащий все элементы перечисления в порядке их объявления.

Часть 1. Глава 2.

Типы данных. Операторы. Массивы 39

–  –  –

9. Построить матрицу, вычитая из элементов каждой строки матрицы ее среднее арифметическое.

10. Найти максимальный элемент(ы) в матрице и удалить из матрицы строку(и) и столбец(цы), в которой он (они) находится.

11. Уплотнить матрицу, удаляя из нее строки и столбцы, заполненные нулями.

12. В матрице найти минимальный элемент и переместить его на место заданного элемента путем перестановки строк и столбцов.

13. Преобразовать строки матрицы таким образом, чтобы элементы, равные нулю, располагались после всех остальных.

Тестовые задания к главе 2 Вопрос 2.1.

Какие из следующих строк скомпилируются без ошибки?

1) float f = 7.0;

2) char c = "z";

3) byte b = 255;

4) boolean n = null;

5) int i = 32565;

6) int j = ’ъ’.

Вопрос 2.2.

Какие варианты записи оператора условного перехода корректны?

1) if (ij) { System.out.print("-1-"); }

2) if (ij) then System.out.print("-2-");

3) if ij { System.out.print("-3-"); }

4) if [ij] System.out.print("-4-");

5) if (ij) System.out.print("-5-");

6) if {ij} then System.out.print("-6-");.

Вопрос 2.3.

Какие из следующих слов являются ключевыми или резервированными словами в Java?

1) if;

2) then;

3) goto;

4) extend;

5) case.

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

Вопрос 2.4.

Какие из следующих идентификаторов являются корректными?

1) 2int;

2) int_#;

3) _int;

4) _2_;

5) $int;

6) #int.

Вопрос 2.5.

Какое из выражений выведет -1.0?

1) System.out.print(Math.floor(-1.51));

2) System.out.print(Math.round(-1.51));

3) System.out.print(Math.ceil(-1.51));

4) System.out.print(Math.min(-1.51));

5) System.out.print(Math.max(-1.51)).

Вопрос 2.6.

Дан код:

public class Quest6 { public static void main(String[] args){ int a[] = new int[]{1,2,3};

System.out.print(a[1]); } }

В результате компиляции и запуска будет выведено:

1) 1;

2) 2;

3) ошибка компиляции: неправильная инициализация;

4) ошибка компиляции: не определен размер массива;

5) ошибка времени выполнения.

Вопрос 2.7.

Какие из приведенных объявлений массивов корректны?

int a1[] = {};

int a2[] = new int[]{1,2,3};

int a3[] = new int[](1,2,3);

int a4[] = new int[3];

int a5[] = new int[3]{1,2,3};

Часть 1. Глава 2.

Типы данных. Операторы. Массивы 43

–  –  –

Глава 3

КЛАССЫ

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

Классом называется описание совокупности объектов с общими атрибутами, методами, отношениями и семантикой.

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

При проектировании системы необходимо не только идентифицировать сущности, но и указать, как они соотносятся друг с другом.

Отношением называется связь между классами. В объектно-ориентированном проектировании особое значение имеют четыре типа отношений: зависимости, обобщения, ассоциации и реализации.

Зависимостью (Dependency) называется отношение использования, определяющее, что изменение состояния объекта одного класса может повлиять на объект другого класса, который его использует, причем обратное в общем случае неверно. Зависимости применяются тогда, когда экземпляр одного класса использует экземпляр другого, например в качестве параметра метода.

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

Часть 1. Глава 3.

Классы 45 Например, понятия CashPayment, CreditPayment, CheckPayment очень похожи одно на другое, и в этом случае разумно организовать их в иерархию обобщения – специализации классов. Класс Payment представляет более общее понятие, а его подклассы – специализированные свойства.

–  –  –

Подкласс создается в случаях, если:

• он имеет дополнительные атрибуты, интересующие разработчика;

• он имеет дополнительные ассоциации, интересующие разработчика;

• ему соответствует понятие, управляемое, обрабатываемое, реагирующее или используемое способом, отличным от способа, определенного суперклассом или другими подклассами;

• он представляет объекту поведение, которое отлично от поведения, определяемого суперклассом или другими подклассами.

Реализацией (Realization) называется отношение между классификаторами (классами, интерфейсами), при котором один из них описывает контракт (интерфейс сущности), а другой гарантирует его выполнение.

Ассоциации (Association) показывают, что объекты одного класса связаны с объектами другого класса и отражают некоторое отношение между ними. В этом случае можно перемещаться (с помощью вызова методов) от объектов одного класса к объектам другого. Агрегация – ассоциация, моделирующая взаимосвязь “часть/целое” между классами, которые в тоже время могут быть равноправными. Оба класса при этом находятся на одном концептуальном уровне, и ни один не является более важным, чем другой.

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

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

Переменные класса и константы

Данные – члены класса, которые называются полями или переменными класса, объявляются в классе следующим образом:

cпецификатор тип имя;

В языке Java могут использоваться переменные класса, объявленные один раз для всего класса со спецификатором static и одинаковые для всех экземпляров класса, или переменные экземпляра, создаваемые для каждого экземпляра класса. Переменные объявляются со спецификаторами доступа public, private, protected или по умолчанию без спецификатора. Кроме данных – членов класса в классе используются локальные переменные и параметры методов. Переменные со спецификатором final являются константами. Спецификатор final можно использовать для переменной, объявленной в методе, а также для параметра метода.

Объявить и проинициализировать значения переменных класса и локальных переменных метода, а также параметры метода можно следующим образом:

/* пример # 1 : типы атрибутов и переменных :

MyClass.java */ class MyClass { int x; // переменная экземпляра класса int y = 2; // переменная экземпляра класса final int YEAR = 2003; // константа static int bonus; // переменная класса static int b = 1; // переменная класса void init(int z){// параметр метода z = 3;// переинициализация int a;// локальная переменная метода a = 4;// инициализация } } В приведенном примере использованы данные базовых типов, не являющиеся ссылками на объекты.

Данные могут быть ссылками, назначить которым реальные объекты можно с помощью оператора new.

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

Из-за наличия пакетов Java должна уметь работать с четырьмя категориями видимости между элементами классов:

Часть 1. Глава 3.

Классы 47

• классы и подклассы в том же пакете (по умолчанию);

• независимые классы (private);

• подклассы в текущем и других пакетах (protected);

• классы, которые не являются подклассами и не входят в тот же пакет (public).

Элемент (атрибут или метод), объявленный public, доступен из любого места вне класса. Все, что объявлено private, доступно только внутри класса и нигде больше. Если у элемента вообще не указан модификатор уровня доступа, то такой элемент будет виден из подклассов и классов того же пакета. Именно такой уровень доступа используется по умолчанию. Если же необходимо, чтобы элемент был доступен из другого пакета, но только подклассам того класса, которому он принадлежит, нужно объявить такой элемент со спецификатором protected.

Конструкторы Конструктор это метод, который автоматически вызывается при создании объекта класса и выполняет действия по инициализации объекта.

Конструктор имеет то же имя, что и класс; вызывается не по имени, а только вместе с ключевым словом new при создании экземпляра класса.

Конструктор не возвращает значение, но может иметь параметры и быть перегружаемым.

Деструкторы в языке Java не используются, объекты уничтожаются сборщиком мусора после прекращения их использования. Аналогом деструкторов являются методы finalize(). Исполняющая среда языка Java будет вызывать их каждый раз, когда сборщик мусора будет уничтожать объекты этого класса, которым не соответствует ни одна ссылка.

/* пример # 2 : перегрузка конструктора :

NewBook.java */ class NewBook { private String title, publisher;

private float price;

public NewBook() { title = “NoTitle”;

} public NewBook(String t, String pub, float p) { title = new String(t);

publisher = pub;

price = p;

} }

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

Объект класса NewBook может быть создан двумя способами, вызывающими один из конструкторов:

NewBook tips1; // объявление tips1 = new NewBook();// инициализация NewBook tips2 = new NewBook("Java2", "Ноутон", 9.f);

Оператор new вызывает конструктор, поэтому в круглых скобках могут стоять аргументы, передаваемые конструктору.

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

В следующем примере объявлен класс Locate c двумя полями (атрибутами), конструктором и методами для инициализации и извлечения значений атрибутов.

/* пример # 3 : вычисление расстояния между точками :

Distance.java */ class Locate { private double x, y; /*по умолчанию x=0 и y=0 */ public Locate(){ x = 1;

y = 1;

} public void setX(double a){ x = a;

} void setY(double b){ /*видимость по умолчанию*/ y = b;

} public double getX(){ return x;

} public double getY(){ return y;

} } public class Distance { public static void main(String[] args) { //локальные переменные не являются членами класса Locate t1 = new Locate();

Locate t2 = new Locate();

Часть 1. Глава 3.

Классы 49 double dx, dy, distance;

t1.setX(5);

t1.setY(10);

t2.setX(2);

t2.setY(6);

dx = t1.getX() - t2.getX();

dy = t1.getY() - t2.getY();

/* вычисление расстояния */ distance = Math.sqrt(dx*dx + dy*dy);

//distance = Math.hypot(dx, dy);//java 5.0 System.out.print("расстояние равно: " + distance);

} }

В результате будет выведено:

расстояние равно: 5.0 Здесь используется статические методы sqrt() (или hypot()) из класса Math, которые вызываются без объявления объекта указанного класса. Класс Math содержит только статические методы для физических и технических расчетов, а также константы E и PI.

Методы Все функции Java объявляются только внутри классов и называются методами.

Определение метода имеет вид:

возвращаемый_тип methodName(список_аргументов){ //код return value;//если нужен } Если метод не возвращает значение, ключевое слово return может отсутствовать, тип возвращаемого значения в этом случае будет void.

Вместо пустого списка аргументов тип void не указывается. Вызов методов осуществляется из объекта или класса (для статических методов):

object_name.methodName(список_аргументов);

Отметим, что методы-конструкторы вызываются автоматически при создании объекта класса с помощью оператора new. Автоматически вызывается метод main() при загрузке приложения, содержащего класс с методом main(). На протяжении жизненного цикла апплетов автоматичеJAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО ски запускаются методы init(), start(), stop(), paint(), destroy().

Для того чтобы создать метод, нужно внутри объявления класса написать объявление метода и затем реализовать его тело. Объявление метода, как минимум, должно содержать тип возвращаемого значения (возможен void) и имя метода. В приведенном ниже объявлении метода элементы, заключенные в квадратные скобки, являются необязательными.

[доступ][static][abstract][final][native][synchronized] возвращаемый_тип methodName(список _аргументов) [throws список_исключений] Как и для атрибутов, спецификатор доступа к методам может быть public, private, protected и friendly (по умолчанию). При этом методы суперкласса можно перегружать или переопределять в подклассе.

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

// пример # 4 : статический метод : MyStatic.java class MyStatic { private static int x = 1;

public static int getX(){ return x;

} }

Вызов статического метода возможен с помощью указания:

имя_класса.имя_метода, например:

int y = MyStatic.getX();

Можно вызывать такие методы, например из класса Math, без объявления объекта:

float z = Math.max(x, y);

double rd = Math.random(); // случайное значение Статический метод можно вызывать также с использованием имени объекта, но такой вызов не будет логически корректным, хотя и не приведет к ошибке компиляции.

Переопределение статических методов класса не имеет практического смысла, так как обращение к статическому атрибуту или методу осущестЧасть 1. Глава 3. Классы 51 вляется по большей части посредством задания имени класса, которому они принадлежат.

Модификатор final

Модификатор final используется для определения констант. Методы, объявленные как final, нельзя замещать в подклассах. Например:

/* пример # 5 : final-поля и методы : B.java */ class A { final int T = -273;

public final void method() { System.out.println("final метод");

T = 0;//ошибка!

} } class B extends A { public void method(){ // ошибка!

} } Константа может быть объявлена как поле класса, но не проинициализирована. В этом случае она должна быть проинициализирована в логическом блоке или конструкторе. Значение по умолчанию константа получить не может в отличие от атрибутов с прочими модификаторами. Константы могут объявляться в методах как локальные или как параметры метода. В обоих случаях значения таких констант изменять нельзя.

/* пример # 6 : инициализация final-полей и их использование : DemoFinalFields.java */ public class DemoFinalFields { final int NUM; //неинициализированная константа public DemoFinalFields() { //инициализация в конструкторе NUM = 10; //только один раз!!!

} //или инициализация в логическом блоке //{ NUM = 10; } static int initFinal() { //объявление и использование final int N = 1;

return N + 1;

} static char finalParam(final char c) { //c = '\u0256'; нельзя изменять значение константы

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

return (char) (c + initFinal());

} public static void main(String[] args) { char ch = '\u0041'; // ch = 'A';

System.out.println("- " + finalParam(ch)); // - C DemoFinalFields df = new DemoFinalFields();

System.out.println(df.NUM + 5); // 15 } } Абстрактные методы Абстрактные методы размещаются в абстрактных классах или интерфейсах, тела у таких методов отсутствуют и должны быть реализованы в подклассах.

/* пример # 7 : абстрактный класс и метод :

AbstractClass.java */ public abstract class AbstractClass{ public abstract void abstractMethod();

} Абстрактный класс может содержать и абстрактные, и неабстрактные методы, может и не содержать ни одного абстрактного метода.

Модификатор native Приложение на языке Java может вызывать методы, написанные на языке С++. Такие методы объявляются с ключевым словом native, которое сообщает компилятору, что метод реализован в другом месте.

Например:

public native int outFunction(int num);

Методы, помеченные native, можно переопределять обычными методами в подклассах.

Модификатор synchronized При использовании нескольких потоков необходимо синхронизировать методы, обращающиеся к общим данным. Когда интерпретатор обнаруживает synchronized, он включает код, блокирующий доступ к данным при запуске потока и снимающий блок при его завершении. Вызов методов notify(), notifyAll(), wait() класса Object (суперкласса для всех классов языка Java) предполагает использование модификатора synchronized, так как эти методы предназначены для работы с потоками.

Часть 1. Глава 3.

Классы 53 Передача объектов в методы Объекты в методы передаются по ссылке, поэтому если в методе изменить значение поля объекта, то это изменение коснется исходного объекта.

/* пример # 8 : передача по ссылке : DemoRef.java */ class Point implements Cloneable{ private int x = 1;

public int getX() { return x;

} public void setX(int value) { x = value;

} } public class DemoRef { private static void meth(Point p) { p.setX(10);

} public static void main(String[] args) { Point point = new Point();

System.out.println(“x = ” + point.getX());

meth(point);

System.out.println(“x = ” + point.getX());

} }

В результате будет выведено:

x=1 x = 10 Вызов одних методов класса из других методов этого же класса возможен без имени объекта или класса. Кроме того, в методе meth() ссылка p указывает на тот же самый объект, что и ссылка point в методе main().

Чтобы избежать подобных ситуаций, следует создавать в методе локальную копию объекта в виде:

Point pCopy = (Point)p.clone();

Для этого необходимо реализовать пустой интерфейс Cloneable, а также переопределить в классе Point метод clone():

public Object clone() throws CloneNotSupportedException { return super.clone();

}

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

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

{ /* код */ } Логические блоки чаще всего используются в качестве инициализаторов полей, но могут содержать вызовы методов как текущего класса, так и не принадлежащих ему. При создании объекта класса они вызываются последовательно, в порядке размещения, вместе с инициализацией полей как простая последовательность операторов, и только после выполнения последнего блока будет вызван конструктор класса. Операции с полями класса внутри логического блока до явного объявления этого поля возможны только при использовании ссылки this, которая, как и в С++, представляет собой ссылку на текущий объект.

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

/* пример # 9 : использование логических блоков при объявлении класса : DemoLogic.java */ public class DemoLogic { { System.out.println("логический блок(1) x=" + this.x);

} private int x = 1;

public DemoLogic() { System.out.println("конструктор");

} int getX(){ return x;

} { x = 2;

System.out.println("логический блок(2) x=" + x);

} public static void main(String[] args) { DemoLogic obj = new DemoLogic();

System.out.println("значение х=" Часть 1. Глава 3.

Классы 55 + obj.getX());

} }

В результате выполнения этой программы будет выведено:

логический блок(1) x=0 логический блок(2) x=2 конструктор значение х=2 В первой строке вывода поле x получит значение по умолчанию, так как память для него выделена при создании объекта, а значение еще не проинициализировано. Во второй строке выводится значение x равное 2, так как после инициализации атрибута класса был вызван логический блок, изменивший его значение.

Классы-шаблоны в J2SE 5.0 С помощью шаблонов можно создавать родовые (generic) классы и методы, что позволяет использовать более строгую типизацию, например при работе с коллекциями. Применение классов-шаблонов для создания типизированных коллекций будет рассмотрено в главе 10.

Пример класса-шаблона с двумя параметрами:

class MyTempl T1, T2 { T1 value1;

T2 value2;

}

Здесь T1, Т2 – фиктивные типы, которые используются при объявлении атрибутов класса. Компилятор заменит все фиктивные типы на реальные и создаст соответствующий им объект. Объект класса MyTempl можно создать, например, следующим образом:

MyTempl Integer, Byte ob = new MyTempl Integer, Byte ();

В предложенном примере полностью приведено объявление класса CurrentType с конструкторами и методами.

/* пример # 10 : создание и использование объектов параметризованного класса : DemoTemplate.java */ class CurrentType T { T value;

CurrentType(){} CurrentType(T value){ this.value = value;

}

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

T getValue() { return this.value;

} void setValue (T value) { this.value = value;

} } public class DemoTemplate { public static void main(String [] args){ CurrentType Integer ob1;

ob1 = new CurrentType Integer ();

ob1.setValue(new Integer(7));

System.out.println(ob1.getValue());

CurrentType String ob2 = new CurrentType String ("Java");

System.out.println(ob2.getValue());

} } В классе DemoTemplate созданы два объекта: ob1 на основе типа Integer и ob2 на основе типа String при помощи различных конструкторов.

Можно ввести ограничения на используемые типы при помощи следующего объявления класса:

class MyTemplExt T extends Number { T value;

} Такая запись говорит о том, что в качестве типа Т разрешено применять только классы, являющиеся наследниками класса Number.

В качестве параметров классов запрещено применять базовые типы.

Методы-шаблоны в J2SE 5.0 Параметризованный метод определяет базовый набор операций, которые будут применяться к разным типам данных, получаемых методом в качестве параметра, и может быть записан, например, в виде:

T extends Type returnType methodName(T arg) {} T returnType methodName(T arg) {} Запись первого вида означает, что в метод можно передавать объекты, типы которых являются подклассами класса, указанного после extends.

Второй способ объявления метода никаких ограничений на передаваемый тип не ставит.

Часть 1. Глава 3.

Классы 57 /* пример # 11 : параметризованный метод :

GenericMethod.java */ class GenericMethod { public static T extends Number byte asByte(T num) { return num.byteValue();

} public static void main(String [] args) { System.out.println(asByte(new Integer(7)));

System.out.println(asByte(new Float(7.f)));

System.out.println( asByte(new Character(‘7’)));/* ошибка компиляции */ } } Объекты типа Integer и Float являются подклассами абстрактного класса Number, поэтому компиляция проходит без затруднений. Класс Character не обладает вышеуказанным свойством, и его объект не может передаваться в метод asByte(T num).

Методы с переменным числом параметров в J2SE 5.0 Возможность передачи в метод нефиксированного числа параметров позволяет отказаться от предварительного создания массива объектов для его последующей передачи в метод.

/* пример # 12 : определение количества аргументов метода : DemoVarargs.java */ class DemoVarargs { public static int getArgCount(Object...args) { for(int i = 0; i args.length; i++) System.out.println("Arg #" + i + ": " + args[i].toString());

return args.length;

} public static void main(String args[]) { System.out.println( getArgCount(7, "No", new Boolean("TruE")));

Integer [] i = {1, 2, 3, 4, 5};

System.out.println(getArgCount(i));

} } В примере приведен простейший метод с переменным числом параметров. Метод getArgCount() выводит все переданные ей аргументы

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

и возвращает их количество. При передаче параметров в метод из них автоматически создается массив. Второй вызов метода в примере позволяет передать в метод массив.

Чтобы передать массив в метод по ссылке, следует использовать следующее объявление:

void methodName(Тип2[]... args){}

Можно попытаться передать в метод два массива или массив с объектом:

/* пример # 13 : передача двух массивов :

DemoVarArgs2.java */ class DemoVarArgs2 { // static int showArg(Integer...args) { static int showArg(Object...args) { for(int i = 0; i args.length; i++) System.out.println("Arg #" + i + ": " + args[i].toString());

return args.length;

} public static void main(String args[]) { Integer i[] = {0, 3, 5, 7};

System.out.println(showArg(i, i));

System.out.println(showArg(i, 5));

} } Ошибка возникает при попытке передачи двух параметров разных типов Integer и Integer[]. Если же в объявлении метода параметр Integer изменить на Object, ссылка на который может принять и объект, и массив, то компиляция и выполнение кода пройдут без ошибок.

Методы с переменным числом аргументов могут быть перегружены:

void show(Integer...args) {} void show(String...args) {} Не существует также ограничений и на переопределение подобных методов.

Единственным ограничением является то, что параметр вида

Object...args должен быть последним в объявлении метода, например:

void methodName(Тип1 obj, Тип2... args){}

–  –  –

зовать класс в консольном приложении. Определить дополнительно методы в классе, создающем массив объектов. Задать критерий выбора данных и вывести эти данные на консоль.

1. Student: id, Фамилия, Имя, Отчество, Дата рождения, Адрес, Телефон, Факультет, Курс, Группа.

Создать массив объектов. Вывести:

a) список студентов заданного факультета;

b) списки студентов для каждого факультета и курса;

c) список студентов, родившихся после заданного года;

d) список учебной группы.

2. Customer: id, Фамилия, Имя, Отчество, Адрес, Номер кредитной карточки, Номер банковского счета.

Создать массив объектов. Вывести:

a) список покупателей в алфавитном порядке;

b) список покупателей, у которых номер кредитной карточки находится в заданном интервале.

3. Patient: id, Фамилия, Имя, Отчество, Адрес, Телефон, Номер медицинской карты, диагноз.

Создать массив объектов. Вывести:

a) список пациентов, имеющих данный диагноз;

b) список пациентов, номер медицинской карты у которых находится в заданном интервале.

4. Abiturient: id, Фамилия, Имя, Отчество, Адрес, Телефон, Оценки.

Создать массив объектов. Вывести:

a) список абитуриентов, имеющих неудовлетворительные оценки;

b) список абитуриентов, средний балл у которых выше заданного;

c) выбрать заданное число n абитуриентов, имеющих самый высокий средний балл (вывести также полный список абитуриентов, имеющих полупроходной балл).

5. Book: id, Название, Автор(ы), Издательство, Год издания, Количество страниц, Цена, Переплет.

Создать массив объектов. Вывести:

a) список книг заданного автора;

b) список книг, выпущенных заданным издательством;

c) список книг, выпущенных после заданного года.

6. House: id, Номер квартиры, Площадь, Этаж, Количество комнат, Улица, Тип здания, Срок эксплуатации.

Создать массив объектов. Вывести:

a) список квартир, имеющих заданное число комнат;

b) список квартир, имеющих заданное число комнат и расположенных на этаже, который находится в заданном промежутке;

c) список квартир, имеющих площадь, превосходящую заданную.

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

7. Phone: id, Фамилия, Имя, Отчество, Адрес, Номер кредитной карточки, Дебет, Кредит, Время городских и междугородных разговоров.

Создать массив объектов. Вывести:

a) сведения об абонентах, у которых время внутригородских разговоров превышает заданное;

b) сведения об абонентах, которые пользовались междугородной связью;

c) сведения об абонентах в алфавитном порядке.

8. Car: id, Марка, Модель, Год выпуска, Цвет, Цена, Регистрационный номер.

Создать массив объектов. Вывести:

a) список автомобилей заданной марки;

b) список автомобилей заданной модели, которые эксплуатируются больше n лет;

c) список автомобилей заданного года выпуска, цена которых больше указанной.

9. Product: id, Наименование, UPC, Производитель, Цена, Срок хранения, Количество.

Создать массив объектов. Вывести:

a) список товаров для заданного наименования;

b) список товаров для заданного наименования, цена которых не превосходит заданную;

c) список товаров, срок хранения которых больше заданного.

10. Train: Пункт назначения, Номер поезда, Время отправления, Число мест (общих, купе, плацкарт, люкс).

Создать массив объектов. Вывести:

a) список поездов, следующих до заданного пункта назначения;

b) список поездов, следующих до заданного пункта назначения и отправляющихся после заданного часа;

c) список поездов, отправляющихся до заданного пункта назначения и имеющих общие места.

11. Bus: Фамилия и инициалы водителя, Номер автобуса, Номер маршрута, Марка, Год начала эксплуатации, Пробег.

Создать массив объектов. Вывести:

a) список автобусов для заданного номера маршрута;

b) список автобусов, которые эксплуатируются больше 10 лет;

c) список автобусов, пробег у которых больше 100000 км.

12. Aeroflot: Пункт назначения, Номер рейса, Тип самолета, Время вылета, Дни недели.

Создать массив объектов. Вывести:

a) список рейсов для заданного пункта назначения;

Часть 1. Глава 3.

Классы 63

b) список рейсов для заданного дня недели;

c) список рейсов для заданного дня недели, время вылета для которых больше заданного.

–  –  –

5. Как вызвать метод класса, объявленный со спецификатором private?

6. Как создать объект класса, если он имеет единственный конструктор, объявленный со спецификатором private?

Часть 1. Глава 4.

Наследование и полиморфизм. Класс Object 65 Глава 4

НАСЛЕДОВАНИЕ И ПОЛИМОРФИЗМ.

КЛАСС Object Наследование Класс (подкласс) может наследовать переменные и методы другого класса (суперкласса), используя ключевое слово extends. Подкласс имеет доступ ко всем открытым переменным и методам (кроме private) родительского класса, как будто они находятся в подклассе. В то же время подкласс может иметь методы с тем же именем, параметрами и возвращаемым значением, что и методы суперкласса. В этом случае подкласс переопределяет методы родительского класса. Это часть механизма ООП, который называется полиморфизмом. В следующем примере переопределяемый метод show() находится в двух классах Bird и Eagle. По принципу полиморфизма вызывается метод, наиболее близкий к текущему объекту.

/* пример # 1 : наследование класса и переопределение метода : BirdSample.java */ class Bird { private String name;

private float price;

public Bird(float p, String str) { //конструктор name = str;

price = p;

} public float getPrice(){ return price;

} public String getName(){ return name;

} void show(){ System.out.println("название: " + name + ", цена: " + price);

} } class Eagle extends Bird { private boolean fly;

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

public Eagle(float p, String str, boolean f) { super(p, str); //вызов конструктора суперкласса fly = f;

} void show(){ System.out.println("название:" + getName() + ", цена: " + getPrice() + ", полет:" + fly);

} } public class BirdSample { public static void main(String[] args) { Bird b1 = new Bird(0.85F, "Гусь");

Bird b2 = new Eagle(10.55F, "Белый Орел", true);

b1.show(); // вызов show() класса Bird b2.show(); // вызов show() класса Eagle } } Объект b1 создается при помощи вызова конструктора класса Bird, и, соответственно, при вызове метода show() вызывается версия метода из класса Bird. При создании объекта b2 ссылка типа Bird инициализируется объектом типа Eagle. При таком способе инициализации ссылка на суперкласс получает доступ к методам, переопределенным в подклассе.

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

/* пример # 2 : доступ к полям с одинаковыми именами при наследовании : DemoAB.java */ class A { int x = 1, y = 2;

public A() { y = getX();

System.out.println("в классе A после вызова" + " getX() x=" + x + " y=" + y);

} public int getX(){ System.out.println("в классе A");

return x;

} } Часть 1. Глава 4.

Наследование и полиморфизм. Класс Object 67 class B extends A { int x = 3, y = 4;

public B() { System.out.println("в классе B x=" + x + " y=" + y);

} public int getX(){ System.out.println("в классе B");

return x;

} } public class DemoAB { public static void main (String[] args) { A objA = new B();

B objB = new B();

System.out.println(objA.x);

System.out.println(objB.x);

} }

В результате выполнения данного кода последовательно будет выведено:

в классе B в классе A после вызова getX() x=1 y=0 в классе B x=3 y=4 в классе B в классе A после вызова getX() x=1 y=0 в классе B x=3 y=4 x=1 x=3 В случае создания объекта objA инициализацией ссылки на класс А объектом класса В был получен доступ к полю х класса А. Во втором случае при создании объекта objB класса В был получен доступ к полю х класса В. Однако, воспользовавшись преобразованием типов вида: ((B)objA).x или ((A)objB).x, легко можно получить доступ к полю х из соответствующего класса.

Одну из сторон полиморфизма методов иллюстрирует конструктор класса А в виде:

public A() { y = getX();

}

Метод getX() содержится как в классе A, так и в классе В. При создании объекта класса В одним из способов:

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

A objA = new B();

B objB = new B();

в любом случае сначала вызывается конструктор класса А. Но так как создается объект класса В, то вызывается метод getX(), соответственно принадлежащий классу В, который в свою очередь оперирует полем х, еще не проинициализированным для класса В. В результате у получит значение х по умолчанию, т.е. нуль.

Нельзя создать подкласс для класса, объявленного со спецификатором

final:

// класс First не может быть суперклассом final class First {/*код*/} // следующий класс невозможен class Second extends First{/*код*/} Использование super и this

Ключевое слово super используется для вызова конструктора суперкласса и для доступа к члену суперкласса. Например:

super(список_параметров); /* вызов конструктора суперкласса с передачей параметров или без нее*/ super.i = n; /* обращение к атрибуту суперкласса */ super.methodName(); // вызов метода суперкласса Вторая форма super подобна ссылке this на экземпляр класса. Третья форма специфична для Java и обеспечивает вызов переопределенного метода, причем если в суперклассе этот метод не определен, то будет осуществляться поиск по цепочке наследования до тех пор, пока метод не будет найден. Каждый экземпляр класса имеет неявную ссылку this на себя, которая передается также и методам. После этого можно, например, вместо артибута price писать this.price, хотя и не обязательно.

Следующий код показывает, как, используя this, можно строить одни конструкторы на основе других.

// пример # 3 : this в конструкторе : Locate3D.java class Locate3D { private int x, y, z;

public Locate3D(int x, int y, int z) { this.x = x;

this.y = y;

this.z = z;

} public Locate3D() { this(-1, -1, -1);

} } Часть 1. Глава 4.

Наследование и полиморфизм. Класс Object 69 В этом классе второй конструктор для завершения инициализации объекта обращается к первому конструктору. Такая конструкция применяется в случае, когда в классе имеется несколько конструкторов и требуется добавить конструктор по умолчанию.

Ссылка this используется в методе для уточнения того, о каких именно переменных x и y идет речь в каждом отдельном случае, а конкретно для доступа к переменной класса из метода, если в методе есть локальная переменная с тем же именем. Инструкция this() должна быть единственной в вызывающем конструкторе и быть первой по счету выполняемой операцией.

Переопределение методов и полиморфизм Способность Java делать выбор метода, исходя из типа времени выполнения, называется динамическим полиморфизмом. Поиск метода происходит сначала в данном классе, затем в суперклассе, пока метод не будет найден или не достигнут Object – суперкласс для всех классов.

Отметим, что статические методы могут быть переопределены в подклассе, но не могут быть полиморфными, так как их вызов не затрагивает объекты.

Если два метода с одинаковыми именами и возвращаемыми значениями находятся в одном классе, то списки их параметров должны отличаться. Такие методы являются перегружаемыми (overloading). Если метод подкласса совпадает с методом суперкласса (порождающего класса), то метод подкласса переопределяет (overriding) метод суперкласса. Все методы Java являются виртуальными (ключевое слово virtual, как в C++, не используется). Переопределение методов является основой концепции динамического связывания, реализующей полиморфизм. Когда переопределенный метод вызывается через ссылку суперкласса, Java определяет, какую версию метода вызвать, основываясь на типе объекта, на который имеется ссылка. Таким образом, тип объекта определяет версию метода на этапе выполнения. В следующем примере рассматривается реализация полиморфизма на основе динамического связывания. Так как суперкласс содержит методы, переопределенные подклассами, то объект суперкласса будет вызывать методы различных подклассов, в зависимости от того, на объект какого подкласса у него имеется ссылка.

/* пример # 4 : динамическое связывание методов :

DynDispatch.java */ class A { int i, j;

public A(int a, int b) { i = a;

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

j = b;

} void show() { // вывод i и j System.out.println("i и j: " + i + " " + j);

} } class B extends A { int k;

public B(int a, int b, int c) { super(a, b);

k = c;

} void show() { /* вывод k: переопределенный метод show() из A */ super.show(); // вывод значений из A System.out.println("k: " + k);

} } class C extends B { int m;

public C(int a, int b, int c, int d) { super(a, b, c);

m = d;

} void show() { /* вывод m: переопределенный метод show() из B */ super.show(); //вывод значений из B // show();

/*нельзя!!! метод будет вызывать сам себя, что приведет к ошибке во время выполнения */ System.out.println("m: " + m);

} } public class DynDispatch { public static void main(String[] args) { A Aob;

B Bob = new B(1, 2, 3);

C Cob = new C(5, 6, 7, 8);

Aob = Bob; // установка ссылки на Bob Aob.show(); // вызов show() из B System.out.println();

Aob = Cob; // установка ссылки на Cob Aob.show(); // вызов show() из C } } Часть 1. Глава 4.

Наследование и полиморфизм. Класс Object 71

Результат:

i и j: 1 2 k: 3 iиj:56

k:7

m: 8 Следует помнить, что при вызове show() обращение super всегда происходит к ближайшему суперклассу.

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

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

При вызове перегруженных методов следует избегать ситуаций, когда компилятор будет не в состоянии выбрать тот или иной метод, как, например, в случае:

/* пример # 5 : вызов перегруженного метода :

DemoCD.java */ class ClassC {} class ClassD extends ClassC{} public class DemoCD { static void show(ClassC obj1, ClassD obj2){ System.out.println( "первый метод show(ClassC, ClassD)");

} static void show(ClassD obj1, ClassC obj2){ System.out.println( "второй метод show(ClassD, ClassC)");

} static void show(Object obj1, Object obj2){ System.out.println( "третий метод show(Object, Object)");

} public static void main(String[] args) { ClassC c = new ClassC();

ClassD d = new ClassD();

Object ob= new Object();

show(c,d);//1_первый метод

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

show(d,c);//2_второй метод show(c,c);//3_третий метод //show(d,d);// 4_ошибка компиляции show(ob, ob);//5_третий метод show(c,ob);//6_третий метод show(ob,d);//7_третий метод } } В первом, втором и пятом случаях передаваемые параметры в метод show() полностью совпадают с параметрами при объявлении метода. В третьем случае первый и второй методы не годятся для использования, так как одним из параметров этих методов является объект класса ClassD, а определение вызываемого метода идет вверх по цепочке наследования для параметров, поэтому в данном случае будет вызван метод с параметрами типа Object. Аналогичная ситуация возникает в шестом и седьмом случаях. В четвертом случае все три метода show() одинаково подходят для вызова, поэтому возникнет ошибка компиляции. Чтобы избежать неопределенности, следует использовать явное преобразование типов, например:

show(d,(ClassC)d);

show(d,(Object)d);

Каждый из вариантов вызовет в итоге соответствующий ему метод show().

В следующем примере экземпляр подкласса создается с помощью new, ссылка на него передается объекту суперкласса. При вызове из суперкласса соответственно вызывается метод подкласса.

/* пример # 6 : динамический вызов метода :

Dispatch.java */ class A { void myMethod() {/* private и protected использовать нельзя, так как метод при наследовании становится недоступным*/ System.out.println("метод класса А");

} void myMethod(int i) { System.out.println("метод класса А с аргументом");

} } class B extends A { void myMethod(int i) { System.out.println("метод класса В с аргументом");

} } public class C extends B { { Часть 1. Глава 4.

Наследование и полиморфизм. Класс Object 73 System.out.println("класс C");

} void myMethod() { System.out.println("метод класса С");

} } public class Dispatch { public static void main(String[] args) { A obj1 = new B();

obj1.myMethod();

A obj2 = new C();

obj2.myMethod();

obj2.myMethod(10);

} }

В результате будет выведено:

метод класса А класс C метод класса С метод класса В с аргументом При первом обращении вызывается метод myMethod() из класса A как унаследованный. При втором обращении вызывается метод myMethod() из класса C как переопределенный. В последнем случае вызывается метод myMethod(int i) из класса B как унаследованный.

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

В следующем примере приведение к базовому типу происходит в выражении:

Stone s1 = new White();

Stone s2 = new Black();

Базовый класс Stone предоставляет общий интерфейс для своих классов-наследников. Порожденные классы перекрывают эти определения для обеспечения уникального поведения.

// пример # 7 : полиморфизм : StoneRandom.java class Stone { public void info() {/*пустая реализация*/} }

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

class White extends Stone { public void info() { System.out.println("добавлен белый каменный шар");

} } class Black extends Stone { public void info() { System.out.println("добавлен черный каменный шар");

} } public class StoneRandom { public static Stone randStone() { switch((int)(Math.random() * 2)){ case 0: return new Black();

case 1: return new White();

default: return null;

/*if((int)(Math.random() * 2)==0) return new Black();

else return new White();как альтернативный и не очень удачный вариант. Почему? */ } } public static void main(String[] args) { Stone[] s = new Stone[15];

for(int i = 0; i s.length; i++) /* заполнение массива камнями */ s[i] = randStone();

for(int i = 0; i s.length; i++) s[i].info();// вызов полиморфного метода } } Главный класс StoneRandom содержит static метод randStone(), который возвращает ссылку на случайно выбранный объект подкласса класса Stone каждый раз, когда он вызывается. Приведение к базовому типу производится оператором return, который возвращает ссылку на Black или White. Метод main() содержит массив из ссылок Stone, заполненный вызовами randStone(). На этом этапе известно, что имеется некоторое множество ссылок на объекты базового типа и ничего больше (не больше, чем знает компилятор). Kогда происходит перемещение по этому массиву, метод info() вызывается для каждого случайным образом выбранного объекта.

Если понадобится в дальнейшем добавить систему, например класс Green, то это потребует только переопределения метода info() и добавления одной строки в код метода randStone(), что делает систему легко расширяемой.

Часть 1. Глава 4.

Наследование и полиморфизм. Класс Object 75 Статические методы и полиморфизм К статическим методам принципы полиморфизма неприменимы. При использовании ссылки для доступа к статическому члену компилятор при выборе метода или поля учитывает тип ссылки, а не тип объекта, ей присвоенного.

/* пример # 8 : поведение статического метода :

StaticDemo.java */ class StaticA { public static void show(){ System.out.println( "метод show() из StaticA");

} } class StaticB extends StaticA {} class StaticC extends StaticB { public static void show(){ System.out.println( "метод show() из StaticC");

} } public class StaticDemo { public static void main(String[] args) { StaticA s1 = new StaticC();

StaticB s2 = new StaticC();

StaticC s3 = new StaticC();

s1.show();

s2.show();

s3.show();

} }

В результате выполнения данного кода будет выведено:

метод show() из StaticA метод show() из StaticA метод show() из StaticC При таком способе инициализации объектов s1 и s2, метод show() будет вызван из суперклассов StaticA и StaticB соответственно. Для объекта s3 будет вызван собственный метод show(), что следует из способа объявления объекта. Если же спецификатор static убрать из объявления методов, то вызовы методов будут осуществляться в соответствии с принципами полиморфизма, т.е. будет вызван метод из класса StaticC.

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

Класс Object На вершине иерархии классов находится класс Object. Ссылочная переменная типа Object может обращаться к объекту любого другого класса, кроме того, переменная типа Object может указывать на любой массив, так как массивы реализуются как классы. В классе Object определен набор методов, который наследуется всеми классами. Следует отметить два метода: equals() и toString(). Метод equals() при сравнении двух объектов возвращает истину, если объекты эквивалентны, и ложь – в противном случае. Если требуется сравнивать объекты класса, созданного программистом, то этот метод необходимо переопределять в этом классе. Метод toString() возвращает строку с описанием объекта в виде:

getClass().getName() + '@' + Integer.toHexString(hashCode()) Метод вызывается автоматически, когда объект выводится методами println(), print() и некоторыми другими.

Метод hashCode() переопределен, как правило, в каждом классе Java и возвращает число, являющееся уникальным идентификатором объекта, зависящем в большинстве случаев только от значения объекта. Метод hashCode() возвращает хэш-код объекта, который вычисляется по принципу – различные по содержанию объекты одного и того же типа имеют различные хэш-коды, с другой стороны, принято соглашение “все равные по значению объекты одного типа имеют одинаковые хэш-коды”.

При создании классов также рекомендуется переопределять методы hashCode() и toString(), чтобы адаптировать их действия для создаваемого типа.

/* пример # 9 : переопределение методов equals() и toString() : Point.java */ class Point { protected byte b;

protected String str;

public Point(byte n, String s) { b = n;

str = s;

} public Point() { this((byte)0, "NoName");

} public boolean equals(Object obj) { if (obj instanceof Point) Часть 1. Глава 4.

Наследование и полиморфизм. Класс Object 77 return (this.b == ((Point) obj).b) && (str.equals(((Point) obj).str));

return false;

} public String toString() { return getClass().getName() + "@" + " name=" + str + " b=" + b;

} } class PointZ extends Point{ short s = 100;

} Метод equals() переопределяется для класса Point таким образом, чтобы убедиться в том, что полученный объект является объектом типа Point или одним из его наследников, а также сравнить содержимое полей b и str, соответственно у вызывающего и передаваемого объектов. Метод toString() переопределен таким образом, что кроме стандартной информации о пакете, в котором находится класс Point, и самого имени класса, выводит значения полей объекта, вызвавшего этот метод, вместо хэш-кода, как это делается в классе Object.

Следует обратить внимание на вызов одного конструктора из другого с передачей ему параметров, а также на преобразование значения типа int к типу byte, так как данное преобразование не выполняется по умолчанию из-за возможной потери информации.

/* пример # 10 : иллюстрация работы методов equals() и toString() : PointDemo.java */ public class PointDemo { public static void main(String[] args) { Point p1 = new Point((byte) 1, "Петров");

Point p2 = new Point((byte) 1, "Петров");

PointZ p3 = new PointZ();

Point p4 = new Point();

System.out.println(p1.equals(p2));

System.out.println(p1.equals(p3));

System.out.println(p4.equals(p3));

System.out.println(p3.equals(p4));

System.out.println(p1.toString());

} }

В результате выполнения данного кода будет выведено следующее:

true false

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

true true com.mypack.Point@ name=Петров b=1 Переопределенный таким образом метод equals() позволяет сравнивать объекты суперкласса с объектами подклассов, но только по тем полям, которые являются общими.

“Сборка мусора” Так как объекты создаются динамически с помощью операции new, то желательно знать механизм ликвидации объектов и способ освобождения памяти для более позднего перераспределения. Java автоматически выполняет освобождение памяти, занимаемой объектом, с помощью механизма “сборки мусора”. Когда никаких ссылок на объект не существует, то есть все ссылки на него вышли из области видимости программы, предполагается, что объект больше не нужен, и память, занятая объектом, может быть освобождена. “Сборка мусора” происходит нерегулярно во время выполнения программы. Форсировать “сборку мусора” невозможно, можно лишь “рекомендовать” ее выполнить вызовом метода gc(), но виртуальная машина выполнит очистку памяти тогда, когда сама посчитает это удобным.

Иногда объекту нужно выполнять некоторые действия перед освобождением памяти. Например, освободить внешние ресурсы. Для обработки таких ситуаций используется механизм finalization. Чтобы использовать finalization, необходимо определить метод finalize(). Виртуальная машина вызывает этот метод всегда, когда она собирается уничтожить объект данного класса. Внутри метода finalize() нужно определить действия, которые должны быть выполнены до уничтожения объекта. Непосредственно перед освобождением памяти для объекта вызывается метод finalize().

Метод finalize() имеет следующую сигнатуру:

protected void finalize(){ // код завершения } Ключевое слово protected запрещает доступ к finalize() кодам, определенным вне этого класса. Метод finalize() вызывается только перед самой “сборкой мусора”, а не тогда, когда объект выходит из области действия идентификаторов, то есть невозможно определить, когда finalize() будет выполнен. В принципе, этот метод может быть вообще не выполнен.

/* пример # 11 : демонстрация сборки мусора :

FinalizeDemo.java */ Часть 1. Глава 4.

Наследование и полиморфизм. Класс Object 79

–  –  –

Задания к главе 4 Вариант A Реализовать агрегирование. При создании класса агрегируемый класс объявляется как атрибут (локальная переменная, параметр метода).

1. Создать объект класса Строка, используя классы Слово, Символ.

2. Создать объект класса Абзац, используя класс Строка.

3. Создать объект класса Страница, используя класс Абзац.

4. Создать объект класса Текст, используя классы Страница, Слово.

5. Создать объект класса Абзац, используя класс Слово.

6. Создать объект класса Страница, используя класс Слово.

7. Создать объект класса Страница, используя классы Строка, Слово.

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

8. Создать объект класса Текст, используя класс Абзац.

9. Создать объект класса Автомобиль, используя класс Колесо.

10. Создать объект класса Самолет, используя класс Крыло.

11. Создать объект класса Беларусь, используя класс Область.

12. Создать объект класса Планета, используя класс Материк.

13. Создать объект класса Звездная система, используя классы Планета, Звезда, Луна.

14. Создать объект класса Компьютер, используя классы Винчестер, Дисковод, ОЗУ.

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

Ввести (если необходимо) дополнительные классы.

1. Система Факультатив. Преподаватель объявляет запись на Курс. Студент записывается на Курс, обучается и по окончании Преподаватель выставляет Оценку, которая сохраняется в Архиве. Студентов, Преподавателей и Курсов при обучении может быть несколько.

2. Система Платежи. Клиент имеет Счет в банке и Кредитную Карту (КК). Клиент может оплатить Заказ, сделать платеж на другой Счет, заблокировать КК и аннулировать Счет. Администратор может заблокировать КК за превышение кредита.

3. Система Больница. Пациенту назначается лечащий Врач.

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

4. Система Вступительные экзамены. Абитуриент регистрируется на Факультет, сдает Экзамены. Преподаватель выставляет Оценку. Система подсчитывает средний балл и определяет Абитуриентов, зачисленных в учебное заведение.

5. Система Библиотека. Читатель оформляет Заказ на Книгу.

Система осуществляет поиск в Каталоге. Библиотекарь выдает Читателю Книгу на абонемент или в читальный зал. При невозвращении Книги Читателем он может быть занесен Администратором в “черный список”.

6. Система Конструкторское бюро. Заказчик представляет Техническое Задание (ТЗ) на проектирование многоэтажного ДоЧасть 1. Глава 4. Наследование и полиморфизм. Класс Object 81 ма. Конструктор регистрирует ТЗ, определяет стоимость проектирования и строительства, выставляет Заказчику Счет за проектирование и создает Бригаду Конструкторов для выполнения Проекта.

7. Система Телефонная станция. Абонент оплачивает Счет за разговоры и Услуги, может попросить Администратора сменить номер и отказаться от услуг. Администратор изменяет номер, Услуги и временно отключает Абонента за неуплату.

8. Система Автобаза. Диспетчер распределяет заявки на Рейсы между Водителями и назначает для этого Автомобиль. Водитель может сделать заявку на ремонт. Диспетчер может отстранить Водителя от работы. Водитель делает отметку о выполнении Рейса и состоянии Автомобиля.

9. Система Интернет-магазин. Администратор добавляет информацию о Товаре. Клиент делает и оплачивает Заказ на Товары. Администратор регистрирует Продажу и может занести неплательщиков в “черный список”.

10. Система Железнодорожная касса. Пассажир делает Заявку на станцию назначения, время и дату поездки. Система регистрирует Заявку и осуществляет поиск подходящего Поезда.

Пассажир делает выбор Поезда и получает Счет на оплату.

Администратор вводит номера Поездов, промежуточные и конечные станции, цены.

11. Система Городской транспорт. На Маршрут назначаются Автобус, Троллейбус или Трамвай. Транспортные средства должны двигаться с определенным для каждого Маршрута интервалом. При поломке на Маршрут должен выходить резервный транспорт или увеличиваться интервал движения.

12. Система Аэрофлот. Администратор формирует летную Бригаду (пилоты, штурман, радист, стюардессы) на Рейс. Каждый Рейс выполняется Самолетом с определенной вместимостью и дальностью полета. Рейс может быть отменен из-за погодных условий в Аэропорту отлета или назначения. Аэропорт назначения может быть изменен в полете из-за технических неисправностей, о которых сообщил командир.

Вариант С Реализовать агрегирование для приведенных ниже классов с созданием методов соответствующих специфике классов.

1. Fraction ComplexFraction.

2. Complex ComplexPolynom.

3. Fraction FractionArray.

4. Fraction FractionPolynom.

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

5. Complex ComplexArray.

6. Complex ComplexFraction.

7. Polynom ComplexPolynom.

8. Polynom FractionPolynom.

Тестовые задания к главе 4 Вопрос 4.1.

Дан код:

class Base {} class A extends Base {} public class Quest{ public static void main(String[] args){ Base b = new Base();

A ob = (A) b;

}}

Результатом компиляции и запуска будет:

1) компиляция и выполнение без ошибок;

2) ошибка во время компиляции;

3) ошибка во время выполнения.

Вопрос 4.2.

Классы A и Quest2 находятся в одном файле. Что необходимо изменить в объявлении класса Quest2, чтобы оно было корректным?

public class A{} class Quest2 extends A, Object {}

1) необходимо убрать спецификатор public перед A;

2) необходимо добавить спецификатор public к Quest2;

3) убрать после extends один из классов;

4) класс Object нельзя указывать явно.

Вопрос 4.3.

Дан код:

class A {A(int i) {}} // 1 class B extends A {} // 2 Какие из следующих утверждений верны? (выберите 2)

1) компилятор пытается создать по умолчанию конструктор для класса А;

2) компилятор пытается создать по умолчанию конструктор для класса В;

3) ошибка во время компиляции в строке 1;

4) ошибка во время компиляции в строке 2.

Часть 1. Глава 4.

Наследование и полиморфизм. Класс Object 83 Вопрос 4.4.

Дан код, находящийся в файле Quest.java:

public class Base{ Base(){ int i = 1;

System.out.print(i);

}} public class Quest4 extends Base{ static int i;

public static void main(String [] args){ Quest4 ob = new Quest4();

System.out.print(i);

}}

В результате компиляции и запуска будет выведено:

1) ошибка компиляции;

2) 0;

3) 10;

4) 1;

5) ошибка выполнения.

Вопрос 4.5.

Что будет результатом компиляции и выполнения следующего кода?

class Q { private void show(int i){ System.out.println("1");

}} class Quest5 extends Q{ public void show(int i){ System.out.println("2");

} public static void main(String[] args){ Q ob = new Quest5();

int i = ‘1’; //1 ob.show(i);

}}

1) ошибка компиляции: метод show() недоступен;

2) ошибка времени выполнения: метод show() недоступен;

3) ошибка компиляции: несовпадение типов в строке 1;

4) 2;

5) 1.

Вопрос 4.6.

Что будет результатом компиляции и выполнения следующего кода?

class Q {

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

void mQ(int i) { System.out.print("mQ" + i);

}} class Quest6 extends Q { public void mQ(int i) { System.out.print("mQuest" + i);

} public void mP(int i) { System.out.println("mP" + i);

} public static void main(String args[]) { Q ob = new Quest6(); //1 ob.mQ(1); //2 ob.mP(1); //3 }}

1) mQ1 mP1;

2) mQuest1 mP1;

3) ошибка компиляции в строке //1;

4) ошибка компиляции в строке //2;

5) ошибка компиляции в строке //3.

Вопрос 4.7.

Как следует вызвать конструктор класса A, чтобы в результате выполнения кода была выведена на консоль строка в “ Конструктор A ”.

class A{ A(int i){ System.out.print("Конструктор A"); } } public class Quest extends A{ public static void main(String[] args){ Quest s= new Quest();

//1 } public Quest(){ //2 } public void show() { //3 }}

1) вместо //1 написать A(1);

2) вместо //1 написать super(1);

3) вместо //2 написать super(1);

4) вместо //2 написать A(1);

5) вместо //3 написать super(1).

Часть 1. Глава 5.

Абстрактные классы и методы. Интерфейсы... 85 Глава 5

АБСТРАКТНЫЕ КЛАССЫ И МЕТОДЫ.

ИНТЕРФЕЙСЫ. ПАКЕТЫ

Абстрактные классы Абстрактные классы объявляются с ключевым словом abstract и содержат объявления абстрактных методов, которые не реализованы в этих классах, а будут реализованы в подклассах. Объекты таких классов создать нельзя, но можно создать объекты подклассов, которые реализуют эти методы. Абстрактные классы могут содержать и полностью реализованные методы.

/* пример # 1 : абстрактные методы и классы:

AbstractDemo.java */ abstract class Square { abstract int squareIt(int i); //абстрактный метод public void show() { System.out.println("обычный метод");

} } //squareIt() должен быть реализован подклассом Square class SquareReal extends Square { public int squareIt(int i) { return i*i;

} } public class AbstractDemo { public static void main(String[] args) { // Square ob1 = new Square(); нельзя создать объект!

Square ob2 = new SquareReal();

System.out.println("10 в квадрате равно " + ob2.squareIt(10));

ob2.show();

} }

В результате будет получено:

10 в квадрате равно 100

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

обычный метод Ссылка на абстрактный суперкласс ob2 инициализируется объектом подкласса, в котором реализованы все абстрактные методы суперкласса.

Реализованные методы суперкласса вызываются с помощью этой ссылки.

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

Интерфейсы Интерфейсы представляют полностью абстрактные классы: ни один из объявленных методов не может быть реализован внутри интерфейса.

Все объявленные методы автоматически трактуются как public и abstract, а все атрибуты – как public, static и final. Класс может реализовывать любое число интерфейсов, указываемых после ключевого слова implements, дополняющего определение класса. На множестве интерфейсов также определена иерархия по наследованию, но она не имеет отношения к иерархии классов. В языке Java интерфейсы обеспечивают большую часть той функциональности, которая в C++ представляется с помощью механизма множественного наследования. Класс может наследовать один суперкласс и реализовывать произвольное число интерфейсов.

Определение интерфейса имеет вид:

[public] interface имя [extends I1,I2,…,IN] {/*реализация интерфейса*/}

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

[доступ] class имя_класса implements I1,I2,…,IN {/*код класса*/} Здесь I1,I2, …,IN перечень используемых интерфейсов. Класс, который реализует интерфейс, должен предоставить полную реализацию всех методов, объявленных в интерфейсе. Кроме этого, данный класс может объявлять свои собственные методы. Если класс расширяет интерфейс, но полностью не реализует его методы, то этот класс должен быть объявлен как abstract.

/* пример # 2 : интерфейс и его реализации :

InterfacesDemo.java */ interface Shape { double PI = Math.PI;

double getSquare(); //объявление методов void showParameters();

} class Rectangle implements Shape { /* реализация интерфейса */ Часть 1. Глава 5.

Абстрактные классы и методы. Интерфейсы... 87 double a, b;

Rectangle(double a, double b) { this.a = a;

this.b = b;

} public double getSquare() { return a * b;

} public void showParameters() { System.out.println("стороны: a=" + a + " b=" + b);

} } class Circle implements Shape { double r;

Circle(double r) { this.r = r;

} public double getSquare() { return 2 * PI * r * r;

} public void showParameters() { System.out.println("радиус: r=" + r);

} } /* метод getSquare() в следующем абстрактном классе не реализован */ abstract class Triangle implements Shape { double a, b, angle;

Triangle(double a, double b, double angle) { this.a = a;

this.b = b;

this.angle = angle;

} public void showParameters() { System.out.println("стороны: a=" + a + " b=" + b);

System.out.println( "угол между ними angle=" + angle);

} } public class InterfacesDemo {

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

public static void main(String[] args) { Rectangle r = new Rectangle(5, 9.95);

Circle c = new Circle(7.01);

printFeatures(r);

printFeatures(c);

} public static void printFeatures(Shape f) {

System.out.println("площадь:"

+ f.getSquare() + " \n параметры фигуры - ");

f.showParameters();

} } Класс InterfacesDemo содержит метод printFeatures(), который вызывает методы объекта, передаваемого ему в качестве параметра.

Вначале ему передается объект, соответствующий прямоугольнику, затем кругу (объекты с и r). Каким образом метод printFeatures() может обрабатывать объекты двух различных классов? Все дело в типе передаваемого этому методу аргумента – класса, реализующего интерфейс Shape. Вызывать, однако, можно только те методы, которые были объявлены в интерфейсе.

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

/* пример # 3 : динамический вызов методов :

TestCall.java */ interface Call{ int NUM = 10; // по умолчанию final } interface Callback extends Call{ void callB(); /* abstract по умолчанию */ //int i; // ошибка, если нет инициализации //void method(){} /* ошибка, так как абстрактный метод не может иметь тела! */ } class Client implements Callback { public void callB() {

System.out.println("callB() из класса Client:"

+ " NUM = "+ NUM);

} } Часть 1. Глава 5.

Абстрактные классы и методы. Интерфейсы... 89 class XClient implements Callback { public void callB() { System.out.print("callВ() из класса XClient: ");

System.out.println("NUM в квадрате = " + (NUM*NUM));

} } public class TestCall{ public static void main(String[] args) { Callback c = new Client();/*ссылка на интерфейсный тип */ Client cl = new Client();

XClient ob = new XClient();

c.callB();

c = ob; // присваивается ссылка на другой объект c.callB();

//cl = ob;//ошибка! разные ветви наследования } }

Результат:

сallB() из класса Client: NUM = 10 callB() из класса XClient: NUM в квадрате = 100 Невозможно приравнивать ссылки на классы, находящиеся в разных ветвях наследования. По этой же причине ошибку вызовет попытка объявления объекта в виде:

Client cl = new XClient();

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

Например:

package com;

При этом программный файл будет помещен в подкаталог с названием com. Внутри указанной области можно выделить подобласти:

package com.mypack;

Действие оператора package аналогично действию объявления директории на имена файлов. При использовании классов перед именем класса через точку надо добавлять имя пакета, к которому относится данJAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО ный класс.

Общую форма исходного файла, содержащего код Java, может быть следующая:

одиночный оператор package (необязателен);

любое количество операторов import (необязательны);

одиночный открытый (public) класс (необязателен) любое количество классов пакета (необязательны) Каждый класс добавляется в пакет при компиляции. Для добавления класса в какой-то пакет этот пакет указывается после слова package. Например:

// пример # 4 : простейший пакет : Items.java package com.mypack;

public class Items { private String name;

public double price;

int count;

public Items(String n, double p, int c) { name = n;

price = p;

count = c;

} public void show() { if(count == 0) System.out.print(name + "-- в продаже отсутствует ");

else System.out.println(name + ": $" + price + " количество: " + count);

} } Файл начинается с объявления того, что данный класс принадлежит пакету com.mypack. Другими словами, это означает, что файл Items.java находится в каталоге mypack, который, в свою очередь, находится в каталоге com. Нельзя переименовывать пакет, не переименовав каталог, в котором хранятся его классы. Чтобы получить доступ к классу из другого пакета, перед именем такого класса указывается имя пакета: com.mypack.Items. Чтобы избежать таких длинных имен, используется ключевое слово import. Например:

import com.mypack.Items;

или import com.mypack.*;

Во втором варианте импортируется весь пакет.

Доступ к классу из другого пакета можно осуществить следующим образом:

Часть 1. Глава 5.

Абстрактные классы и методы. Интерфейсы... 91 // пример # 5 : доступ к пакету : ViewItems.java package first;

import com.mypack.Items;

public class ViewItems { public static void main(String[] args) { Items current[] = new Items[3];

current[0] = new Items ("Хлеб", 500.07, 100);

current[1] = new Items ("Молоко", 650.1, 0);

current[2] = new Items ("Кефир", 670.0, 25);

for(int i = 0; i 3; i++) current[i].show();

} } Если пакет не существует, то его необходимо создать до первой компиляции, если пакет не указан, класс добавляется в пакет без имени (unnamed). При этом каталог unnamed не создается.

Статический импорт в J2SE 5.0 Константы и статические методы класса можно использовать без указания принадлежности к классу, если применить статический импорт, как это показано в следующем примере.

// пример # 6 : статический импорт : ImportDemo.java import static java.lang.Math.*;

public class ImportDemo { public static void main(String[] args) { double radius = 3;

System.out.println(2 * PI * radius);

System.out.println(floor(cos(PI)));

} } Если необходимо получить доступ только к одной константе класса, например Math.E, или интерфейса, то статический импорт производится в следующем виде:

import static java.lang.Math.E;

Задания к главе 5 Вариант A

Реализовать абстрактные классы или интерфейсы, а также наследование и полиморфизм для следующих классов:

1. Абстрактный класс Книга (Шифр, Автор, Название, Год, Издательство). Подклассы Справочник и Энциклопедия.

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

2. interface Abiturient abstract class Student class Student Of Faculty.

3. interface Сотрудник class Инженер class Руководитель.

4. interface Учебное Заведение class Колледж class Университет.

5. interface Здание abstract class Общественное Здание class Театр.

6. interface Mobile abstract class Siemens Mobile class Model.

7. interface Корабль abstract class Военный Корабль class Авианосец.

8. interface Врач class Хирург class Нейрохирург.

9. interface Корабль class Грузовой Корабль class Танкер.

10. interface Диск abstract class Директория class Файл.

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

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

В следующих заданиях требуется создать суперкласс (абстрактный класс, интерфейс) и определить общие методы для данного класса. Создать подклассы, в которых добавить специфические свойства и методы.

Часть методов переопределить. Создать массив объектов суперкласса и заполнить объектами подклассов. Объекты подклассов идентифицировать конструктором по имени или идентификационному номеру. Использовать объекты подклассов для моделирования реальных ситуаций и объектов.

1. Создать суперкласс Транспортное средство и подклассы Автомобиль, Велосипед, Повозка. Подсчитать время и стоимость перевозки пассажиров и грузов каждым транспортным средством.

2. Создать суперкласс Грузоперевозчик и подклассы Самолет, Поезд, Автомобиль. Определить время и стоимость перевозки для указанных городов и расстояний.

Часть 1. Глава 5.

Абстрактные классы и методы. Интерфейсы... 93

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

4. Создать суперкласс Учащийся и подклассы Школьник и Студент. Создать массив объектов суперкласса и заполнить этот массив объектами. Показать отдельно студентов и школьников.

5. Создать суперкласс Музыкальный инструмент и классы Ударный, Струнный, Духовой. Создать массив объектов Оркестр. Выдать состав оркестра.

6. Определить суперкласс Множество и подкласс Кольцо (операции сложения и умножения, обе коммутативные и ассоциативные, связанные законом дистрибутивности). Ввести кольца целых чисел многочленов, систему классов целых чисел, сравнимых по модулю. Кольцо является полем, если в нем определена операция деления, кроме деления на ноль.

7. Создать абстрактный класс Работник фирмы и подклассы Менеджер, Аналитик, Программист, Тестировщик, Дизайнер.

8. Создать суперкласс Домашнее животное и подклассы Собака, Кошка, Попугай. С помощью конструктора установить имя каждого животного и его характеристики.

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

Тестовые задания к главе 5 Вопрос 5.1.

Какие из фрагментов кода скомпилируются без ошибки?

1) import java.util.*;

package First;

class My{/* тело класса*/} 2) package mypack;

import java.util.*;

public class First{/* тело класса*/} 3) /*комментарий */ package first;

import java.util.*;

class First{/* тело класса*/}

JAVA 2. ПРАКТИЧЕСКОЕ РУКОВОДСТВО

Вопрос 5.2.

Дан код:

abstract class QuestBase { static int i;

abstract void show();

} public class Quest2 extends QuestBase { public static void main(String[] args){ boolean[] a = new boolean[3];

for(i = 0; i a.length; i++) System.out.print(“ ” + a[i]);

}}

В результате при компиляции и запуске будет выведено:

1) false false false;

2) ошибка компиляции: массив a использован прежде, чем проинициализирован;

3) ошибка компиляции: Quest2 должен быть объявлен как

abstract;



Pages:   || 2 | 3 | 4 | 5 |
Похожие работы:

«Московский государственный университет имени М.В. Ломоносова Факультет вычислительной математики и кибернетики Кафедра математических методов прогнозирования Чабаненко Владислав Дмитриевич Модификации метода стохастического градиентного спуска для задач машинного обучения с большими объемами данных...»

«Информационные процессы, Том 15, № 2, 2015, стр. 269–277 2015 Кобер, Карнаухов. c МАТЕМАТИЧЕСКИЕ МОДЕЛИ, ВЫЧИСЛИТЕЛЬНЫЕ МЕТОДЫ Восстановление мультиспектральных изображений, искаженных пространственно-неоднородным...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ РОССИЙСКОЙ ФЕДЕРАЦИИ СОГЛАСОВАНО: УТВЕРЖДАЮ: Первый Заместитель Министра Заместитель Министра Российской Федерации по связи образования Российской Федерации и информатизации _ В.Д. Шадриков _ Ю.А. Павленко 10 032000 г. 23_...»

«Вычислительно-эффективный метод поиска нечетких дубликатов в коллекции изображений © Пименов В.Ю. Санкт-Петербургский Государственный университет, факультет Прикладной математики процессов...»

«Федеральное государственное образовательное бюджетное учреждение высшего профессионального образования «Поволжский государственный университет телекоммуникаций и информатики» «УТВЕРЖДАЮ» Декан факультета _ наименование факуль...»

«ГОСУДАРСТВЕННЫЙ КОМИТЕТ СВЯЗИ, ИНФОРМАТИЗАЦИИ И ТЕЛЕКОММУНИКАЦИОННЫХ ТЕХНОЛОГИЙ РЕСПУБЛИКИ УЗБЕКИСТАН ТАШКЕНТСКИЙ УНИВЕРСИТЕТ ИНФОРМАЦИОННЫХ ТЕХНОЛОГИЙ Кафедра Информационная безопасность Допустить к защите зав. кафедрой «ИБ»...»

«Сметанин Ю.Г.1, Ульянов М.В.2 Вычислительный центр им. А.А. Дородницына, Российская академия наук, г. Москва, д.ф.-м.н., главный научный сотрудник, smetanin.iury2011@yandex.ru Институт проблем управления им. В.А. Тр...»

«Министерство образования Республики Беларусь Учреждение образования «Белорусский государственный университет информатики и радиоэлектроники»МОДЕЛИРОВАНИЕ, КОМПЬЮТЕРНОЕ ПРОЕКТИРОВАНИЕ И ТЕХНОЛОГИЯ ПРОИЗВОДСТВА ЭЛЕКТРОННЫХ СРЕДСТВ Сб...»

«Труды ИСА РАН 2005. Т. 14 Использование workow-методологии для описания процесса распределенных вычислений И. В. Лазарев, О. В. Сухорослов В работе рассматривается вопрос использования workow-методологии для описания и реализации распределенных вычислительных процессов, в рамках которых происходит координированн...»

«Министерство образования Республики Беларусь Учреждение образования «Белорусский государственный университет информатики и радиоэлектроники» Кафедра информатики О.И. Костюкова ИССЛЕДОВАН...»

«Московский Государственный Университет им. М.В. Ломоносова Факультет Вычислительной Математики и Кибернетики Кафедра Математических Методов Прогнозирования Метод статистической верификации регрессионных моделей, основанный на перестановочных тестах. Дипломная работа выполнил Дзыба...»

«Российская академия сельскохозяйственных наук ГОСУДАРСТВЕННОЕ НАУЧНОЕ УЧРЕЖДЕНИЕ ВСЕРОССИЙСКИЙ ИНСТИТУТ АГРАРНЫХ ПРОБЛЕМ И ИНФОРМАТИКИ ИМЕНИ А.А. НИКОНОВА (ГНУ ВИАПИ РОССЕЛЬХОЗАКАДЕМИИ) УДК № госрегистрации Инв. № УТВЕРЖДАЮ Директор ВИАПИ...»

«ДИФФЕРЕНЦИРОВАННЫЙ ЗАЧЕТ ПО ДИСЦИПЛИНЕ ЕН.02. ИНФОРМАТИКА 31.02.01. Лечебное дело (углубленная подготовка) ФОРМА ПРОВЕДЕНИЯ ПРОМЕЖУТОЧНОЙ АТТЕСТАЦИИ I. Изучение дисциплины ЕН.02.Инфор...»

«Программа внеурочной деятельности по информатике и ИКТ «Путешествие в Компьютерную Долину» А.Г. Паутова Целью программы внеурочной деятельности по информатике и ИКТ «Путешествие в Компьютерную Долину» является информационная поддержка проектн...»

«МИНИСТЕРСТВО ОБЩЕГО И ПРОФЕССИОНАЛЬНОГО ОБРАЗОВАНИЯ РОСТОВСКОЙ ОБЛАСТИ ГОСУДАРСТВЕННОЕ БЮДЖЕТНОЕ ПРОФЕССИОНАЛЬНОЕ ОБРАЗОВАТЕЛЬНОЕ УЧРЕЖДЕНИЕ РОСТОВСКОЙ ОБЛАСТИ «РОСТОВСКИЙ-НА-ДОНУ КОЛЛЕДЖ СВЯЗИ И ИНФОРМАТИКИ» Методика расч...»

«М.М.Гавриков,А.Н.Иванченко, Д.В.Гринченков ТеореТические основы разрабоТки и реализации языков программирования Под редакцией проф. А.Н. Иванченко Допущено Министерством образования Российской Фе...»

«Федеральное государственное образовательное бюджетное учреждение высшего профессионального образования «Поволжский государственный университет телекоммуникаций и информатики» «УТВЕРЖДАЮ» Декан факультета _ФИСТ наименование факультета Салмин А.А._ подпись...»

«П. А. Колчин (аспирант), А. В. Суслов (к. филос. н., доцент) СИНЕРГЕТИЧЕСКИЙ ПОДХОД К ПРОБЛЕМАМ СОЦИАЛЬНОЙ ИНФОРМАТИКИ Москва, АБиК Минфина РФ, РГУИТП Важной чертой современной постнеклассической науки является усиление роли междисциплинарных исследований на основе системного подхода. Это связано, прежде всего, с тем,...»

«ГОСУДАРСТВЕННЫЙ НАУЧНЫЙ ЦЕНТР РОССИЙСКОЙ ФЕДЕРАЦИИ ИНСТИТУТ ФИЗИКИ ВЫСОКИХ ЭНЕРГИЙ ИФВЭ 201224 ОУК В.П. Воеводин Эволюция понятия и показателей надёжности вычислительных систем Протвино 2012 УДК 004.41 М-2...»

«Министерство образования и науки Российской Федерации Федеральное агентство по образованию Нижегородский государственный университет им. Н.И. Лобачевского В.Е. АЛЕКСЕЕВ, В.А. ТАЛАНОВ ГРАФЫ. МОДЕЛИ ВЫЧИСЛЕНИЙ. СТРУКТУРЫ ДАННЫХ Учебник Рекомендовано Научно-метод...»

«ЗАДАНИЯ ЗАКЛЮЧИТЕЛЬНОГО ЭТАПА ИНФОРМАТИКА Информатика 9 класс Время выполнения заданий: 180 минут Максимальное количество баллов – 100 Задание 1 (20 баллов). ПТИЦЫ Имя входного файла: стандартный ввод Имя выходного файла: стандартный вывод Ограничение по време...»

«Инновационные образовательные технологии в современной школе. «Нет ничего сильнее идеи, время которой пришло». А. Горячев..Можно смело сказать, что пришло время технологии деятельностного метода как средства реализац...»

«TNC 620 Руководствопользователя Программированиециклов Программноеобеспечение NC 817600-01 817601-01 817605-01 Русский (ru) 8/2014 Основные положения Основные положения О данном руководстве О данном руководстве Ниже приведен список символов-указаний, используемых в данном руководстве Этот символ указывает на то, что...»

«Министерство образования Республики Беларусь Учреждение образования БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ _ Кафедра антенн и устройств СВЧ О.А. ЮРЦЕВ Антенны бегущей волны, антенные решетки, антенны коротких, средних и длинных волн МЕТОДИЧЕСКОЕ ПОСО...»

«77-30569/259835 Система вычислительной диагностики для анализа цитологических препаратов клеток почечного эпителия в онкоцитологии # 10, октябрь 2011 авторы: Симонова К. С., Самородов А. В., Спиридонов И. Н. УДК 57.087 Введение В современной онкоцитологии при исследовании материала пункци...»

«ВВЕДЕНИЕ В MAPINFO МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РФ МОСКОВСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ГЕОДЕЗИИ И КАРТОГРАФИИ И.И. Лонский, П.Д. Кужелев, А.С. Матвеев Введение в MapInfo Москва Рецензенты: профессор кафедры прикладной информатики МИИГАиК А.П. Галеев; профессор, доктор техн...»

«Министерство образования и науки Российской Федерации Федеральное государственное автономное образовательное учреждение высшего профессионального образования «Северный (Арктический) федеральный университет имени M B. Ломоносова» СМ. Потапенко Задачи регионал...»

«Министерство образования Республики Беларусь Учреждение образования «БЕЛОРУССКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ ИНФОРМАТИКИ И РАДИОЭЛЕКТРОНИКИ» УТВЕРЖДАЮ Проректор по учебной и воспитательной работе _С.К. Дик «30» _05 2016 г. ПРОГРАММА вступительного экзамена в ма...»

«МИНИСТЕРСТВО ОБРАЗОВАНИЯ И НАУКИ РОССИЙСКОЙ ФЕДЕРАЦИИ Государственное образовательное учреждение высшего профессионального образования «Новосибирский государственный университет» (НГУ) Факультет информационных технологий УТВЕРЖДАЮ _ « _» _ 20_г. РАБОЧАЯ ПРОГРА...»





















 
2017 www.pdf.knigi-x.ru - «Бесплатная электронная библиотека - разные матриалы»

Материалы этого сайта размещены для ознакомления, все права принадлежат их авторам.
Если Вы не согласны с тем, что Ваш материал размещён на этом сайте, пожалуйста, напишите нам, мы в течении 1-2 рабочих дней удалим его.