Студопедия.Орг Главная | Случайная страница | Контакты | Мы поможем в написании вашей работы!  
 

Java - мова ООП




В інформатиці та програмуванні зміни відбуваються постійно і з великою швидкістю. Одним з найбільш значних змін за останні двадцять років стала поява загальносвітової мережі Інтернет та мови програмування Java. Найважливішими властивостями цієї мови, званого навіть революційним, є наступні:
• Java є сучасним об'єктно-орієнтованою мовою;
• Java надає програмісту багатий набір класів різних об'єктів;
• Java дозволяє створювати аплети, які є невеликими, надійними, динамічними і не залежними від платформи мережевими додатками, які вбудовуються у веб-сторінки мережі Інтернет.


Вибір цієї мови в якості базового для нашого курсу обумовлений перш за все наявністю у нього таких якостей, як простота і міць, безпека, об'єктна орієнтованість, надійність, інтерактивність, архітектурна незалежність, можливість інтерпретації, висока продуктивність і легкість у вивченні. Частина з них нам знадобиться з перших же кроків, інші - трохи пізніше.

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


Об'єктно-орієнтоване програмування є технологією програмування, в основі якої лежить здатність людини узагальнювати, класифікувати і генерувати абстракції. Концепція ООП базується на таких поняттях як об'єкти та класи. У повсякденному житті об'єкти зустрічаються на кожному кроці: комп'ютери, телефони, машини, будинки, чашки і багато іншого. У програмуванні це можуть бути символи, числа, рядки, а також об'єкти, придумані і реалізовані автором програми.


Важливо те, що об'єкти - це не тільки деякі значення (дані). У них також є методи, що зв'язують дані і керують ними. Об'єкти являють собою об'єднання структур даних, що містять інформацію, та методів і функцій для управління цими даними.


Довільну об'єктно-орієнтовану мову програмування характеризують три основні властивості:

інкапсуляція, тобто суміщення даних з функціями (методами), призначеними для маніпулювання цими даними, в одному об'єкті, що супроводжується приховуванням його внутрішньої структури від зовнішнього світу; в мові Java це досягається шляхом введення механізму класів;
спадкоємство, тобто створення нових, похідних класів, на базі вже наявних, які успадковують дані і методи від раніше визначених базових класів, при цьому можливе перевизначення або додавання нових даних і методів, в результаті створюється так звана ієрархія класів;
поліморфізм, тобто наявність у різних класів методів з одним і тим же ім'ям, в результаті чого кожен з класів має можливість по-своєму виконувати пов'язані із цим методом дії.


