Java Базовий синтаксис

💖 Подобається?Поділися з друзями посиланням

Коли ми розглядаємо java-програму, її можна визначити як сукупність об'єктів, які взаємодіють з допомогою виклику методів одне одного. Тепер дозвольте нам коротко розібратися в синтаксисі мови Java, що ж клас, об'єкт, методи та змінні примірники означають.

Об'єкт- об'єкти мають стан та поведінку. Наприклад: собака може мати стан – колір, ім'я, а також і поведінку – кивати, бігти, гавкати, їсти. Об'єкт є екземпляром класу.

Клас- може бути визначений як шаблон, який визначає поведінку об'єкта.

Метод- є переважно поведінкою. Клас може містити кілька способів. Саме у методах логічно записані дані маніпулюють та виконують усі дії.

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

Перша програма та знайомство з синтаксисом мови

Давайте розглянемо простий код, в результаті якого будуть виведені на екран слова «Привіт мир!», а за один синтаксис Java.

Public class MyFirstJavaProgram ( public static void main(String args) ( /* Це перша моя java-програма. В результаті виконання на екран буде виведено "Привіт світ!" */ System.out.println("Привіт світ!"); / / Виведення повідомлення на екран ) )

  • Відкрийте блокнот і додайте код, вказаний вище.
  • Збережіть файл як MyFirstJavaProgram.java. Нижче ми розглянемо синтаксис Java і дізнаємося, чому саме під таким ім'ям.
  • Відкрийте вікно командного рядка та перейдіть до каталогу, де було збережено файл. Припустимо, що це C:\.
  • Введіть «Javac MyFirstJavaProgram.java» і натисніть Enter, щоб скомпілювати код. Якщо немає помилки в коді, командна строкаприведе Вас до наступному рядку: (Assumption: The path variable is set).
  • Тепер введіть java MyFirstJavaProgram для запуску програми.
  • Тепер Ви побачите "Привіт Мир!", надрукований у вікні.
C:> javac MyFirstJavaProgram.java C:> java MyFirstJavaProgram Привіт світ!

Основи синтаксису мови Java

Дуже важливо знати та пам'ятати наступні моменти у синтаксисі:

  • Чутливість до регістру - Java чутливий до регістру, тобто ідентифікатор Hello і Hello мають різний сенс.
  • Назва класів - для всіх перша літера має бути в верхньому регістрі.
  • Якщо кілька слів використовуються, щоб сформувати назву класу, перша літера кожного внутрішнього слова має бути у верхньому регістрі, наприклад, MyJavaClass.
  • Назва методів – у синтаксисі Java всі імена методів повинні починатися з літери нижнього регістру.
  • Якщо кілька слів використовуються, щоб сформувати ім'я методу, то перша літера кожного внутрішнього слова має бути у верхньому регістрі, наприклад «public void myMethodName()».
  • Назва файлу програми - найменування файлу програми має точно збігатисяз ім'ям класу.
  • При збереженні файлу, Ви повинні зберегти його, використовуючи ім'я класу (пам'ятайте про чутливість до регістру) і додати ".java" в кінці імені (якщо імена не співпадають, Ваша програма не компілюватиметься), наприклад, "MyJavaProgram" - це назва класу тоді файл повинен бути збережений як «MyJavaProgram.java».
  • public static void main(String args) - обробка програми починається з методу Main(), який обов'язковою частиною кожної програми.

Ідентифікатори в Java

Ідентифікатори- імена, що використовуються для класів, змінних та методів. Усі компоненти Java потребують імена.

Існує декілька правил у синтаксисі мови Java, які необхідно пам'ятати про ідентифікатор. Вони такі:

  • Кожен ідентифікатор повинен починатися з "A" до "Z" або "a" до "z", "$" або "_".
  • Після першого символу може мати будь-яке поєднання символів.
  • Ключове слово не може бути використане як ідентифікатор.
  • Найголовніше - ідентифікатор Java чутливий до регістру.
  • Приклад правильного написання: age, $ salary, _value, __1_value.
  • Приклад неправильного написання: 123abc, -salary.

Перерахування

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

За допомогою переліку Java можна зменшити кількість помилок у коді.

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

Приклад коду перерахування Java

