Заглавная страница Избранные статьи Случайная статья Познавательные статьи Новые добавления Обратная связь FAQ Написать работу КАТЕГОРИИ: АрхеологияБиология Генетика География Информатика История Логика Маркетинг Математика Менеджмент Механика Педагогика Религия Социология Технологии Физика Философия Финансы Химия Экология ТОП 10 на сайте Приготовление дезинфицирующих растворов различной концентрацииТехника нижней прямой подачи мяча. Франко-прусская война (причины и последствия) Организация работы процедурного кабинета Смысловое и механическое запоминание, их место и роль в усвоении знаний Коммуникативные барьеры и пути их преодоления Обработка изделий медицинского назначения многократного применения Образцы текста публицистического стиля Четыре типа изменения баланса Задачи с ответами для Всероссийской олимпиады по праву Мы поможем в написании ваших работ! ЗНАЕТЕ ЛИ ВЫ?
Влияние общества на человека
Приготовление дезинфицирующих растворов различной концентрации Практические работы по географии для 6 класса Организация работы процедурного кабинета Изменения в неживой природе осенью Уборка процедурного кабинета Сольфеджио. Все правила по сольфеджио Балочные системы. Определение реакций опор и моментов защемления |
Міністерстві освіти і науки, молоді та спорту України↑ Стр 1 из 4Следующая ⇒ Содержание книги Поиск на нашем сайте
Міністерстві освіти і науки, молоді та спорту України Чорноморський державний університет Імені Петра Могили Факультет комп'ютерних наук Кафедра інтелектуальних інформаційних систем Методичний посібник до лабороторних робіт з курсу Об’єктно-орієнтование програмування ч.2 (Java SE 1.6)
для освітніх напрямків підготовки бакалаврів 050101- Комп'ютерні науки 050102- Комп'ютерна інженерія
Укладач: Ю.О. Нездолій
м. Миколаїв - 2010 Методическое пособие к выполнению лабораторных работ. Вступительная часть. Целью данного пособия являтся оказание помощи слушателям курса Объектно-ориентированное программирование ч.2(Java SE 1.6) в получении практических навыков в написании программ на языке программирования Java. Описание теоретических основ Общие требования к оформлению и выполнению работ. - лабораторная работа должна быть оформлена в электронном виде в полном соответствии с требованиями учебного заведения к оформлению такого вида работ. Все материалы должны находиться в директории с именем GGG_LL_VV_прізвище студента, где LL-номер лабороторной, GGG- номер группы,VV-номер варианта и заархивированы в архив LL_GGG_прізвище.rar Материалы должны содержать краткую пояснительную записку не более чем на 3 листах (размер шрифта 10) с описанием задания и его реализации если это необходимо. К пояснительной записке прилагается проект, реализованный в среде NetBeans 6.9 и выше,компилирующийся и запускающийся без ошибок, в котором реализованы все задания лабороторной работы. - возможно изменение граничных условий, по согласованию с преподавателем в целях более эффективного выполнения задания лабороторной с указанием этого в пояснительной записке.
Краткое изложение теоретических основ, необходимых для выполнения лабораторных работ. Программа, написанная на Java представляет собой набор экземпляров классов, взаимодействующих между собой. Рассмотрим на модели отношений реальных объектов(=Человек=,= Студент=, =Учащийся=,=Студент, занимающийся спортом=) некоторые элементы ООП.Ниже приведен код простого класса Человек на Java: 1. Листинг: 1.1. package javaapplication38; 1.2. import java.util.Date; 1.3. /* 1.4. це 1.5. складний 1.6. коментар 1.7. */ 1.8. 1.9. public class Human { 1.10. String fio; // це простий коментар 1.11. private int age; //это свойство =возраст= каждого экземпляра класса Human 1.12. private String adress="адреса не визначена"; //это свойство =адрес= каждого экземпляра класса Human 1.13. private Date birthday=new Date(); //это свойство =день рождения= каждого экземпляра класса Human 1.14. private String inn="11111111111"; //это свойство =идентификационный код= 1.15. 1.16. public Human() { // это конструктор по умолчанию 1.17. 1.18. 1.19. } // вот здесь он закончился 1.20. 1.21. public Human(String fio1, int age2, String adress3, Date birthday56,String inn_3) { // это еще один конструктор 1.22. this.fio = fio1; 1.23. this.age = age2; 1.24. this.adress = adress3; 1.25. this.birthday = birthday56; 1.26. this.inn=inn_3; 1.27. } 1.28. 1.29. public Human(String fio) { // и это конструктор 1.30. this.fio = fio; 1.31. } 1.32. public String getAdress() { 1.33. return adress; 1.34. } 1.35. public void setAdress(String adress) { 1.36. this.adress = adress; 1.37. } 1.38. 1.39. public static void main(String[] args) {// метод класса Human 1.40. Human hum1=new Human("Петров Іван Сергійович");// создание экземпляра класса Human 1.41. Human hum2=new Human("Іванова Оксана Володимирівна");// создание экземпляра класса Human 1.42. System.out.println(hum1); // вывод на консоль информации по экз. hum1 класса Human 1.43. System.out.println(hum2); // вывод на консоль информации по экз. hum2 класса Human 1.44. hum1.setAdress("м. Миколаїв, вул. Мархлевського 34, кв.56");// вызов метода для hum1 по замене адреса 1.45. System.out.println(hum1); // вывод информации по экз. hum1 класса Human после коррект. адреса 1.46. } 1.47. 1.48. public String toString(){ // метод класса Human 1.49. return "Це екземпляр класу Human зі слідуючими властивостями -\n" 1.50. +"Прізвище- "+this.fio+"\nАдреса - "+this.adress+ 1.51. "\nДата народження-" +this.birthday.toString()+"\n\n"; 1.52. } 1.53. public static int sum1(int var1,int var2){ 1.54. return (var1+var2); 1.55. } 1.56. }
Если этот код запустить на выполнение, то мы увидим в окне вывода следующие строки-
Це екземпляр класу Human зі слідуючими властивостями - Прізвище- Петров Іван Сергійович Адреса - адреса не визначена Дата народження-Thu Dec 23 06:17:06 EET 2010
Це екземпляр класу Human зі слідуючими властивостями - Прізвище- Іванова Оксана Володимірівна Адреса - адреса не визначена Дата народження-Thu Dec 23 06:17:06 EET 2010
Це екземпляр класу Human зі слідуючими властивостями - Прізвище- Петров Іван Сергійович Адреса - м. Миколаїв, вул. Мархлевського 34, кв.56 Дата народження-Thu Dec 23 06:17:06 EET 2010
Весь приведенный код находиться в файле Human.java. В файле может быть объявлено несколько классов, но только один из них может иметь модификатор доступа public. Название файла должно совпадать с названием этого public- класса. В этом классе вы можете увидеть метод main, в качестве параметров этого метода выступает массив данных типа String, массив называется args(строка 1.39). Данный метод имеет особое назначение в классах Java. Он не является обязательным для класса, но если мы хотим чтобы класс запускался на исполнение –этот метод обязателен и формат его объявления должен быть всегда следующим =public static void main(String[] args)=(по ключевым словам в строке объявления поговорим позже). На самом деле, когда мы выполняем в терминале команду =java Human Петров = выполняется эквивалентная ей команда =java Human.main Петров =, при этом =Петров= является параметром, который записывается в массив args(строка 1.39) и передается в метод main. Конкретно в этом случае, первый элемент массива args[0] будет равен “ Петров”(нумерация элементов массива ведется с 0-индекса). Структура класса
На выше приведенном примере класса рассмотрим основные элементы структуры класса Java. Объявление класса начинается со строки, в которой присутствует ключевое слово class и название класса. Java- регистрозависимый язык, поэтому классы с названиями Human и HuMan – это разные классы. Тело класса, все его структурные части заключены между фигурными скобками {}(строки 1.9,1.54). Обычно над объявлениями класса размещается информация о необходимых импортах и пакетах(информацию о пакетах см. ниже). В теле класса возможны следующие структурные элементы: атрибуты класса (их иногда называют полями или свойствами класса). Их полным набором будет обладать любой экземпляр данного класса. В случае Human, каждый экземпляр этого класса будет иметь следующие свойства - фамилию, возраст, адрес проживания, день рождения, идентификационный код. Пример атрибутов- строки 1.10-1.14 Свойства класса должны отражать реальные свойства объектов моделируемой системы. Объявление атрибута класса ничем не отличается от обычной переменной- первоначально указывается модификатор доступа(в случае отсутствия его явного задания уровень доступа к свойству – дефаултовый (па-кетный)). Далее указывается тип данных, которые будут хранится в переменной.Затем указывается идентификатор или другими словами имя атрибута класса. В Java идентификаторы могут содержать буквы и цифрры(подчеркивание и $ разрешены), длина не ограничена. Имена атрибутов должны отражать их связь со свойствами реальных объектов. Пример: строка 1.11 - private int age;, где private- модификатор доступа, int- тип данных, которые будут храниться в атрибуте с именем age.
конструкторы класса -это структурный элемент, отвечающий за правильность процедуры создания экземпляров класса. Обычно в конструкторах производят корректную инициализацию свойств создаваемых экземпляров. Количество конструкторов в классе не ограничено. Конструктор без параметров называют конструктором по умолчанию. Он создается автоматически, даже если не задан явно программистом, но только в случае, если в классе программист не создал ни одного конструктора. Если у нас есть хотя бы один конструктор, и есть необходимость в конструкторе без параметров, то мы должны его задать в коде самостоятельно. Особенности задания – конструктор всегда называется точно так же как сам класс. Использование при описании класса нескольких конструкторов с различными параметрами называется перегрузкой конструкторов. Пример – строка 1.21, 1.29, 1.16. При создании экземпляра класса (с использованием оператора new строка 1.40, 1.41) мы можем использовать только те конструкторы, параметры которых соответствуют, описанным в классе. Пример - я не могу,например, создать экземпляр класса Human командой = Human h123=new Human(23,45,”Сидоров”) =, т. к. у нас в описании класса нет ни одного конструктора с данной последовательностью и типом параметров – int, int, String. Инициализаторы или блоки статической инициализации – их пока не рассматриваем. Методы класса – в этой части сосредоточено поведение класса, то что каждый экземпляр класса умеет делать для других (внешний интерфейс) и то, что он делает для поддержания своей внутренней целостности и непротиворечивости(внутренний интерфейс). В рассматриваемом классе Human описаны следующие методы- getAdress() -1.32, setAdress(String adress)-1.35, main(String[] args) -1.39, toString() – 1.48 Они все относятся к внешнему интерфейсу класса т.к. имеют модификатор доступа public. Остановимься чуть подробнее на синтаксисе объявления методов. Введем понятие сигнатуры метода- это совокупность имени метода, типов и количества параметров, а так же порядка параметров в описании метода. Понятие сигнатуры важно по причине того, что в классе не могут быть два метода с одинаковой сигнатурой. Это контролирует компилятор. Пример – компилятор не разрешит создание в одном классе методов one(String str, int var1) и one(String qwe, int sde) (докажите, что сигнатуры этих методов одинаковы), но разрешит создание методов one(String str1, int var1, Date d1), one(String str1,int var1) и one(Date d1,String str1,int var1) (докажите что сигнатуры методов различны для этих 3 методов). Наличие в классе нескольких методов с одинаковыми именами называется перегрузкой методов. Отдельная группа методов – это так называемые set-еры и get-еры. Это специлизированные методы, которые предназначены для считывания (get-еры) и модификации (set-еры) атрибутов класса. При этом атрибуты класса делают скрытыми от внешних клиентов (уровень доступа private).Доступ к этим атрибутам класса предоставляется через public- методы, пример getAdress() -1.32, setAdress(String adress)-1.35 Обратите внимание на параметр в описании модифицирующего метода – в этом методе в качестве параметра передается значение, которое необходимо присвоить атрибуту adress. Порядок объявления метода следующий- модификатор доступа, тип возвращаемого значения, наименование метода и в скобках через запятую список параметров метода, с указанием типа и названия параметров. Пример: Строка 1.35 public void setAdress(String adress), где public – модификатор доступа, void – тип возвращаемого значения(void обозначает, что метод ничего не возвращает), setAdress(String adress) – название метода, в качестве параметра используется любая переменная, тип которой String.
Пакеты в Java. Классы в Java располагаются в пакетах. Полное имя класса складывается из имя_пакета_1.имя_пакета_2.имя_пакета_n.имя_класса. Для класса Human полное имя - javaapplication38.Human. Каждому пакету соответствует дирректория в файловой системе с таким же именем. Соответственно, все классы данного пакета будут расположены в дирректории с таким же именем. Пакеты могут быть вложенными друг в друга. Вложенным пакетам соответствуют вложенные дирректории. Для указания о том, что пакет принадлежит определенному пакету служит инструкция package javaapplication38;(строка 1.1) Причина по которой в Java применяются пакеты – снижение рисков возникновения конфликтов имен классов, при использовании внешних библиотек. Для того, чтобы не писать полное имя класса, каждый раз при использовании классов из другого пакета в нашем классе, существует команда import. Пример – строка 1.2 – это импорт конкретного класса Date из пакетов java.util. Конструкция import java.util.* даст пользоваться короткими именами всех классов пакета java.util. Но это не касается классов, которые находятся во вложенных пакетах, пакета java.util.
Модификаторы доступа
В Java предусмотрено 4 вида модификаторов – public, protected, default(или пакетный, при этом ключевого слова для данного уровня доступа не предусмотрено см. Строку 1.10) и последний тип – private. Наличие различных модификаторов доступа обусловлено необходимостью реализовать в языке одну из важнейших особенностей ООП- инкапсуляцию. Инкапсуляция предполагает разделение поведения и свойств(атрибутов) классов на внешние, доступные другим классам, и внутренние, о которых внешним классам ничего не известно. Цель инкапсюляции- уйти от зависимости внешнего интерфейса класса(то, что могут использовать другие классы) от реализации. Чтобы малейшее изменение в классе не влекло за собой изменение внешнего поведения класса. Соответственно, максимально открытый уровень доступности – это public, максимально защищенный уровень – это private. Public-уровень предполагает доступ к компоненту с этим модификатором из экземпляра любого класса и любого пакета. Protected - уровень предполагает доступ к компоненту с этим модификатором из экземпляров родного класса и классов-потомков, независимо от того в каком пакете они находятся. Default-уровень предполагает доступ к компоненту с этим модификатором из экземпляров любых классов, находящихся в одном пакете с этим классом. Private- уровень предполагает доступ к компоненту с этим модификатором только из этого класса. Для разных структурных элементов класса предусмотрена возможность применять только определенные уровни модификаторов доступа. Для класса- только public и default. Для свойств(атрибутов) класса – все 4 вида. Для конструкторов – все 4 вида. Для методов- все 4 вида.
Наследование.
Механизм наследования в первую очередь снижает семантическую сложность программируемой задачи и позволяет экономить время разработчиков и делает возможным безопасное многоразовое использование одного кода в разных сегментах программируемой системы или даже в разных системах. Пример из окружающей жизни- есть класс Транспорт – у любого транспортного средства есть такие свойства, как максимальная скорость, максимальная дальность перемещения, максимальная грузоподьемность и поведение обусловленое, тем, что главная задача любого транспортного средства - перемещать грузы на расстояния, от пункта отправки в пункт назначения(свойства и поведение, которые мы выделяем у объектов, рассматриваемых в модели, определяются теми задачами, которые должна помочь нам решить модель). Существуют такие виды транспорта, как Воздушный, Водный, Железнодорожный и т.д. К примеру любой представитель Водного транспота обладает всеми свойствами и поведением класса Транспорт, но кроме того расширяет его новыми свойствами и поведением – например водоизмещением, порт прописки, численность экипажа (свойства) и двигаться по курсу,оказать помощь тонущим(поведение). В свою очередь Водный транспорт может иметь наследников Морской транспорт и Речной транспорт, которые будут иметь все доступные свойства и поведение своих предков(Транспорта и Водного транспорта) + добавят, что-то присущее только объектам данного типа. В этом случае говорят, что класс Транспорт – является корневым классом данной иерархии классов, а все остальные классы наследниками этого класса. Классы, расположенные на самом нижнем уровне наследования, которые не имеют наследников, называют листовыми классами(Это Морской и Речной в нашем случае). Синтаксис наследования для классов прост - public class Student extends Human, эта строка говорит нам о том, что класс Студент наследуется от класса Человек. В Java,возможно, только одиночное наследование. Все классы в Java являются наследниками от класса Object. Поэтому, используя ключевое слово extends, необходимо помнить о том, что в этом случае всегда есть как минимум 2 класса предка - Object и класс, указанный после ключевого слова extends.
Интерфейсы.
Объявление интерфейса по синтаксису аналогично объявлению класса, с тем отличием, что вместо ключевого слова class используется слово interface. Пример, связанный с начальной моделью(интерфейс Учебный), приведен ниже: Листинг 5. 5.1 public interface Navchalny { 5.2 String var_interf_navchal="Це змінна інтерфейсу Navchalny"; 5.3 public boolean navchatys(String oblast_dialnosty, int time); 5.4 public float get_riven_maysternosty(String oblast_dialnosty); 5.5 } Обратите внимание на то, что в интерфейсах отсутствует реализация объявленных методов. В интерфейсах могут использоваться, так называемые интерфейсные переменные (строка 5.2) Главное свойство этих переменных – они всегда являются константами и статическими(хотя это не видно в объявлении). Соответственно,синтаксис обращения к ним следующий – имя_интерфейса.имя_переменной. В нашем случае- Navchalny.var_interf_navchal Интерфейсы, как и классы могут наследоваться друг от друга. Для это так же, как и для классов используется ключевое слово extends. Пример ниже: Листинг 6. 6.1 public interface Plavalnyi extends Sportyvny { 6.2 public void plavaty(int distancia); 6.3 } При этом в отличии от классов допускается множественное насследование(все интерфейсы-предки перечисляются через запятую).
Обработка иключений. В Java, обработка ошибок осуществляется путем перехвата исключительных ситуаций. Возникновение ошибки влечет за собой создание в программе объекта специального типа Throwable (это суперкласс всех исключительных ситуаций). При этом, нормальных ход потока управления прекращается и управление передается обработчику исключений. Если программист не предусмотрел перехват исключительных ситуаций, то их перехватывает обработчик по умолчанию. Он просто выводит на консоль информацию о возникшем исключении (типе и месте возникновения) и прерывет выполнение программы. Можно сделать предположение о том, что пользователи программ чувствовали бы себя, не совсем комфортно, если бы при малейшей ошибке программа прекращала свою работу. Для решения данной проблемы пишутся собственные обработчики исключительных ситуаций. Есть несколько вариантов обработки исключительной ситуации. Рассмотрим пример.
Листинг 10. 1. package javaapplication38;
2. /** 3. * · @author Nezdoliy 4. */ 5. public class Example_exception {
6. public static void main(String[] args) { 7. Example_exception.metod1(0); 8. } 9. public static void metod1(int par1){ 10. int b=5/par1; 11. } 12. } При запуске данного кода мы увидим следующее сообщение в консоли.
Exception in thread "main" java.lang.ArithmeticException: / by zero at javaapplication38.Example_exception.metod1(Example_exception.java:10) at javaapplication38.Example_exception.main(Example_exception.java:7)
Обработчик по умолчанию показал, что в программе произошла попытка деления на ноль, был создан объект типа java.lang.ArithmeticException (при этом была показана вся последовательность вызовов до строки в методе, которая непосредственно вызвала исключение). Так отрабатывает обработчик по умолчанию. Если мы хотим по своему обработать данную ошибку, то это может делаться следующим образом. Пример обработки:
Листинг 11. 1. package javaapplication38;
2. /** 3. * · @author Nezdoliy 4. */ 5. public class Example_exception {
6. public static void main(String[] args) { 7. Example_exception.metod1(0); 8. } 9. public static void metod1(int par1){ 10. try{ 11. int b=500/par1; 12. System.out.println("Переменная b = "+b); 13. } catch (ArithmeticException e) { 14. System.out.println("В связи с некорректным входным параметром произведена " + · "его замена на параметр по умолчанию"); 15. metod1(5); 16. } 17. } 18. }
Сообщение, которое мы получим на консоли, при запуске данной программы, следующее:
В связи с некорректным входным параметром произведена его замена на параметр по умолчанию Переменная b = 100
Таким образом если предполагается возникновение исключения на каком-то участке кода,это код располагается в блоке try-catch (смотри строку 10-13 Листинга 11) При возникновении исключения, создается объект типа Throwable и управление передается блоку catch или finally(в данном случае catch, по finally пример будет ниже). В блоке catch в качестве параметра указывается любой тип, суперклассом которого является класс Exception(строка 13,для этого класса суперклассом является класс Throwable) и далее код, который должен выполняться при возниконвении исключения. Если тип возникшего исключения может быть приведен к тому типу, который указан в параметре блока catch, или точно ему соответствует, то код блока catch выполняется. Если нет, то выполняется блок finally и управление передается обработчику исключений верхнего уровня. Если соответствующий обработчик не будет найден, тогда эту ситуацию перехватит обработчик по умолчанию. Существует еще две конструкции, которые используются при обработке исключительных ситуаций. Это конструкция throw и throws. Первая конструкция используется в тех случаях, когда разработчик считает необходимым принудительно вызвать исключительную ситуацию(например, когда какие-либо переменные принимают значения допустимые для данного типа данных, но ошибочных с точки зрения логики программы. Переменная, в которой хранится температура пациента (тип float), принимает значение >41,9) Вторая конструкция применяется в тех случаях, когда разработчик по каким-то причинам не считает возможным произвести перехват и обработку исключительной ситуации, и предлагает это сделать своим коллегам.
Многопоточность. Создать новый поток управления в Java возможно 2 способами. Либо сделав класс наследником от класса Thread, который реализует интерфейс Runnable, либо реализовать в классе сразу этот интерфейс. Второй способ предпочтительней в том случае, когда тот класс, который мы хотим запустить в другом потоке, уже имеет класс-предок(помимо класса Object). В обоих случаях тот код, который будет многопоточным должен быть расположен в методе run, который вляется точкой входа для каждого нового потока, создаваемого на базе этого класса. Пример с расширением классом класса Thread. Листинг 13
Приложение 1
Список, практических заданий к лабораторным работам.
|