Більш повну інформацію, пов'язану з об'єктно-орієнтованим програмуванням, можна почерпнути з уже згадуваної книги [#!morgan!#] І чудовою, хоча і складної для новачка, книги [#!badd!#].

6.2. Основні властивості програм і перші приклади


Перед тим, як перейти безпосередньо до прикладів програм, обговоримо питання про те, якими якостями повинна володіти хороша програма.
Виявляється, що таких властивостей досить багато: коректність, ефективність, зручність експлуатації, надійність, зручність супроводу, зрозумілість і ще цілий ряд інших. Трьома найголовнішими з них є коректність або правильність, ефективність і зрозумілість і модифікованості.


Так як програма на мові Java є просто записом алгоритму вирішення певної задачі, перш за все вона повинна бути правильною, тобто реалізує коректний алгоритм розв'язання вихідної задачі. Виявляється, що не так просто не тільки навчитися писати правильні програми, але навіть і просто сформулювати, що це таке. Тільки після попереднього вивчення основ теорії предикатів, ми зможемо дати точне визначення поняттю правильна програма.


Обговоренню питань ефективності програм присвячена значна частина 4, в якому дуже переконливо доводиться важливість швидких алгоритмів. Зараз же обмежимося лише одним прикладом: часи роботи швидкої і звичайною програм, упорядковують в порядку зростання мільйон чисел, відрізняються в 50000 разів!


Властивості зрозумілості та модифікованості програм пов'язані найтіснішим чином: дуже важко змінити програму, яку не розумієш. У реальному житті програміста завдання на модифікацію вже написаних кимось раніше програм зустрічаються чи не частіше, ніж завдання на розробку програм з нуля. Рішення задач на модифікацію є також і вельми ефективним способом вивчення як мови, так і методів програмування.


Навчитися писати зрозумілі і легко модифікуються програми істотно легше, ніж правильні й ефективні. Для цього достатньо лише дотримуватися кількох простих загальних правил, які ми сформулюємо в застосуванні до мови Java:


• використовуйте в програмі осмислені імена для всіх змінних, відмінних від лічильників та інших подібних величин;
• всім константам, відмінним від нуля і одиниці, надавайте імена;
• дотримуйтесь прийнятий в мові стиль написання імен (імена класів повинні починатися з великої літери, змінних і методів - з малої, констант - складатися повністю з великих літер);
• застосовуйте розумне форматування тексту програми;
• там, де це необхідно, використовуйте коментарі.


Програма на мові Java пишеться у звичайному текстовому файлі, що містить у собі визначення одного або декілька класів. Ім'я файлу зобов'язана співпадати з ім'ям основного класу, визначеного в ньому, і мати розширення java. Компілятор, що запускається зазвичай за допомогою команди javac Filename.java, при відсутності помилок компіляції породжує один або кілька вихідних файлів з іменами, що збігаються з іменами містяться у вихідному фалі класів, і розширенням class. Для запуску скомпільованій програми після цього необхідно виконати команду java Filename.


Відповідно до давно усталеною традицією розглянемо як першого завдання наступну.

Текст програми.
public class Hello {
public static void main (String [] args) {
System.out.println ("Привіт, світ!");
}
}
Наведений вище текст обов'язково повинен міститися у файлі з ім'ям Hello.java (зверніть увагу на те, що перша буква в імені є прописною, а решта - малими літерами).


Як і більшість інших мов, Java допускає довільне форматування тексту програми. Це означає, що будь-яку програму в принципі можна записати в одну довгу рядок, або, навпаки, максимально розтягнути по вертикалі, розміщуючи на кожному рядку тільки по одній лексемі - мінімальної неподільної одиниці мови.

Наведена вище програма складається з наступної ланцюжка лексем: ключові слова public, class, ідентифікатор Hello, роздільник {, ключові слова public, static і void, ідентифікатор main, роздільник (, ідентифікатор String, роздільники [і], ідентифікатор args, роздільники) і {, ідентифікатор System, роздільник., ідентифікатор out, роздільник., ідентифікатор println, роздільник (, строковий літерал "Здрастуй, світ!", роздільники),;, і двічі}. Дана програма не містить лексем тільки ще одного типу, існуючого у мові - констант, прикладом якої є, скажімо, число 5.


Людина, однак, не машина, і йому далеко не байдуже, як відформатований текст програми. Невдале форматування істотно ускладнює правильне сприйняття тексту і породжує потенційні помилки. Не обговорюючи зараз питання про те, який саме стиль форматування програм на мові Java є найбільш правильним, ми закликаємо читача слідувати тим зразкам, які він знайде в книзі, - вони пропонують завідомо не найгірший варіант.


Запам'ятайте, що в мові Java існує близько шести десятків зарезервованих ключових слів, які мають цілком певне значення і не можуть бути використані для інших цілей, окрім тих, для яких вони призначені.


Послідовне виконання двох команд javac Hello.java і java Hello має призвести до того, що на екрані з'явиться результат роботи програми - рядок Привіт, світ!.
Ми не будемо приводити детальний розбір того, який сенс окремих частин розглянутої програми, - цей коментар можна знайти в будь-якій книзі з мови Java. Замість цього ми обговоримо рішення наступної задачі, в якій будуть використані методи вже анонсованого вище класу Xterm.

Текст програми.
public class NewYear {
/ / Magic!
public static void main (String [] args) {
Xterm.clear ();
Xterm.setPosition (25,8);
Xterm.print ("З новим роком", Xterm.Red);
Xterm.print ("(навчальним)", Xterm.Blue);
Xterm.print ("!", Xterm.Red);
Xterm.setPosition (0,16);
/ *
Кінець програми
* /
}
}
У цій програмі використовуються два види коментарів з трьох, що існують у мові Java. Текст, розташований після символів / / аж до кінця рядка, і довільну кількість рядків тексту між символами / * і * /, компілятором просто ігнорується. Знайомство з третім видом коментарів, призначеним для автоматичного документування програм, відкладемо до третього розділу книги. Другий з коментарів, включених у наведену вище програму, є типовим прикладом коментаря, що погіршує код. Не включайте в свої програми непотрібні коментарі!


Деякі фрагменти цієї (і багатьох наступних) програми обговорюватиметься до початку другого розділу не будуть. Тільки тоді, після повноцінного знайомства з основними концепціями об'ктно-орієнтованого програмування на мові Java, можна буде розібратися з тим, що ж означає рядок public static void main (String [] args). Поки ми будемо просто вважати, що так треба!

Змістовна ж частина наведеної програми (тіло функції main, тобто текст, розташований між внутрішніми фігурними дужками) зараз буде детально розібрана. Рекомендується відкомпілювати і запустити цю програму для того, щоб побачити результат її роботи, - це допоможе краще зрозуміти її. При цьому слід мати на увазі, що крім файлу NewYear.java в даному випадку необхідний ще й файл Xterm.java (його вміст наведено для довідки в останній секції цього пункту на сторінці).


Об'єкт, з яким ведеться робота в програмі, - Xterm. Детально він розглядається трохи нижче (див. стор), а поки зазначимо тільки те, що він визначає термінал, який би введення чисел і виведення рядків тексту. Об'єкт Xterm містить у собі деяку інформацію або, як кажуть знаходиться в деякому стані. Стан характеризується тим текстом, який відображається у вікні терміналу, і положенням курсору, що відповідає за позицію, в якій з'явиться черговий виведений символ.


Насправді в класі Xterm немає компонент, що містять зазначену інформацію (вона зберігається зовсім в іншому об'єкті), однак таке спрощення реальної ситуації є досить зручним.


Безліч всіх станів, у яких може знаходитися об'єкт, називається простором станів. По відношенню до об'єкту можуть бути виконані деякі, заздалегідь певні дії - методи (methods), а процес виконання цих дій називають викликом методу. У результаті цих дій стан об'єкта може змінитися.


У мові Java для виклику методу необхідно спочатку вказати об'єкт, до якого застосовується той чи інший метод, а потім після крапки записати ім'я методу. Саме цей синтаксис, в якому головна роль відводиться об'єкту, над яким виробляється дія, послужив основою для назви парадигми - <<об'єктно-орієнтована>>.


Деякі з методів вимагають для свого виконання вказівки додаткових об'єктів.Такі додаткові об'єкти називають параметрами або аргументами і перераховують їх через кому в круглих дужках після імені методу. У випадку методу без параметрів дужки тим не менш обов'язкові. Завершується будь-який оператор в мові Java крапкою з комою.


Розглянута програма містить виклик трьох різних методів класу Xterm: clear, setPosition і print. Перший з них очищає вікно терміналу і не має параметрів, другий переміщає курсор у позицію, що задається параметрами методу, а третій дозволяє вивести рядок тексту. При цьому перший параметр методу print визначає виведену рядок, а другий задає колір символів.


Всі вищезазначені в даній програмі методи не повертають значень, однак це зовсім не є обов'язковим. Метод може повертати як результат своєї роботи об'єкт довільного типу за допомогою оператора return.

6.3. Арифметичні і побітові оператори мови Java


До арифметичним операторам мови Java, які визначені для всіх числових типів, відносяться: + (додавання і унарний плюс), + = (додавання з привласненням), - (віднімання і унарний мінус), -= (віднімання з привласненням), * (множення), *= (множення з привласненням), / (ділення), / = (поділ з привласненням),% (залишок від ділення або ділення по модулю),% = (залишок від ділення з привласненням), + + (інкремент) і - (декремент).

Будь-який оператор з привласненням з точки зору одержуваного результату еквівалентний виконання відповідної операції з подальшим привласненням, але працює зазвичай швидше: @ = B еквівалентно а = @ B (тут символ @ означає будь-яку з бінарних арифметичних операцій).

Результат виконання операцій ділення і ділення за модулем (знаходження залишку) для цілочисельних операндів є цілим числом. Так, наприклад, 5/3 дорівнює 1.
Нарешті, операції інкремента і декремента відповідно збільшують і зменшують свій операнд на одиницю. Вони бувають префіксним і тоді зміна їх операнда відбувається до того, як виконуються інші дії у виразі, і постфіксні, коли зміна відбувається після обчислення виразу:

int i = 2, j = 3; // i = 2, j = 3 int k = i + j++; // k = 5, j = 4 int m = --i; // i = 1, m = 1


З величинами цілих типів можна виконувати додаткові дії. До побітових (або порозрядним) операторів мови Java належать такі: ~ (доповнення), & (побітове І), і = (побітове І з привласненням), | (побітове Або), | (побітове Або з привласненням), ^ (виключає Або), ^ = (виключає Або з привласненням), <<(зсув вліво), <<= (зрушення вліво з привласненням),>> (зсув вправо),>> = (зсув вправо з привласненням),>>> (зсув вправо з розмноженням нуля) і>>> = (зсув вправо з привласненням з розмноженням нуля).


Результати операцій побітового доповнення, Або, що виключає Або і І виходять шляхом виконання над кожним з бітів операнда (операндів) дій відповідно до таблиці 6.

Таблиця 6: Бітові операції

a b ~a a|b a^b a&b
           
           
           
           

Наприклад, 4 ~ 5 дорівнює 1 (бо виконавчі подання цих чисел є відповідно 100 і 101).
В операторів зсуву другий аргумент показує кількість розрядів, на яке треба здійснити зрушення в двійковому представленні першого операнда вл.іво (для <<) або вправо (для>> і >>>).

int i = 3, j = 100; // i = 3, j = 100 int k = i << 4; // k = 48 int m = j >> 2; // m = 25


Легко зрозуміти, що зрушення вліво на розрядів еквівалентний множенню на , а зрушення вправо - поділу на те ж число.

Задачи для самостійного рішення





Дата публикования: 2015-09-18; Прочитано: 984 | Нарушение авторского права страницы | Мы поможем в написании вашей работы!



studopedia.org - Студопедия.Орг - 2014-2024 год. Студопедия не является автором материалов, которые размещены. Но предоставляет возможность бесплатного использования (0.009 с)...