class FreshJuice ( enum FreshJuiceSize( SMALL, MEDIUM, LARGE ) FreshJuiceSize size; ) public class FreshJuiceTest ( public static void main(String args)( FreshJuice juice = новий FreshJuice(); juice.size = FreshJuice; .println("Розмір:" + juice.size) ) )

Отриманий результат вище наведеного прикладу:

Розмір: MEDIUM

Примітка: Java перерахування можуть бути оголошені як самостійно, так і всередині класу. Методи, змінні, конструктори можуть бути визначені усередині перерахування.

Типи змінних

  • Локальні змінні.
  • Змінні класи (статичні).
  • Змінні екземпляри (динамічні).

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

Як і в інших мовах, Java можна модифікувати класи, методи і так далі, за допомогою модифікаторів. Модифікатори Java ділиться на дві категорії:

  • З доступом: default, public, protected, private.
  • Без доступу: final, abstract, strictfp.

Докладніше розглянемо модифікатори класу, модифікатори методів та інші наступному розділі.

Масив

У Java масив є об'єктом, який зберігає кілька змінних одного і того ж типу. Проте сам масив є об'єктом. Ми розглянемо, як створити та заповнити масив у наступних розділах.

Сторінки JSP мають комбінований синтаксис: об'єднання стандартного синтаксису, що відповідає специфікації HTML, та синтаксису JSP, визначеного специфікацією Java Server Pages. Синтаксис JSP визначає правила запису сторінок JSP, що складаються зі стандартних тегів HTMLта тегів JSP. Сторінки JSP, крім HTML-тегів, містять теги JSP наступних категорій:

Директиви JSP

Директивизабезпечують глобальну інформацію щодо конкретних запитів, що надсилаються до JSP, і надають інформацію, необхідну на стадії трансляції.

Директивизавжди розміщуються на початку JSP-сторінки до всіх інших тегів, щоб parser(аналізатор) JSP при розборі тексту на початку виділив глобальні інструкції. Таким чином, JSP Engine (середовище виконання JSP), аналізуючи код, створює з JSP сервлет. Директивиє повідомлення контейнеру JSP. Синтаксис директив JSP виглядає так:

<%@ директива имяАтрибута="значение" %>Синтаксис завдання директивна XML: Директиваможе мати кілька атрибутів. В цьому випадку директиваможе бути повторена для кожного з атрибутів. У той же час пари "ім'я Атрибута = значення"можуть розташовуватися під однією директивою з пробілом як роздільник. Існує три типи директив:

  • page (сторінка)
  • taglib (бібліотека тегів)
  • include (включити)

Директива page

Директива pageвизначає властивості сторінки JSP, які впливають транслятор. Порядок дотримання атрибутів у директиві pageне має значення. Порушення синтаксису або наявність нерозпізнаних атрибутів призводить до помилки трансляції. Приклад директиви pageможе бути наступний код:<%@ page buffer="none" isThreadSafe="yes" errorPage="/error.jsp" %>Ця директива повідомляє, що дана сторінка JSP не використовує буферизацію, що можливе одночасне звернення до цієї сторінки JSP багатьох користувачів, і що підтримується сторінка помилок з ім'ям error.jsp.
Директива pageможе містити інформацію про сторінку:<%@ page info = "JSP Sample 1" %>Список можливих атрибутів директиви pageпредставлений у таблиці.
Найменування атрибутуЗначення Опис
language Рядок Визначає мову, яка використовується у скриптлетах файлу JSP, виразах або будь-яких файлах, що включаються, у тому числі, в тілі відтрансльованого коду. За промовчанням приймається значення "java"
extends Рядок Задає суперклас для сервлета, що генерується. Цей атрибут слід використовувати з великою обережністю, оскільки можливо, що сервер вже використовує якийсь суперклас
import Рядок Визначення імпортованих пакетів, наприклад:
<%@ page import="java.util.* %>
Session true або false Значення true(Приймається за умовчанням) свідчить про те, що заздалегідь певна змінна session(тип HttpSession) має бути прив'язана до існуючої сесії, якщо така є, інакше створюється нова сесія, до якої здійснюється прив'язка. Значення falseвизначає, що сесії не будуть використовуватися, і спроби звернення до змінної sessionприведуть до виникнення помилки під час трансляції JSP сторінки в сервлет
Buffer none або розмір буфера кБ. Задає розмір буфера JspWriter out. Значення за замовчуванням залежить від налаштувань сервера і не повинно перевищувати 8 кБ. Якщо значення дорівнює noneвисновок відбувається безпосередньо в об'єкт
autoFlush true або false Визначає, чи повинен буфер звільнятися автоматично, коли він переповнений, або сталася помилка. За замовчуванням значення true
isThreadSafe true або false Значення true(приймається за умовчанням) задає нормальний режим виконання сервлета, коли множинні запити обробляються одночасно з використанням одного екземпляра сервлета, виходячи з міркування, що автор синхронізував доступ до змінних цього екземпляра. Значення false ("брехня") сигналізує про те, що сервлет повинен успадковувати SingleThreadModel(однопоточну модель), при якій послідовні або одночасні запити обробляються окремими екземплярами сервлету
info Рядок Визначає рядок інформації про сторінку JSP, яка буде доступна за допомогою методу Servlet.getServletInfo()
errorPage Рядок Значення атрибута є URL-сторінка, яка повинна виводитися у випадку можливих помилок, що викликають винятки
isErrorPage true або false Сигналізує про те, чи ця сторінка використовується для обробки помилок для інших JSP сторінок. За замовчуванням приймається значення false
contentType Рядок Визначає кодування для сторінки JSP та відповіді, а також MIME-тип відповіді JSP. Значення за умовчанням типу змісту - text/html, кодування - ISO-8859-1.Наприклад:
contentType="text/html;charset=ISO-8859-1"
pageEncoding Рядок Визначає кодування символів JSP. За замовчуванням використовується charsetз атрибуту contentTypeякщо воно там визначено. Якщо значення charsetв атрибуті contentTypeне визначено, значення pageEncodingвстановлюється рівним ISO-8859-1

