Мова програмування Java
Java - об'єктно-орієнтована мова програмування. Її якості: безпека, надійність, інтерактивність, незалежність від архітектури, інтерпретація та висока продуктивність. Програмування мовою Java. Синтаксис та конструкції. Автоматичне керування пам'яттю.
Рубрика | Программирование, компьютеры и кибернетика |
Вид | дипломная работа |
Язык | украинский |
Дата добавления | 19.06.2010 |
Размер файла | 103,2 K |
Отправить свою хорошую работу в базу знаний просто. Используйте форму, расположенную ниже
Студенты, аспиранты, молодые ученые, использующие базу знаний в своей учебе и работе, будут вам очень благодарны.
4
Мова програмування Java
(дипломна робота)
Вступ
Створення мови Java -- це один із самих значних кроків вперед в області розробки середовищ програмування за останні 20 років. Мова HTML (Hypertext Markup Language -- мова розмітки гіпертексту) була необхідною для статичного розміщення сторінок у “Всесвітній павутині” WWW (World Wide Web). Мова Java потрібна була для якісного стрибка в створенні інтерактивних продуктів для мережі Internet.
Три ключових елементи об'єдналися в технології мови Java і виділили її з всіх існуючих мов програмування, що існують на сьогоднішній день.
Java надає для широкого використання свої апплети (applets) -- невеликі, надійні, динамічні програми, що не залежать від платформи ЕОМ, активні мережні додатки, що вбудовуються в сторінки Web. Апплети Java можуть набудовуватися і поширюватися з такою же легкістю, як будь-які документи HTML.
Java надає програмісту багатий набір класів об'єктів для чіткого абстрагування багатьох системних функцій, використовуваних при роботі з вікнами, мережею і для введення-виведення. Ключова риса цих класів полягає в тім, що вони забезпечують створення незалежних від платформ абстракцій для широкого спектра системних інтерфейсів.
1. Історія створення
Мова Java зародилася як частина проекту створення передового програмного забезпечення (ПО) для різних побутових приладів. Реалізація проекту була почата мовою С++, але незабаром виник ряд проблем. Стало очевидним, що необхідно створити платформо-незалежну мову програмування, що дозволяє створювати програми, що не приходилося б компілювати окремо для кожної архітектури і можна було б використовувати на різних процесорах під різними операційними системами. Даний проект отримав назву Oak.
Після ряду невдач зненацька ситуація для компанії різко змінилася: був анонсований броузер Mosaic - так народився World Wide Web, з якого почався бурхливий розвиток Internet. Нотон запропонував використовувати Oak у створенні Internet-додатків. Так Oak став самостійним продуктом, незабаром був написаний Oak-компілятор і Oak-браузер "WebRunner". У 1995 році компанія Sun Microsystems прийняла рішення оголосити про новий продукт, перейменувавши його в Java (єдине розумне пояснення назві - любов програмістів до кава). Коли Java виявилася в руках Internet, стало необхідним запускати Java-аплеты - невеликі програми, що завантажуються через Internet. WebRunner був перейменований у HotJava і компанія Netscape устала на підтримку Java-продуктів.
Апплети Java
Кожен апплет -- це невелика програма, завантажується динамічно по мережі -- точно так само, як картинка, звуковий файл або елемент мультиплікації. Головна особливість апплетів полягає в тому, що вони програмами, а не черговим форматом файлів для збереження малюнків або якої-небудь іншої інформації. Апплет не просто виконує одні і ті ж самі дії, а реагує на дії користувача і може динамічно змінювати своєю поведінку.
Оскільки користувачі не відразу змогли цілком освоїти найбільш революційні аспекти Java, ця мова часто порівнювалася з іншими технологіями для завантаження динамічних зображень і простої взаємодії з Web-клієнтами. Компанії, що традиційно займаються розробкою мультимедиа-технологий, наприклад, Adobe або MacroMedia, затверджували, що їхні продукти надають ті ж можливості, що і Java. Можливість виконання завдання будь-яких рівнів взаємодії з користувачем існує лише в тому випадку, коли використовувана для розробки платформа надає полнофункціональне середовище програмування.
Революційна мова програмування
Мова повинна була утілювати наступні якості: простоту і міць, безпеку, об'єктну орієнтованість, надійність, интерактивность, архітектурну незалежність, можливість інтерпретації, високу продуктивність і легкість у вивченні.
Безпека
Один із ключових принципів розробки мови Java полягав у забезпеченні захисту від несанкціонованого доступу. Програми на Java не можуть викликати глобальні функції й одержувати доступ до довільних системних ресурсів, що забезпечує в Java рівень безпеки, недоступний для інших мов. Даний рівень безпеки виконання Java-програм забезпечує віртуальна машина Java, котра вбудована в операційну систему. Об'єктна модель у Java проста і легко розширюється, у той же час, заради підвищення продуктивності прості типи даних Java не є об'єктами.
Надійність
Java обмежує вас у декількох ключових областях і в такий спосіб сприяє виявленню помилок на ранніх стадіях розробки програми. У той же час у ній відсутні багато джерел помилок, властивих іншим мовам програмування. Більшість використовуваних сьогодні програм “відмовляють” в одній із двох ситуацій: при виділенні пам'яті, або при виникненні виняткових ситуацій. У традиційних середовищах програмування при розподілі пам'яті програмісту приходиться самому стежити за усією використовуваною в програмі пам'яттю, не забуваючи звільняти її в міру того, коли вона стає лишньою. Найчастіше програмісти забувають звільняти захоплену ними пам'ять або, що ще гірше, звільняють ту пам'ять, що усе ще використовується якою-небудь частиною програми. Виняткові ситуації в традиційних середовищах програмування часто виникають у таких, наприклад, випадках, як ділення на нуль або спроба відкрити неіснуючий файл, і їх приходиться обробляти за допомогою складних конструкцій. Java фактично знімає обидві ці проблеми, використовуючи збирач сміття для звільнення незайнятої пам'яті й убудовані объектно-ориентировані засоби для обробки виняткових ситуацій.
Інтерактивність
Java створювався як засіб, що повинний задовольнити насущну потребу в створенні інтерактивних мережних програм. У Java реалізовано кілька цікавих рішень, що дозволяють писати код, що виконує одночасно масу різних функцій і не забуває при цьому стежити за тим, що і коли повинно відбутися. У мові Java для рішення проблеми синхронізації процесів застосований найбільш елегантний із усіх коли-небудь, винайдених методів, що дозволяє конструювати прекрасні інтерактивні системи. Прості в звертанні витончені підпроцеси Java дають можливість реалізації в програмі конкретної поведінки, не відволікаючись при цьому на побудову глобальної циклічної обробки подій.
Незалежність від архітектури ЕОМ
Питання про довговічність і переносимости коду важливіше воєн між ПК і Макінтошами. Творці Java наклали на мову і на середовище часу виконання кілька жорсткі вимоги, що дозволяють, один раз написавши, завжди запускати програму в будь-якому місці й у будь-який час (де існує віртуальна Java-машина - броузеры на всіх платформах, OS/2, Netware).
Інтерпретація плюс висока продуктивність
Надзвичайна здатність Java виконувати свій код на кожній з підтримуваних платформ досягається тим, що її програми транслюються в якесь проміжне представлення, називане байтом-кодом (bytecode). Байт-код, у свою чергу, може інтерпретуватися в будь-якій системі, у якій є середовище виконання Java. Більшість ранніх систем, у яких намагалися забезпечити незалежність від платформи, мало величезний недолік -- утратою продуктивності (Basic, Perl). Незважаючи на те, що в Java використовується інтерпретатор, байт-код легко переводиться безпосередньо в “рідні” машинні коди (Just In Time compilers) “на летуі”. При цьому досягається дуже висока продуктивність.
Об'єктне середовище
В Java вбудований набір ключових класів, що містять основні абстракції реального світу, з яким прийдеться мати справа вашим програмам. Основою популярності Java є вбудовані класи-абстракції, що зробили його мовою, дійсно незалежним від платформи.
Фактично, більшість архітектурних рішень, прийнятих при створенні Java, було продиктовано бажанням надати синтаксис, подібний із С и C++. У Java використовуються практично ідентичні вимоги для оголошення змінних, передачі параметрів, операторів і для керування потоком виконанням коду. У Java додані всі гарні риси C++, але виключені недоліки останнього.
Вказівники або адреси в пам'яті -- найбільш могутня і найбільш небезпечна риса C++. Причиною більшості помилок у сьогоднішньому коді є саме неправильна робота з вказівники. Наприклад, одна з типових помилок -- прорахуватися на одиницю в розмірі масиву і зіпсувати вміст комірки пам'яті, розташованої слідом за ним.
Хоча в Java дескриптори об'єктів і реалізовані у вигляді вказівників, у ній відсутні можливості працювати безпосередньо з ними. Ви не можете перетворити ціле число в вказівник, а також звернутися до довільної адреси пам'яті.
Проте на мові Java можна створювати не тільки апплети, а й консольні додатки, GUI-додатки, сервлети та JSP.
Невдовзі після появи технології сервлетів розробники стикнулися з такою проблемою: для динамічної генерації HTML-сторінок за допомогою сервлета HTML-код доводиться розміщувати в самому сервлеті. При цьому HTML-код сторінки змішується з Java-кодом (при цьому логіка роботи програми змішується із зовнішнім виглядом web-сторінки), що ускладнює роботу як програміста, так і веб-дизайнера.
Для вирішення цієї проблеми була розроблена технологія JavaServer Pages (JSP). Вона дозволяє розміщувати Java-код всередині HTML-коду web-сторінки. При першому зверненні до jsp-сторінки її код автоматично перетворюється в сервлет і компілюється. Після цього при наступних зверненнях web-сервер викликає не jsp-сторінку, а відкомпільований сервлет. При внесенні змін в jsp-сторінку web-сервер виявляє, що сторінка змінилась, і знову оновлює відповідний сервлет.
У технологіях сервлетів і JSP введене поняття контейнера (container). Servlets-контейнер - це механізм, що відповідає за виконання сервлетів. JSP-контейнер - механізм, що відповідає за перетворення jsp-сторінок у сервлети і передачу цих сервлетів Servlets-контейнеру. Оскільки сервлети і jsp-сторінки викликаються через протокол HTTP, то контейнери часто супроводжує ще один компонент - web-сервер. Сукупність web-серверу і контейнерів формує web-сервер додатків (рис. 1).
4
Технологія Servlets і JSP були об'єднані з декількома іншими Java-технологіями, і цей комплекс був названий Java 2 Enterprise Edition (J2EE). Таким чином з'явилися сервери Java-додатків від різних компаній (IBM, BEA, IONA, Borland), у тому числі від самої компанії Sun. Кожна компанія у своєму сервері додатків реалізує технології J2EE по-своєму, але всі вони відповідають специфікації Sun.
Компанія Sun раніше пропонувала безкоштовну еталонну реалізацію Java web-сервера додатків під назвою JServ. Після виходу технології J2EE весь код був переданий компанії Apache Software Foundation, а продукт змінив свою назву на Tomcat.
На даний момент Tomcat є еталонною реалізацією Java web-сервера і входить в групу проектів Apache під назвою Jakarta.
2. Основи програмування мовою Java
Мова Java - є регістрозалежною. Оскільки весь код в Java має бути розміщений всередині класу, то ім'я файла повинно співпадати з іменем файлу в якому він знаходиться. Якщо ви записали в один файл декілька класів, по після єтапу компіляції вони будуть автоматично розміщені в різних файлах.
Етапи створення програм на мові Java:
1. Набирається текст програми в будь-якому текстовому редакторі, який не вставляє додаткових символів.
2. Набрана програма зберігається у файлі, ім'я якого повинне співпадати з назвою классу (регістр букв має значення). Розширення - .java
3. Перевід програми в байт-коди за допомогою компілятора javaс
Приклад: javac HelloApp.java
Якщо в процесі компіляції виникли помилки, то компілятор повідомляє про номера рядочків, в яких вони виникли. Після усунення помилок повторно пройдіть компіляцію. В результаті успішної компіляції повинен бути створений файл з тим самим ім'ям та розширенням class.
4. Якщо додатком є апплет чи сервлет, необхідно додатково створити HTML-файл для їх запуску. Якщо це простий додаток, то можна здійснити його запуск з допомогою java-інтерпретатора. Приклад:
java HelloApp
Будьте уважні, розширення відкомпільованого класу не вказується.
5. Якщо додатком є апплет чи сервлет, то їх запуск на виконання можна здійснити двома шляхами: за допомогою програми appletviewer.exe або за допомогою java-сумісного броузера. Приклад:
Appletviewer HelloApp.html
HelloApp.html
6. Якщо програма працює неправильно, то необхідно знову пройти етапи 1-3,5.
Приклад простого додатку на мові Java.
public class Hello
{
public static void main (String args[])
{
System.out.println(“Hello world!”);
}
}
Приклад простого апплета:
import java.applet.Applet;
import java.awt.*;
public class HelloApplet extends Applet
{
public void init() {}
public void start()
{
repaint();
}
public void stop() {}
public void destroy() {}
public void paint(Graphics g)
{
g.drawString("Hello, Java world!",20, 20);
}
}
Приклад HTML-файла для запуску апплета
<html>
<Title>
My first applet
</title>
<body>
<applet code=HelloApp.class width=400 height=200
alt="You browser do not visualization JAVA!!!"
name=myApplet align=middle>
</applet>
</body>
</html>
В Java існує три типи коментарів:
1. Однорядковий коментар //....
2. Багаторядковий коментар /*.....*/
3. Коментарі документації - вони використовуються для автоматичної генерації документації написаного коду /**.....*/.
Генерація автоматичної документації здійснюється за допомогою утіліти javadoc.
3. Синтаксис та конструкції в Java
В мові Java існує вісім базових (простих) типів даних. Прості типи даних в Java не являються об'єктно-орієнтованими, вони аналогічні простим типам даних в інших мовах програмування.
Загальний синтаксис визначення змінної певного типу:
тип ім'я_змінної = значення;
Якщо не вказується значення, то змінній привласнюється значення по замовчуваню.
Тип |
Опис |
|
boolean |
Приймає значення true та false.(По замовчуванню false) |
|
byte |
8-бітне число зі знаком (-127..128) |
|
short |
16-бітне число зі знаком (-32768..32767) |
|
char |
16-бітний Unicode-символ |
|
int |
32-бітне ціле число зі знаком (-2147483648..2147483647) |
|
Long |
64-бітне ціле число зі знаком (-9223372036854775808.. 9223372036854775807) |
|
Float |
32-бітне дійсне число зі знаком 3. 4е-038.. 3. 4е+ 038 |
|
double |
64-бітне дійсне число зі знаком 1. 7е-308.. 1. 7е+ 308 |
Деякі зауваження.
Тип boolean не можна перетворити до цілого типу, як це можна зробити в С++. В інших мовах програмування даний тип реалізують як ціле число 1 або 0. В Java значення даного типу співпадають з його змістовним значенням (правда чи неправда).
В Java не існує беззнакових типів.
Найбільш рідко використовуваний в Java тип - short, оскільки він визначений як тип, в якому старший байт стоїть першим. На ЕОМ різних архітектур поряд байтів в слові може відрізнятись, наприклад, старший байт в двохбайтовому цілому числі short може зберігатися першим, а може бути й останнім. Перший випадок має місце в архітектурах
SPARC і Power PC, другий -- для мікропроцесорів Intel x86. Переносимість коду програм Java потребує, щоб цілі значення однаково були представлені на ЕОМ різних архітектур.
Особливістю типу char від інших мов програмування полягає в тому, що він займає 16 біт, і алфавітом тут є Unicode (в інших мовах ASCII). Проте це не складає великої проблеми, бо коди букв і цифр співпадають з ASCII-кодами, при цьому старший байт рівний 0.
Числа з плаваючою крапкою можуть мати чотири унікальних значення:
1. мінус-нескінченість
2. нуль
3. плюс-нескінченість
4. не-число
Наприклад, при додаванні 1 до максимального числа отримується плюс-нескінченість для обробки стану переповнення.
Приклади створення змінних:
byte b1;
byte b2 = -63;
int i = 670;
float ff = 3.14; // після числа може стояти символ f, що означає що число одинарної точності
double dd = -10.0; // після числа може стояти символ d, що означає що число подвійної точності
char ch = `r'; // значення по замовчуванню \u000
Масиви.
Загальний синтаксис визначення масива:
тип_елементів_масиву ім'я_масиву []= {значення1, значення 2,..., значенняN};
Масиви в мові Java мають деякі особливості, що відрізняють їх від інших мов програмування:
1. Визначення масиву. Існує два варіанта визначення масива
int masint[]={10,30,40};
int[] masint;
2. Резервування пам'яті для масиву та обчислення його розміру. Розмыр массиву вказувати
int myintmas[] = new int [500];
3. Запам'ятовування даних в масиві.
myintmas[0] = 4;
Пам'ятайте, нумерація елементів в масиві починається з 0.
Номера індексів мають тип int.
Початкова ініціалізація можлива лише для базових типів.
При використанні new необхідно вказувати розмір масиву.
Java чітко слідкує за індексами масива. На етапі компіляції не видається жодного повідомлення, якщо вив вийшли за межі масиву, проте при виконанні видається томилка ArrayIndexOutOfBoundException.
Двомірні та багатомірні масиви визначаються аналогічно. Приклад двохмірного масиву:
int myint [][] = {{1,2,3},{},{5,6,7,8}};
Рядки.
Рядки не відносяться до базових типів. Для роботи з рядками в Java існує декілька класів. Основними з них є: String та StringBuffer. Основна відмінність між ними полягає в тому, що перший клас в основному працює з рядковими константами, а інший - з рядками, що можна змінювати. Синтаксис визначеня рядків аналогічний до базових типів, хоча існує ще декілька способів ініціалізації рядків(різні види конструкторів).
String str1 = “Hello world!”;
String str2 = new String(“I\'am here!!!”);
String str3 =””; //пустий рядок
StringBuffer str4 = new StringBuffer(10); //довжина буфера 10
StringBuffer str5 = new StringBuffer(“Hello world!”);
Операції для роботи з рядками описані в документації на відповідні класи, проте перерахуємо деякі з них:
1. Повертає символ за його індексом.
2. Порівняння двох рядків з врахуванням регістра символів.
3. Порівняння двох рядків без врахуванням регістра символів.
4. Добавлення іншої строки в кінець.
5. Створення строки з масиву символів.
6. Пошук підрядка в рядку.
7. Пошук першого/останнього входження підрядка в рядок.
8. Отримання довжини.
9. Заміни символа(підрядка) на відповідний символ(підрядок).
10. Видалення пропусків в рядку та ін.
Оператори.
Оператори в мові Java -- це спеціальні символи, що повідомляють трансляторові про те, що ви хочете виконати операцію з деякими операндами. Деякі оператори вимагають одного операнда, їх називають унарними. Одні оператори ставляться перед операндами і називаються префіксними, інші -- після, їхній називають постфіксними операторами. В Java існує 44 убудованих оператора. Їх можна розбити на 4 класи - арифметичні, бітові, оператори порівняння і логічні.
Оператор |
Результат |
Оператор |
Результат |
|
+ |
Додавання |
+ = |
Додавання з присвоюванням |
|
- |
Віднімання |
- = |
Віднімання з присвоюванням |
|
* |
Множення |
* = |
Множення з присвоюванням |
|
/ |
Ділення |
/= |
Ділення із присвоюванням |
|
% |
Ділення по модулі |
%= |
Ділення по модулю з присвоюванням |
|
++ |
Інкремент |
-- |
Декремент |
Цілочисельні бітові оператори.
Для цілих числових типів даних -- long, int, short, char і byte, визначений додатковий набір операторів, за допомогою яких можна перевіряти і модифікувати стан окремих бітів відповідних значень.
Оператор |
Результат |
Оператор |
Результат |
|
~ |
побітове заперечення (NOT) |
|||
& |
побітове И (AND) |
&= |
побітове (AND) із присвоюванням |
|
| |
побітове АБО (OR) |
|= |
побітове (OR) із присвоюванням |
|
^ |
побітове виключаюче АБО (XOR) |
^= |
побітове що виключає АБО (XOR) із присвоюванням |
|
>> |
зсув вправо |
>> = |
зсув вправо з присвоюванням |
|
>>> |
зсув вправо з заповненням нулями |
>>>= |
зсув вправо з заповненням нулями з присвоюванням |
|
<< |
зсув вліво |
<<= |
зсув вліво з присвоюванням |
Оператори відношення
Для того, щоб можна було порівнювати два значення, у Java мається набір операторів, що описують відношення і рівність. Список таких операторів приведений у таблиці.
Оператор |
Результат |
|
= = |
дорівнює |
|
! = |
не дорівнює |
|
> |
більше |
|
< |
менше |
|
> = |
більше або дорівнює |
|
< = |
менше або дорівнює |
Значення будь-яких типів, включаючи цілі і речовинні числа, символи, логічні значення і посилання, можна порівнювати, використовуючи оператор перевірки на рівність = = і нерівність !=.
Булеві логічні оператори
Булеві логічні оператори, перелік яких приведена в таблиці нижче, оперують тільки з операндами типу boolean. Усі бінарні логічні оператори сприймають у якості операндов два значення типу boolean і повертають результат того ж типу.
Оператор |
Результат |
Оператор |
Результат |
|
& |
логічне И (AND) |
&= |
І (AND) із присвоюванням |
|
| |
логічне АБО (OR) |
= |
АБО (OR) із присвоюванням |
|
^ |
логічне що виключає АБО (XOR) |
^= |
виключає АБО (XOR) із присвоюванням |
|
|| |
оператор OR швидкої оцінки |
== |
дорівнює |
|
&& |
оператор AND швидкої оцінки |
!= |
не дорівнює |
|
! |
логічне унарне заперечення (NOT) |
Пріоритети операторів
У Java діє визначений порядок, або пріоритет, операцій. У таблиці зазначені в порядку убування пріоритети всіх операцій мови Java.
Вищий |
||||
( ) |
[ ] |
. |
||
~ |
! |
|||
* |
/ |
% |
||
+ |
- |
|||
>> |
>>> |
<< |
||
> |
>= |
< |
<= |
|
== |
!= |
|||
& |
||||
^ |
||||
| |
||||
&& |
||||
| | |
||||
?: |
||||
= |
oператор= |
|||
Нижчий |
В Java існує два вида перетворення типів:
1. Автоматичне перетворення (розширюючи перетворення).
2. Перетворення несумісних типів (звужуюче перетворення).
Автоматичне перетворення здійснюється при виконанні наступних умов:
· Два типа сумісні
· Тип призначення більший за тип операндів
Навіть якщо ми знаємо, що результат обчислення не перевищить деякого типу, потрібно враховувати проміжні значення обчислень.
Приклад
byte a = 40;
byte b = 50;
byte c = 100;
int d = a * b / c;
Як бачимо, результат не буде типу byte, хоча результат = 20. Однак при проміжних обчисленнях отримаємо a * b = 2000 що виходить за межі byte. Отже, запам'ятаймо правило автоматичного перетворення типів:
Java проводить автоматичне перетворення типів до того типу, який забезпечить задане обчислення, причому тільки в більшу сторону (якщо таке перетворення можливе).
Перетворення несумісних типів має загальну форму:
(тип призначення) значення
Приклад:
int a = 1000; //1111101000
byte b ;
b = (byte) a; //Значення b = 232 (11101000)
Відмінність між значеннями змінних полягає в тому, що Java урізає змінну а до значення типу byte. Ще один приклад:
float t = 34.234;
int a;
a = (int) t; // а = 34, дробова частина відкидається
Неможливо перетворювати лише типи boolean та char.
Управляючі конструкції.
Управляючі конструкції Java подібні до С++. До них відносяться:
1. Оператор одиночного вибору if -else
2. Оператор множинного вибору switch.
3. Потрійний оператор if-then-else.
Синтаксис оператора одиночного вибору:
if (логічний вираз) оператор1;
[ else оператор2;]
Синтаксис оператора множинного вибору:
switch ( вираз )
{ case значенння1: оператор1;break;
case значення2: оператор2;break;
case значеннняN:операторN;break;
default: операторІНАКШЕ;
}
Результатом вираз повинен бути буль-який з простих типів. Всі значення повинні бути унікальними. Нагадати про використання break.
Дія даних операторів аналогічна, як в С++.
Синтаксис потрійного оператора:
вираз1? вираз2: виразЗ;
В якості вираз1 може бути будь-який вираз, результатом якого є тип boolean. Якщо результатом є true - виконується вираз2, інакше - вираз3. Вирази 2 та 3 повинні повертати однаковий тип, типом не може бути тип void.
Цикли.
While. Цей цикл багаторазово виконується доти, поки значення логічного вираження дорівнює true. Нижче приведена загальна форма оператора while:
while ( логічний вираз )
{
тіло;
}
do-while
Іноді виникає потреба виконати тіло циклу принаймні один раз -- навіть у тому випадку, коли логічний вираз із самого початку приймає значення false. Для таких випадків у Java використовується циклічна конструкція do-while. Її загальний синтаксис:
do {
тіло;
} while ( логічний вираз );
Цикл з лічильником. Його синтаксис:
for ( ініціалізація; умова завершення; ітерація )
{
тіло;
}
Якщо початкові умови такі, що при вході в цикл умова завершення не виконується, то оператори тіла й ітерації не виконуються жодного разу. Іноді виникають ситуації, коли розділи ініціалізації або ітерації циклу for вимагають декількох операторів. Оскільки складний оператор у фігурних дужках у заголовок циклу for вставляти не можна, Java надає альтернативний шлях. Застосування коми (,) для поділу декількох операторів допускається тільки усередині круглих дужок оператора for. Нижче приведений приклад циклу for, у якому в розділах ініціалізації й ітерації виконує кілька операторів.
for (a = 1, b = 4; a < b; a++, b--)
{
System.out.println("a = " + a);
System.out.println("b = " + b); }
Оператори переходу.
В Java, як і в С++, можна використовувати оператори break ,continue та return.
break - призначений для примусового виходу з тіла операторів. Управління передається оператору, який слідує за тілом операторів.
continue - призначений для примусового переходу на наступну ітерацію циклу без виконання операторів, що слідують за ним в тілі циклу.
return - призначений для незаперечного виконання коду, і передачу управління коду, який викликав дану функцію. Даний оператор також призначений для повернення певного результату. return t;
4. Класи в мові JAVA
Мова Java являється об'єктно-орієнтованою мовою програмування. Основою ООП являються класи. Класи - це спосіб об'єднання даних і всіх методів, які необхідні для звернення та роботи з цими даними, а також для зв'язку з іншими класами.
Основні всластивості ООП:
· Інкапсуляція
· Спадкування
· Поліморфізм
Інкапсуляція - це механізм, за допомогою якого ООП надає можливість ізоляції полів та методів від зовнішніх чинників.
Спадкування - можливість створення нових класів на основі вже існуючих.
Поліморфізм - це властивість, за допомогою якої нащадки деякого класу зберігають властивості батьківського класу, що дозволяє виконувати одну і ту ж операцію з класами різних типів, якщо вони мають спільні властивості.
В загальному випадку об'явлення класу має наступний синтасис:
Модифікатори class ім'я_класу extends ім'я_суперкласу implements ім'я_інтерфейсу
{
тип змінна1_объекту;
тип змінна2_объекту;
тип зміннаN_объекту;
тип ім'я_методу1(список_параметрів)
{
тіло метода;
}
тип ім'я_методу2(список_параметрів)
{
тіло метода;
}
тип ім'я_методуМ(список_параметрів)
{
тіло метода;
}
}
При об'явленні класу можна вказувати наступні властивості класу:
· Модифікатори
· Ім'я класу
· Суперкласи
· Інтерфейси
Модифікатори визначають способи подальшого використання класу; вони важливі при успадкуванні класів, інтерфейсів та виключних ситуацій на основі даного класу. В Java існують наступні модифікатори класів:
public. Класи з таким модифікатором доступні для всіх об'єктів. Вони можуть розширюватись або використовуватись будь-яким об'єктом. Класи з модифікатором public повинні зберігатись в в файлах з таким самим ім'ям, як ім'я класу.
friendly. Встановлюється по замовчуванню, якщо не вказано модифікатора. Даний модифікатор визначає, що клас може використовуватись чи розширюватись будь-яким класом, однак він доступний тільки тим об'єктам, що знаходяться в тому ж самому пакеті.
final. Класи з таким модифікатором не можуть мати нащадків.
abstract. Абстрактним називається клас, в якому хоча б один метод не описаний повністю. (оскільки класи неповні, то неможна створювати екземпляри абстрактних класів.)
Ім'я класів мають ті ж самі обмеження, як і в С++.
· Можуть розпачинатися з (_) та ($).
· Містять тільки букви, цифри та деякі спецсимволи.
· Не можуть співпадати з зарезервованими словами.
Суперкласи. Механізм спадкування в Java реалізується з допомогою суперкласів (предків, батьків) даних класів. Новий клас буде успадковувати поля та методи суперкласу. В Java реалізована ієрархічна (деревоподібна) структура спадкування, тобто, новий клас може мати тільки однин суперклас, але суперклас може мати безліч нащадків.
Кожен клас в Java рахується об'єктом. Тому кожен клас породжується від класа java.lang.Object.
Інтерфейси. Інтерфейси - це Java-варіант спадкування від багатьох класів. Інтерфейси використовуються для опису певних функціональних можливостей, які використовуються в класах, однак не реалізовують ці можливості, оскільки не знають як вони будуть реалізовані в даних класах. Інтрерфейси можуть містити тільки абстрактні класи та поля визначені як final. (Приклад: інтерфейс Рухатись для класів Людина та Змія).
Класи мають дві основні компоненти:
· Поля
· Методи
Дані чи змінні визначені в блоці class називаються екземплярами змінних. Однак змінні описані одразу ж після об'явлення класу прийнято називати полями класу. Відмінність їх від інших змінних визначених в методах полягає в області видимості(циклом життя змінної). Поля класу видимі у будь-якій точці класу і існують доти, поки існує сам клас. Їх іноді називають глобальними змінними.
Синтаксис визначення поля:
тип ім'я_змінної;
Як і клас, поля класу мають модифікатори.
friendly. Назначається по замовчуванню. Поля з таким модифікатором доступні для інших класів в тому ж самому пакеті, але недоступні для підкласів з інших пакетів.
public. Дає доступ для всіх класів та підкласів усіх пакетів.
protected. До захищених полів можуть звертатися всі підкласи даного класу, однак вони невидимі для класів, які не відносяться до даного пакету.
private. Найбільш захищені поля. Вони доступні для всіх методів всередині даного класу, однак недоступні для будь-яких інших класів чи підкласів даного класу.
private protected. Доступні у всіх методах даного класу та підкласах даного класу, але недоступні для всіх інших.
static. Статичні поля зберігають своє значення у всіх екземплярах класу. Тому зміна статичного поля в одному з класів приведе до їх зміни в інших екземплярах. Статичні поля можуть змінювати як статичні, так і нестатичні методи.
final. Даний модифікатор визначає поле як таке, яке не можна змінювати (типу константи). Тому при об'явленні поля типу final необхідно його визначити.(final int SIZE=5). По замовчуванні імена констант пишуть великими буквами.
synchronized. Даний модифікатор використовується в багатопоточних програмах, коли до одного поля одночасно можуть звертатися багато потоків, для захисту поля від виникнення помилок. Синтаксис оператора наступний:
synchronized ( змінна) вираз;
Програмний код класу міститься в методах. Як правило, екземпляри змінних змінюються методами класу і доступ до даних змінних можна отримати лише з допомогою методів описаних в самому класі.
При об'явленні методу класу визначається:
· Модифікатор доступу до методу
· Тип, який повертається методом
· Ім'я методу
· Список формальних параметрів
Синтаксис опису методу:
модифікатор тип ім'я_метода (список формальних параметрів)
{
тіло методу;
}
Для методів існує десять модифікаторів:
1. public. Якщо метод класу об'явлений як public, то він стає доступним для всіх класів (не залежить від походження та приналежності). Не захищений.
2. protected. До таких методів можуть звертатися будь-які класи, які знаходяться в тому ж самому пакеті, що й даний клас. Не доступні для успадкування.
3. friendly. Методи з таким модифікатором доступні тільки з даного класу і будь-яких класів-потомків. По замовчуванню, якщо не вказано ідентифікатора, для функцій та полів класу приймається даний ідентифікатор.
4. private. Найвищий ступінь захисту. Private-метод доступний тільки методам цього ж класу. Навіть класи, які породжені від данного не мають доступу до циж функцій.
5. private protected. Методи, які мають такий ідентифікатор доступу доступні з поточного класу та його нащадків, але не доступні в тому ж пакеті чи в новому екземплярі
6. static. Як і для полів класу, статичні методи використовуються для економії пам'яті, і являються спільними для всіх екземплярів даного класу. Статичні методи працюють тільки зі статичними змінними.
7. abstract. Абстрактні методи лише об'являються, але не реалізуються в даному класі.
8. final. Якщо визначити так метод, то він не зможе бути перегружений в підкласах.
9. native. Такий модифікатор призначений для повідомлення компілятор, що тіло метода буде написано на іншій мові програмування (зазвичай С++). Замість тіла методу ставиться (;). Однак необхідно вказувати тип результату який повертається методом, та тип формальних параметрів.
10. synchronized. Аналогічно полям відповідного типу.
При використанні методів важливо пам'ятати, що метод повинен повертати результат, якщо він не описаний як void.
Конструктори - це спеціальні методи, які призначені для встановлення певних початкових параметрів об'єктів, а також виконання певних функцій при створенні екземпляра об'єкту. Конструкторам надається таке ж саме ім'я, як і класу. Конструктор може мати список формальних параметрів, але не може повертати результат (навіть тип void). В класі може існувати декілька конструкторів, але вони повинні мати різну сигнатуру (різна кількість і типи формальних параметрів). Тоді можна створювати екземпляри класу будь-яким з них. (В основному конструктори являються public, хоча можуть бути і private. Однак вони не можуть бути типу native, abstract, static, synchronized, final)
5. Успадкування та інтерфейси
З синтаксису опису класу ми можемо побачити, що клас поже бути нащадком(підкласом) від іншого класу(суперкласу). З допомогою успадкування можна створити базовий клас, властивості якого будуть успадковувати всі класи, які створюються на його основі. Підкласи будуть містити всі поля та методи суперкласу, а також можуть визначати додаткові поля та методи. Таким чином, підклас являється спеціалізованою версією суперкласу.
Успадкування здійснюється з допомогою ключового слова extends, після якого йде назва суперкласу. Простим прикладом успадкування може бути наш перший аплет. В ньому ми можемо зустріти такий запис:
public class HelloApplet extends Applet
{
. . .
}
Як бачимо, наш клас HelloAppet є нащадком класу Applet.
При успадкуванні необхідно враховувати модифікатори полів та методів, адже вони можуть бути недоступні для прямої модифікації в нашому класі. Прикладом може послужити наступний код:
class Boex
{
int i;
private int j;
. . .
}
Нащадок даного класу:
Public class Subboex extends Boex
{
int g;
public void func()
{
j= 10; //даний код викличе помилку, бо хоча поле й успадковується нашим класом, //але його можуть змінювати лише методи класу Boex
}
}
Бувають ситуації, коли потрібно визначити клас, в якому визначена структура якоїсь абстракції, але відсутня повна реалізація методів. В такому випадку з допомогою зарезервованого слова abstract ви можете вказати, що дані методи обов'язково повинні бути визначені в підкласах, тобто в конкретних реалізаціях нашої абстракції. Частіше всього абстрактними визначаються певні методи класу. Однак при створенні абстрактних методів необхідно клас визначати також як абстрактний. Приклад:
abstract class A
{
abstract void callme();
void callmeto()
{
System.out.println("I am CALLMETOO metod");
}
}
public class six extends A
{
public static void main(String args[])
{
six me = new six();
me.callme();
me.callmeto();
}
void callme()
{
System.out.println("Hello !!!");
}
}
Особливостями абстрактних класів є те, що неможна створювати об'єкт абстрактного класу. Тобто, неможливо написати A subA = new A(); Проте можна створити змінну типу А для використання в якості вказівника на підкласи класу А.
Ще однією особливістю абстрактних класів являється те, що в них можна може міститися скільки завгодно реалізованих методів, які можуть бути перегружені чи ні в підкласах.
Інтерфейси дещо подібні до абстрактних класів, проте в них не повинно бути жодного реалізованого методу, а також можуть бути присутні змінні, описані як static або final. Синтаксис визначення інтерфейса:
модифікатор interface ім'я_інтерфейсу extends ім'я інтерфесу
{
тип ім'я_методу1(список параметрів);
тип ім'я_методу2(список параметрів);
. . . . .
тип ім'я_методуN(список параметрів);
тип кінцева_змінна1 = значення;
тип кінцева_змінна2 = значення;
. . . . .
тип кінцева_зміннаM = значення;
}
По замовчуванню інтерфейс має модифікатор public(присутній він чи ні) Всі методи і поля інтерфейсу приймають такий самий модифікатор. В класі повинні бути описані всі методи, які визначені в інтерфейсі причому модифікатор доступу до методів повинен бути public. Якщо не визначити якийсь із методів у класі, то необхідно об'явити його абстрактним. Приклад реалізації інтерфейсу:
interface Run// Інтерфейс який описує рух
{
int MIN = 0;
int MAX = 10;
void move();
float fast();
}
abstract class People implements Run //Клас визначається як абстрактний, бо
{ //немає повної реалізації інтерфейсу Run
int age;
People(int x)
{ age = x; }
public void move()
{ System.out.println("People move vertical "+fast()+"km/god"); }
}
class NewPeople extends People //Клас, який описує рух людини
{
NewPeople(int x)
{ super(x); }
public float fast()
{ return (float) age/MAX; }
}
class Zmiya implements Run //Клас, який описує рух змії
{
float longest;
Zmiya(float x)
{ longest = x; }
public void move()
{ System.out.println("Zmiya move horizontal "+fast()+"km/god"); }
public float fast()
{ return (float) (longest*0.1)/MAX; }
}
public class Ssavtsi//Клас для демонстрації
{
public static void main(String args[])
{
int i1 = 30;
float f1 = 3.5f;
NewPeople pp = new NewPeople(i1);
Zmiya zz = new Zmiya(f1);
pp.move();
zz.move();
}
}
Інтерфейси можна розширювати - з допомогою успадкування від інших інтерфейсів. Дане успадкування здійснюється за допомогою зарезервованого слова extends.
Як бачимо, клас може бути нащадком якогось суперкласу, а також бути розширеним за допомогою деякого інтерфейсу. Така реалізація являється Java-варіантом множинного успадкування!!!
Перевизначення методів.
Методи інтерфейсів та класів визначають набір параметрів, які необхідно передавати конкретному класу при виклику. Тому, якщо якщо визначити новий метод з тим самим ім'ям, але з іншим набором параметрів,то старий метод не буде перевизначений. Це ніби створення зовсім різних методів.
Зовсім інша ситуація виникає, коли сигнатура методів співпадає. В такому випадку здійснюється перевантаження метода. Тобто, якщо ваші функції будуть викликати перевантажений метод, то виконуватись буде останнє перевантаження. Проте іноді чиникає ситуація, коли необхідно викликати попередній перевантажений метод. Для такого виклику можна скористатись зарезервованим словом super.
Звернення до полів та методів.
Звернення до полів та методів в Java здійснюється з допомогою оператора крапка(.) Для звернення необхідно вказати ім'я екземпляра класу, в якому міститься необхідне поле чи метод, поставити крапку і вказати ім'я поля(чи методу). Приклад:
. . .
pp.age = 20;
zz.move();
Іноді настає ситуація, коли всередині класу необхідно звернутися до себе самого. В таких випадках використовують змінну this. При використанні цієї змінної на її місце повертається посилання на цей же об'єкт класу. В загальному випадку існують дві ситуації, коли використовують this:
· Коли в класі присутні дві змінні з однаковим ім'ям: одна являється полем класу, а інша - це локальна змінна якогось методу
· Коли об'єкт звертаючись до якогось методу передає посилання на самого себе в якості параметра.
Приклад:
class Example
{
int x = 10;
. . . .
public void ten(int x)
{ this.x = x; }
}
Спеціальна змінна super забезпечує доступ до суперкласу. Ця можливість корисна при перевантаженні методів, коли вам необхідно використати код з старого методу. Також дана змінна корисна, коли вам необхідно перевантажити метод, але використати в ньому весь код старого методу. В таких випадках на початку перевантаженого методу звертаються до старого методу, а потім дописують необхідний код. Приклад:
class Point3D extends Point
{
int z;
Point3D(int x, int у, int z)
{
super(x, y); //Тут ми використовуємо конструктор суперкласу
this.z=z;
} . . .
6. Пакети
При написанні простих програм ми досі не використовували таке понянття, як пакети. При написанні наші класи завжди знаходились в одній директорії. При цьому також приходилось давати унікальні імена нашим класам. Пакети - це одночасно механізм управління іменами класів та механізм контролю видимості. Можна визначити всередині пакету класи, які будуть доступні тільки для класів цього пакета, а для всіх інших - невидимі.
Для створення пакету необхідно поставити першим у файлі оператор:
package ім'я_пакету;
Після компіляції всі класи, які знаходились в нашому java-файлі будуть відноситись до одного і того ж самого пакету. По замовчуванню для кожного класу встановлюється пакет по замовчуванню (каталог в якому знаходяться наші файли class). Ось чому можна використовувати класи з різними модифікаторами, які знаходяться в одному каталозі.
Для зберігання пакетів в Java використовується система імен каталогів. Тому файли class, які входять до пакету повинні зберігатися в каталозі ім'я_пакету. Оператор package може бути присутній в декількох java-файлах. Можна створювати навіть ієрархію пакетів. Для цього необхідно тільки розділити крапками вложеність пакетів. Синтаксис:
package pkg1[.pkg2[.pkg3]];
Однак при створенні пакету відтепер не можна до класу звертатися просто ім'я_класу, необхідно відтепер вказувати його ієрархію. Приклад:
package Roman.Eight; //Зміст даного файла знаходиться в $JavaHome$\Roman\Eight
public class test //у файлі test.java
{
public void showtest()
{
System.out.println("I\'am test");
}
}
package Roman.Eight; //Зміст даного файла знаходиться в $JavaHome$\Roman\Eight
public class test2 //у файлі test2.java
{
public void showtest2()
{
System.out.println("I\'am test2");
}
}
Необхідно встановити змінну classpath =$JavaHome$;
import Roman.Eight.*;//Правильне звернення до нашого пакету
public class testall //Даний файл може знаходитись де завгодно
{
public static void main(String args[])
{
test t = new test();
test2 t2 = new test2();
t.showtest();
t2.showtest2();
}
}
Навіть якщо ви будете знаходитись в тому ж самому каталозі, де розміщені байт-коди класів нашого пакету, це не буде означати, що наш клас буде в цьому ж пакеті Roman\Eight.
Для кращого розуміння процесу інкапсуляції в Java, а також області видимості приведемо таблицю доступів:
Модифікатори класів |
Private |
Friendly |
Protected |
Public |
|
Той же клас |
Так |
Так |
Так |
Так |
|
Підклас в тому ж пакеті |
Ні |
Так |
Так |
Так |
|
Не-підклас в тому ж пакеті |
Ні |
Так |
Ні |
Так |
|
Підклас в іншому пакеті |
Ні |
Ні |
Так |
Так |
|
Не-підклас в іншому пакеті |
Ні |
Ні |
Ні |
Так |
Для керування вихідним кодом в Java використовують вказання опцій при компіляції та запуску. Опишемо основні параметри.
Компілятор.
Для керування розміщенням вихідних файлів класу викгористовується параметр -d, після якого йде шлях, де необхідно розмістити відкомпільовані файли. Приклад
Javac helloapp.java -d c:\Myjava
Також важливими є опція -classpath шлях до користувацьких класів. При вказанні даної опції, вона перевизначає значення відповідної опції в операційній системі.
Java(Launcher's tool).
При запуску додатку також можна вказувати опцію -classpath або -cp. Призначення їх аналогічне, як в компіляторі.
Ще однією важливою опцією може бути -jar ім'я_архіву.jar. Дана опція призначена для запуску програми, класи та запускаючий файл якої міститься в JAR-архіві.
Файли jar - це спеціальні архіви Java. Призначення даної утіліти в Java - створення спеціальних архівів, які можуть містити класи, початковий код, малюнки, звуки та ін., що необхідно для правильної роботи класів та додатків. Дані архіви можуть бути нестисненими, або заархівованими алгоритмом ZLIB. Однак відмінністю від простих zip-архівів є те, що дані архіви являються, знову ж таки, платформонезалежними (чого немає в ZIP). Це дозволяє передавати по мережі єдиний файл для виконання його на машині клієнта, а не окремо кожен клас, коли він буде необхідний.
Подобные документы
Створення баз даних за допомогою стандартних бібліотек Java та клієнт-серверних програм. Основні стандартні класи і методи бібліотек SQL та swing, бібліотек, що дозволяють опрацьовувати дані СУБД та навчитись концепціям програмування мовою Java.
лабораторная работа [215,3 K], добавлен 04.10.2011Концепції об'єктно-орієнтованого програмування. Методи створення класів. Доступ до методів базового класу. Структура даних, функції. Розробка додатку на основі діалогових вікон, програми меню. Засоби розробки програмного забезпечення мовами Java та С++.
курсовая работа [502,5 K], добавлен 01.04.2016Розробка та тестування додатків, які базуються на елементах мови програмування Java, принципи програмування в її середовищі. Вивчення переваг Java-платформи, прикладний програмний інтерфейс та особливості сучасних засобів створення Java-додатків.
дипломная работа [2,8 M], добавлен 22.06.2011Об'єктно-орієнтована мова Python - сучасна мова програмування, проста у вивченні та використанні. Наявність повної стандартної бібліотеки. Середовища програмування на Python. Механізм функціонування інтерпретатора. Колекції даних, комбіновані оператори.
презентация [753,2 K], добавлен 06.02.2014Аналіз особливостей мови програмування Java та середовища Android Studio. Розробка програмного забезпечення для якісного та ефективного вивчення іноземних слів. Побудова базових алгоритмів і структури даних. Вибір мови програмування, реалізація програми.
курсовая работа [335,3 K], добавлен 11.01.2015Огляд об’єктно-реляційних перетворень. Схема роботи сервлету. Технології Object-relational mapping, JavaServlet, JSP та Spring framework для розробки web-проектів на мові програмування Java. Генерація текстових документів у відповідь на запит клієнта.
курсовая работа [295,9 K], добавлен 19.03.2015Прототип об'єктно-орієнтованого програмування. Управління процесом реалізації програми. Розвиток апаратних засобів. Об'єктно-орієнтовані мови програмування. Надійність і експлуатаційні якості програм. Візуальне об’єктна-орієнтовне проектування Delphi.
контрольная работа [28,9 K], добавлен 18.05.2009Особливості редагування за допомогою текстового редактора NotePad вхідного файлу. C++ як універсальна мова програмування, знайомство с функціями. Характеристика графічних засобів мови С. Аналіз основних понять об’єктно-орієнтованого програмування.
курсовая работа [123,3 K], добавлен 14.03.2013Історія розвитку мови Java, основні технології та їх застосування для роботи з SQL-серверами. Огляд багатопоточного програмування в Java. Принципи функціонування сервлетів та JSP-сторінок. Зміна розміру графічних об’єктів, робота з кольорами в Java.
курсовая работа [49,3 K], добавлен 29.03.2010Розгляд особливостей мови програмування С++: основні можливості, характеристика функцій. Аналіз файлів з вхідними даними. Використання похідних класів як ефективний засіб об’єктно-орієнтованого програмування. Способи роздруківки графічного вирішення.
курсовая работа [510,9 K], добавлен 14.03.2013