Директива taglib

Директива taglibповідомляє, що ця сторінка JSP використовує бібліотеку тегів, унікальним чином ідентифікуючи її за допомогою URI, і ставить у відповідність префікс тега, за допомогою якого можливі дії в бібліотеці. Якщо контейнер не може знайти бібліотеку тегів, то виникає фатальна помилка трансляції. Директива taglibмає наступний синтаксис:<%@ taglib uri="URI бібліотеки тегів, що включається" prefix=" ім'я Префікса"%> Префікс" ім'я Префікса" використовується при зверненні до бібліотеки. Приклад використання бібліотеки тегів mytags: <%@ taglib uri="http://www.taglib/mytags" prefix="customs" %> . . . У цьому прикладі бібліотека тегів має URI-адресу "http://www.taglib/mytags", як префікс призначений рядок customs, яка використовується на сторінці JSP при зверненні до елементів бібліотеки тегів.

Директива включає

Директива includeдозволяє вставляти текст або код у процесі трансляції сторінки JSP у сервлет. Синтаксис директиви includeмає такий вигляд:<%@ include file="Відносний URI сторінки, що включається"%> Директива includeмає один атрибут - file. Вона включає текст специфікованого ресурсу файл JSP. Цю директиву можна використовувати для розміщення стандартного заголовка про авторські права на кожній сторінці JSP:<%@ include file="copyright.html" %>Контейнер JSP отримує доступ до файлу. Якщо файл змінився, контейнер може перекомпілювати сторінку JSP. Директива includeрозглядає ресурс, наприклад, сторінку JSP як статичний об'єкт. Заданий URI зазвичай інтерпретується щодо JSP сторінки, на якій розташоване посилання, але, як і при використанні будь-яких інших відносних URI, можна задати системі положення ресурсу, що цікавить, відносно домашнього каталогу WEB-сервера додаванням на початок URI символу "/". Вміст файлу, що підключається, обробляється як звичайний текст JSP і тому може включати такі елементи, як статичний HTML, елементи скриптів, директиви та дії. Багато сайтів використовують невелику навігаційну панель на кожній сторінці. У зв'язку з проблемами використання кадрів HTML часто це завдання вирішується розміщенням невеликої таблиці зверху чи лівій половині сторінки, HTML код якої багаторазово повторюється кожної сторінки сайту. Директива include- це найбільш природний спосібвирішення даної задачі, що рятує розробника від кошмару рутини копіювання HTML у кожен окремий файл. Оскільки директива includeпідключає файли в ході трансляції сторінки, то після внесення змін до панелі навігації потрібна повторна трансляція всіх сторінок, що її використовують JSP. Якщо підключені файли змінюються досить часто, можна використовувати дію jsp:include, який підключає файл під час звернення до JSP сторінці.

Оголошення JSP

Declarations (Declarations)призначені для визначення змінних та методів мовою скриптів, які надалі використовуються на сторінці JSP. Синтаксис declarationsмає такий вигляд:<%! код Java %> Оголошеннярозміщуються в блоці оголошень, а викликаються в блоці виразів сторінки JSP. Код у блоці оголошень зазвичай пишеться на мовою JavaОднак сервери програм можуть використовувати синтаксис та інші сценарії. Оголошенняіноді використовуються для того, щоб додати додаткову функціональність під час роботи з динамічними даними, одержуваними з властивостей компонентів JavaBeans. Приклади оголошеньпредставлені у таблиці. Оголошенняможе містити кілька рядків, наприклад, у наведеному нижче коді обчислення значення функції fact (int n), яка повинна дорівнювати 1 при n менше 2 і n! за позитивного значення n;<%! public static int fact (int n) { if (n Оголошенняне роблять жодного висновку у стандартний вихідний потік out. Змінні та методи, декларовані в оголошеннях, ініціалізуються та стають доступними для скриптлетів та інших оголошеньу момент ініціалізації сторінки JSP.

Скриптлети JSP

Скриптлетивключають різні фрагменти коду, написаного мовою скрипта, визначеного у директиві language. Фрагменти коду повинні відповідати синтаксичним конструкціям мови скриптлетів, тобто, як правило, синтаксису мови Java. Скриптлетимають наступний синтаксис:<% текст скриптлета %>Еквівалент синтаксису скриптлетудля XML є: текст скриптлету
Якщо у тексті скриптлетунеобхідно використовувати послідовність символів %> саме як поєднання символів, а не як тег - ознака закінчення скриптлету, замість %> слід використовувати наступне поєднання символів %.
У специфікації JSP наводиться простий і зрозумілий приклад скриптлету, що забезпечує динамічну зміну вмісту сторінки JSP протягом дня.<% if (Calendar.getInstance ().get (Calendar.AM_PM) == Calendar.AM) {%>Good Morning<% } else { %>Good Afternoon<% } %>Необхідно зауважити, що код усередині скриплетавставляється у вигляді, як і записаний, і весь статичний HTML-текст (текст шаблону) до чи після скриплетаконвертується за допомогою оператора print. Це означає, що скриплети не обов'язково повинні містити завершені фрагменти на Java, і що залишені відкритими блоки можуть вплинути на статичний HTML-текст поза скриплета. Скриплетимають доступ до тих же автоматично визначених змінних, що й вирази. Тому, наприклад, якщо є необхідність вивести будь-яку інформацію на сторінку, необхідно скористатися змінною out. <% String queryData = request.getQueryString (); out.println ("Дополнительные данные запроса: " + queryData); %>

Вирази JSP

Виразу сторінці JSP - це вираз, написаний мовою скрипта, вказаного в оголошенні language(Як правило Java). Результат вирази JSP, який має обов'язковий тип String, Спрямовується в стандартний потік виведення outза допомогою поточного об'єкта JspWriter. Якщо результат виразине може бути наведено до типу String, виникає або помилка трансляції, якщо проблема була виявлена ​​на етапі трансляції, або збуджується виняток ClassCastException, якщо невідповідність було виявлено у процесі виконання запиту. Виразмає наступний синтаксис: <%= текст вираження %> альтернативний синтаксис для виразів JSP під час використання XML: текст висловлюванняПорядок виконання виразіву сторінці JSP ліворуч-праворуч. Якщо виразз'являється більш ніж в одному атрибуті часу виконання, воно виконується зліва-направо в даному тегу. Виразмає бути повним виразом на певному скрипті (зазвичай Java). Вирази виконуються під час протоколу HTTP. Значення виразу перетворюється на рядок і вмикається у відповідну позицію файлу JSP. Виразизазвичай використовуються для того, щоб обчислити та вивести на екран рядкове представлення змінних та методів, визначених у блоці оголошень сторінки JSP або отриманих від компонентів JavaBeans, які доступні з JSP. Наступний код виразислужить для відображення дати та часу запиту даної сторінки: Поточний час: <%= new java.util.Date () %> Для того, щоб спростити виразиІснує кілька заздалегідь визначених змінних, які можна використовувати. Найчастіше використовувані змінні:
  • request, HttpServletRequest;
  • response, HttpServletResponse;
  • session, HttpSession - асоціюється із запитом, якщо такий є;
  • out, PrintWriter - буферизований варіант типу JspWriter для надсилання даних клієнту.

обов'язково має збігатися з ім'ям класу, метод якого main() викликається при запуску Java машини.

  • Object - клас від якого успадковуються Усеоб'єкти в Java, включаючи масиви та рядки ().
  • Специфікатори доступу індивідуальні для кожного члена (вказуються перед оголошенням).
  • Усі члени класу за промовчанням відкриті для області видимості пакету. Область видимості "за замовчуванням" - це щось середнє між private і protected, див.
  • Кожен *.java файл може містити тільки одинклас оголошений як public і доступний ззовні.
  • Визначення та оголошення класу завжди знаходиться в одному файлі, неможливо винести прототипи у заголовки.
  • Відсутні покажчики.
  • Усі змінні класів – насправді посилання на об'єкти, а не самі об'єкти. Ініціалізація їх для використання обов'язково має виконуватися через new<конструктор-класса>(...) .
  • Виходячи з попереднього пункту - при присвоєнні однієї змінної об'єкта інший виконується тільки зміна посилання, але не копіювання об'єкта.
  • Змінні функції передаються за значенням якщо це елементарні типи(int, byte, long, etc...), або за посиланням, якщо це об'єкти.
  • Доступ до громадських статичних членів класу здійснюється через оператор точки. , а чи не через:: , що мій погляд вносить деяку зовнішню плутаницю.
  • Відсутня деструктор, але finalize() .
  • Не варто плутати finalize() та деструктор С++. finalize() викликається тільки при складанні сміття, яка ніяк не пов'язана з виходом об'єкта з області видимості та відсутністю хоча б одного посилання на цей об'єкт.
  • Складання сміття можна форсувати викликавши метод Runtime.gc() на поточному об'єкті Runtime або статичний метод System.gc() . Судячи з проведених дослідів - звільнення пам'яті працює лише в межах віртуальної машини Java і одного разу виділену пам'ять в ОС не повертає доки не завершиться машина.
  • У Java-стилі написання коду функції генерують винятки замість повернення коду системноїпомилки чи помилки логіки віртуальної машини. Тому безліч функцій обов'язково має виконуватися всередині блоку try ( ... ) catch (...) ( ... ) оброблювального виключення, або метод, що викликає їх, повинен явно вказувати через throws список винятків, що не обробляються ним генеруються цими функціями, для обробки їх методами "вище" за стеком викликів.
  • Винятки поділяються на і.
  • Блок try (…) також може закінчуватися блоком finally (…), що виконується незалежно від наявності/відсутності винятків у попередньому блоці try (…). Це зручно використовувати для виконання будь-яких обов'язкових дій незалежно від результатів виконання блоку коду, наприклад, для автоматичного звільнення всіх виділених у ньому ресурсів.
  • char це не однобайтний тип як із С/С++, це 16-бітний тип підтримуючий unicodeрядки.
  • bool Java відомий як boolean .
  • Умовні конструкції приймають тільки boolean тип змінних або виразів. Це означає, що код виду:
    int a; ... дії над змінною a...; if(a) ( ... )
    Не вірний з точки зору синтаксису Java і не буде скомпільований.
  • Константи оголошуються словом final а не const.
  • Усі масиви – об'єкти.
  • Навіть строкові константи (наприклад, "any string const") є об'єктами.
  • Для рядків (клас String) визначено лише одного оператора - + , конкатенація.
  • Порівняння рядків виконується через метод bool equals() класу String, наприклад s1.equals(s2).
  • Вміст об'єктів-рядків (String) константно і не передбачає зміни окремого елемента рядка, це зроблено з метою підвищення продуктивності. При необхідності подібних операцій можна використовувати клас StringBuffer.
  • При конкатенації не ініціалізованого рядка з не порожнім рядкомвийде null + не-порожня-рядокнаприклад s += "|string"; буде одно "null | string"
  • Масиви мають змінну-член з публічним доступом length , рядки не маютьзамість цього в них використовується метод length() .
  • Java не підтримуємножинного успадкування. Частково його функції виконуються через інтерфейси (interface). Інтерфейси підтримують множинне "успадкування"-реалізацію (implements) декількох інтерфейсів в одному класі, і в цілому відношення "багато (інтерфейсів) до багатьох (класів)" і навпаки.
  • Інтерфейси допускають створення посилань, через які можна звертатися до об'єктів класів, що реалізують ці інтерфейси. Правда динамічний пошук відповідного методу при зверненні через посилання-інтерфейс вимагає багато витрат, тому не бажаний.
  • Замість перерахувань enum можна використовувати інтерфейси без оголошень методів у них. У такому разі всі змінні інтерфейси повинні бути ініціалізовані при визначенні інтерфейсу та їх значення автоматично будуть константні. Після цього через реалізацію їх можна "підключати" до визначеного класу.
  • Так само, починаючи з JDK 5, існують зовнікласичні перерахування - enum. Насправді це не просто список іменованих констант, а спеціальний клас, що успадковується від суперкласу Enum. Кожен елемент перерахування – об'єкт цього класу. Числове значення об'єкта перерахування можна отримати вбудованою функцією ordinal.
  • Користувальницька навантаження операторівзвична в С++, Java не підтримується.
  • Для роботи в об'єктному середовищі з "примітивними типами" (int, float, char, etc...) Java використовується автоупаковка/автораспаковкау типи-оболонки (Integer, Float, Character, etc...). Насправді це реалізація навантаження операторів для кількох вбудованих класів реалізують функціонал примітивних типів + об'єктні методи.
  • super - ключове слів, що дозволяє викликати конструктор суперкласу з підкласу, або звернутися до члена суперкласу прихованого членом підкласу.
    • У разі використання як конструктор - super завжди має бути першимоператором у конструкторі підкласу.
  • Для визначення абстрактнихметодів використовується ключове слово abstract, клас містить абстрактний метод так само має визначатися як abstract class....
  • final забороняє перевизначати методи у дочірніх класах. Для "коротких" методів оголошених як final це ключове слово надає ефект аналогічний inline в С++ - в підкласах замість виклику функції може бутивставлений байт-код методу суперкласу в код методу класу, що викликає.
  • final також забороняє успадкувати клас оголошений як final.
  • Простори імен(namespace) в Java реалізуються як пакети(Package).
  • Для підключення пакетіввикористовується import, так само можна використовувати import static ..(*|) для імпорту статичних членів класу.
  • Java підтримує потоки через вбудований клас Thread та інтерфейс Runable. Для синхронізації використовується специфікатор synchronized перед методом в описі класу або synchronized( ) ( ... ) для блоку коду синхронізованого з . Для сигналів між синхронізованими потоками використовують методи батьківського класу Object: wait()/notify()/notifyAll() .
  • transient - модифікатор, що повідомляє, що значення об'єкта/змінної не потрібно "утримувати" при збереженні об'єкта, наприклад при серіалізації його перед записом на диск/у БД. Логічно таким чином помічати змінні, що містять унікальні ідентифікатори часу виконання та іншу подібну інформацію, що має сенс тільки в поточному екземплярі java-процесу.
  • instanceof - операція часу виконання, повертає trueякщо є посилання на клас або може бути приведений до посилання на цей клас, інакше false.
  • assert - твердження в Java використовуються приблизно так само як і в С: assert [: Assertion fail description] , але потрібно мати на увазіщо вони "вшиваються" в скомпільований байт-код, і можуть бути включені при запуску java-ea.
  • this(...) - може бути використане всередині конструктора класу для виклику іншого конструктора цього ж класу, що підходить за сигнатурою аргументів.
  • Замість шаблоніввикористовуються узагальнення, зовні дуже схоже: CLASS_NAME (…). В узагальненнях не можнавикористовувати примітивнітипи ( int, byte, char, etc...). Як параметри можуть бути використані тільки класи.
    Крім того, підтримуються обмежені типичерез вказівку суперкласу для класів-параметрів. Наприклад, оголошення "узагальненого класу" CLASS_NAME в якому можна використовувати тільки класи-нащадки загального класу числових Number .
  • Для швидкого копіювання масивів зручно використовувати System.arraycopy() .
  • Одним із фундаментальних елементів багатьох мов програмування є умовні конструкції . Дані конструкції дозволяють направити роботу програми одним із шляхів залежно від певних умов.

    У мові Java використовуються такі умовні конструкції: if..else та switch..case

    Конструкція if/else

    Вираз if/else перевіряє істинність певної умови та залежно від результатів перевірки виконує певний код:

    Int num1 = 6; int num2 = 4; if(num1>num2)( System.out.println("Перше число більше другого"); )

    Після ключового слова if ставиться умова. І якщо ця умова виконується, то спрацьовує код, який поміщений далі в блоці if після фігурних дужок. Як умови виступає операція порівняння двох чисел.

    Оскільки, у разі перше число більше другого, то вираз num1 > num2 істинно і повертає значення true . Отже, управління переходить в блок коду після фігурних дужок і починає виконувати інструкції, що містяться там, а саме метод System.out.println("Перше число більше другого"); . Якби перше число виявилося менше другого або дорівнює йому, то інструкції в блоці if не виконувались би.

    Але що, якщо ми захочемо, щоб у разі недотримання умови також виконувались якісь дії? У цьому випадку ми можемо додати блок else:

    Int num1 = 6; int num2 = 4; if(num1>num2)( System.out.println("Перше число більше другого"); ) else( System.out.println("Перше число менше другого");

    Int num1 = 6; int num2 = 8; if(num1>num2)( System.out.println("Перше число більше другого"); ) else if(num1

    Також ми можемо поєднати відразу кілька умов, використовуючи логічні оператори:

    Int num1 = 8; int num2 = 6; if(num1 > num2 && num1>7)( System.out.println("Перше число більше другого і більше 7"); )

    Тут блок if буде виконуватися, якщо num1>num2 дорівнює true і одночасно num1>7 дорівнює true.

    Конструкція switch

    Конструкція switch/caseаналогічна конструкції if/else , оскільки дозволяє обробити відразу кілька умов:

    Int num = 8; switch(num)( case 1: System.out.println("число дорівнює 1"); break; case 8: System.out.println("число дорівнює 8"); num++; break; case 9: System.out. println("число дорівнює 9"); break;

    Після ключового слова switch у дужках йде порівнюваний вираз. Значення цього виразу послідовно порівнюється зі значеннями, розміщеними після оператора сase . І якщо збіг буде знайдено, виконуватиметься певний блок сase .

    Наприкінці блоку сase ставиться оператор break, щоб уникнути виконання інших блоків. Наприклад, якби прибрали оператор break у наступному випадку:

    Case 8: System.out.println("число дорівнює 8"); num++; case 9: System.out.println("число дорівнює 9"); break;

    то оскільки у нас змінна num дорівнює 8, то виконався б блок case 8 , але так як в цьому блоці змінна num збільшується на одиницю, оператор break відсутня, то почав би виконуватися блок case 9 .

    Якщо ми хочемо також обробити ситуацію, коли збігу не буде знайдено, можна додати блок default , як у прикладі вище. Хоча блок default необов'язковий.

    Починаючи з JDK 7 у виразі switch..case крім примітивних типів можна також використовувати рядки:

    Package firstapp; import java.util.Scanner; public class FirstApp ( public static void main(String args) ( Scanner in = new Scanner(System.in); System.out.println("Введіть Y або N: "); String input= in.nextLine(); switch( input)( case "Y": System.out.println("Ви натиснули букву Y"); break; case "N": System.out.println("Ви натиснули букву N"); break; default: System.out .println("Ви натиснули невідому літеру");

    Тернарна операція

    Тернарна операція має наступний синтаксис: [перший операнд - умова] ? [другий операнд]: [третій операнд]. Таким чином, у цій операції беруть участь одразу три операнда. Залежно від умови тернарна операція повертає другий чи третій операнд: якщо умова дорівнює true, то повертається другий операнд; якщо умова дорівнює false, то третій. Наприклад:

    Int x=3; int y=2; int z = x

    Тут результатом тернарної операції є змінна z. Спочатку перевіряється умова x

    Станіслав Горнаков

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

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

    Клас Телефон ( Метод Включити ( ) ( / / Операції з увімкнення телефону ) Метод Вимкнути ( ) ( / / Операції з вимикання телефону ) )

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

    А тепер давайте запишемо той самий клас тільки вже мовою Java.

    Class Telefon ( void on() ( // тіло методу on() ) void off() ( // тіло методу off() ) )

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

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

    У тілі класу Telefon є два методи: on() – що включає телефон і метод off() – телефон, що вимикає. Обидва методи мають свої тіла і в них, за ідеєю, має бути якийсь вихідний код, який описує необхідні дії обох методів. Для нас зараз не має значення, як відбувається реалізація цих методів, головне – це синтаксис мови Java.

    Обидва методи мають круглі дужки on(), всередині яких можуть бути записані параметри, наприклад on(int time) або on(int time, int time1). За допомогою параметрів відбувається своєрідний зв'язок методів із зовнішнім світом. Говорять, що метод on(int time) приймає параметр time. Для чого це потрібно? Наприклад, ви хочете, щоб телефон увімкнувся у певний час. Тоді ціле значення у параметрі time буде передано в тіло методу і на основі отриманих даних відбудеться включення телефону. Якщо дужки порожні, метод не приймає жодних параметрів.

    Коментарі

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

    Коментарі в Java можуть бути трьох видів, це: //, /*…*/ та /**…*/. Коментарі, записані за допомогою оператора // повинні розташовуватися в одному рядку:

    // Один рядок! Помилка! На другий рядок переносити не можна! // Перший рядок // Другий рядок // … // Останній рядок

    Коментарі, що використовують оператори /*…*/ можуть розташовуватися на кількох рядках. На початку вашого коментаря поставте /*, а наприкінці, коли закінчите коментувати код, поставте оператор */. Останній вид коментаря /**…*/ використовується при документуванні коду і може розташовуватися на будь-якій кількості рядків.

    Типи даних Java

    Щоб задати довільне значення, Java існують типи даних. У класі Telefon ми створили два методи. Обидва методи не мали параметрів, але коли наводився приклад методу on(int time) з параметром time, йшлося про передачу значення метод. Це значення вказувало на час, за допомогою якого нібито повинен увімкнутися телефон. Специфікатор int таки визначає тип значення time. У Java 2 МЕ шість типів даних.

    Byte - мале ціле значення від -128 до 128;
    short – коротке ціле значення діапазоні від –32768 до 32767;
    int - містить будь-яке ціле значення від -2147483648 до 2147483647;
    long - дуже велике ціле значення, від -922337203685475808 до 9223372036854775807;
    char – це символьна константа у форматі Unicode. Діапазон цього формату від 0 до 65536, що дорівнює 256 символам. Будь-який символ цього типу повинен записуватися в одинарних лапках, наприклад: G;
    boolean – логічний тип, має два значення: false – брехня і true – істина. Цей тип часто використовується в циклах, про які трохи пізніше. Сенс дуже простий – якщо у вас у кишені є гроші, імовірно, це true, а якщо ні то false. Таким чином, якщо гроші є – йдемо в магазин за хлібом чи пивом (потрібне підкреслити), якщо немає грошей – залишаємось вдома. Тобто це така логічна величина, яка сприяє вибору подальших дій вашої програми.

    Щоб оголосити якесь необхідне значення, використовується запис:

    Int time; long BigTime; char word;

    Оператор точка з комою необхідний після записів і ставиться наприкінці рядка. Можна поєднати кілька однакових за типом оголошень через кому:

    Mt time, time1, time2;

    Тепер давайте удосконалимо наш клас Telefon, додавши до нього кілька значень. Методи on() і off() нам більше не потрібні, додамо нові методи, які справді можуть вирішувати певні завдання.

    Class Telefon ( //S – площа дисплея //w – ширина дисплея //h – висота дисплея int w, h, S; //метод, що обчислює площу дисплея void Area() ( S = w*h; ) )

    Отже, ми маємо три змінні S, w і h, які відповідають, відповідно, за площу, ширину та висоту дисплея в пікселях. Метод Area() обчислює площу екрана телефону в пікселях. Операція марна, але дуже показова і проста в розумінні. Тіло методу Area() набуло себе і має вигляд S = w * h. У цьому методі ми просто перемножуємо ширину на висоту і присвоюємо або, як ще кажуть, зберігаємо результат у змінній S. Ця змінна міститиме значення площі дисплея даного телефону. Зараз ми підійшли впритул до операторів мови Java, за допомогою яких можна здійснювати всілякі операції та про які ми поговоримо вже в наступній частині цієї серії статей.




    Розповісти друзям