Feb 27, 2016
Feb 27, 2016
1
---
2
contributors:
3
- ["Jake Prather", "http://github.com/JakeHP"]
4
- ["Jakukyo Friel", "http://weakish.github.io"]
5
- ["Madison Dickson", "http://github.com/mix3d"]
6
- ["Simon Morgan", "http://sjm.io/"]
7
- ["Zachary Ferguson", "http://github.com/zfergus2"]
8
- ["Cameron Schermerhorn", "http://github.com/cschermerhorn"]
9
- ["Rachel Stiyer", "https://github.com/rstiyer"]
10
translators:
Feb 27, 2016
Feb 27, 2016
14
---
15
16
Java є об’єктно-орієнтованою мовою програмування загального призначення з підтримкою паралельного програмування, яка базується на класах.
17
[Детальніше читайте тут, англ.](http://docs.oracle.com/javase/tutorial/java/)
Feb 27, 2016
Feb 27, 2016
18
19
```java
20
// Однорядковий коментар починається з //
21
/*
22
Багаторядковий коментар виглядає так.
23
*/
24
/**
25
JavaDoc-коментар виглядає так. Використовується для опису класу та членів класу.
Feb 27, 2016
Feb 27, 2016
26
*/
27
Feb 27, 2016
Feb 27, 2016
29
import java.util.ArrayList;
Feb 27, 2016
Feb 27, 2016
31
import java.security.*;
32
33
// Кожний .java файл містить один зовнішній публічний клас, ім’я якого співпадає
34
// з іменем файлу.
Feb 27, 2016
Feb 27, 2016
35
public class LearnJava {
36
37
// Для запуску програма, написана на java, повинна мати точку входу у вигляді методу main.
38
public static void main (String[] args) {
39
40
// Використання System.out.println() для виводу на друк рядків.
Feb 27, 2016
Feb 27, 2016
42
System.out.println(
43
" Ціле число: " + 10 +
44
" Число з рухомою комою подвійної точности: " + 3.14 +
45
" Булеве значення: " + true);
Feb 27, 2016
Feb 27, 2016
46
47
// Для друку без переходу на новий рядок використовується System.out.print().
48
System.out.print("Привіт, ");
49
System.out.print("світе");
Feb 27, 2016
Feb 27, 2016
50
51
// Використання System.out.printf() для простого форматованого виводу на друк.
52
System.out.printf("pi = %.5f", Math.PI); // => pi = 3.14159
53
54
///////////////////////////////////////
55
// Змінні
56
///////////////////////////////////////
57
58
/*
59
* Оголошення змінних
60
*/
61
// Для оголошення змінних використовується формат <тип> <змінна>
62
int fooInt;
63
// Оголошення декількох змінних одного типу <тип> <ім’я1>, <ім’я2>, <ім’я3>
Feb 27, 2016
Feb 27, 2016
64
int fooInt1, fooInt2, fooInt3;
65
66
/*
67
* Ініціалізація змінних
68
*/
69
70
// Ініціалізація змінної з використанням формату <тип> <ім’я> = <значення>
Feb 27, 2016
Feb 27, 2016
71
int fooInt = 1;
72
// Ініціалізація декількох змінних одного типу з одним значенням <тип> <ім’я1>, <ім’я2>, <ім’я3> = <значення>
Feb 27, 2016
Feb 27, 2016
73
int fooInt1, fooInt2, fooInt3;
74
fooInt1 = fooInt2 = fooInt3 = 1;
75
76
/*
77
* Типи змінних
78
*/
Feb 27, 2016
Feb 27, 2016
80
// (-128 <= byte <= 127)
81
byte fooByte = 100;
82
83
// Short — 16-бітне ціле число зі знаком
84
// (-32 768 <= short <= 32 767)
Feb 27, 2016
Feb 27, 2016
85
short fooShort = 10000;
86
87
// Integer — 32-бітне ціле число зі знаком
88
// (-2 147 483 648 <= int <= 2 147 483 647)
Feb 27, 2016
Feb 27, 2016
89
int fooInt = 1;
90
91
// Long — 64-бітне ціле число зі знаком
92
// (-9 223 372 036 854 775 808 <= long <= 9 223 372 036 854 775 807)
Feb 27, 2016
Feb 27, 2016
93
long fooLong = 100000L;
94
// L використовується для позначення того, що число має тип Long;
95
// інакше число буде трактуватись як integer.
96
97
// Примітка: Java не має беззнакових типів.
98
99
// Float — 32-бітне число з рухомою комою одиничної точності за стандартом IEEE 754
Feb 27, 2016
Feb 27, 2016
100
// 2^-149 <= float <= (2-2^-23) * 2^127
101
float fooFloat = 234.5f;
102
// f або F використовується для позначення того, що змінна має тип float;
Feb 27, 2016
Feb 27, 2016
103
// інакше трактується як double.
104
105
// Double — 64-бітне число з рухомою комою подвійної точності за стандартом IEEE 754
Feb 27, 2016
Feb 27, 2016
106
// 2^-1074 <= x <= (2-2^-52) * 2^1023
107
double fooDouble = 123.4;
108
Feb 27, 2016
Feb 27, 2016
110
boolean fooBoolean = true;
111
boolean barBoolean = false;
112
Feb 27, 2016
Feb 27, 2016
114
char fooChar = 'A';
115
116
// final - посилання на такі змінні не можуть бути присвоєні іншим об’єктам,
Feb 27, 2016
Feb 27, 2016
117
final int HOURS_I_WORK_PER_WEEK = 9001;
118
// але вони можуть мати відкладену ініціалізацію.
119
final double E;
120
E = 2.71828;
121
122
123
// BigInteger -Незмінні знакові цілі числа довільної точності
124
//
125
// BigInteger є типом даних, який дає можливість розробнику виконувати операції
Feb 27, 2016
Feb 27, 2016
126
// з цілими числами, розрядність яких більша за 64 біти. Числа зберігаються у масиві
127
// байтів, операції над ними виконуються функціями, які мають клас BigInteger
Feb 27, 2016
Feb 27, 2016
128
//
129
// BigInteger можна ініціалізувати, використовуючи масив байтів чи рядок.
Feb 27, 2016
Feb 27, 2016
131
BigInteger fooBigInteger = new BigInteger(fooByteArray);
132
133
Feb 27, 2016
Feb 27, 2016
135
//
136
// BigDecimal складається з двох частин: цілого числа довільної точності
Feb 27, 2016
Feb 27, 2016
137
// з немасштабованим значенням та 32-бітного масштабованого цілого числа
138
//
139
// BigDecimal дозволяє розробникам контролювати десяткове округлення.
140
// Рекомендовано використовувати BigDecimal зі значеннями валют
Feb 27, 2016
Feb 27, 2016
141
// і там, де необхідна точність дробових обчислень.
142
//
143
// BigDecimal може бути ініціалізований типами даних int, long, double або String
Feb 27, 2016
Feb 27, 2016
144
// чи немасштабованим значенням (BigInteger) і масштабованим значенням (int).
145
146
BigDecimal fooBigDecimal = new BigDecimal(fooBigInteger, fooInt);
Feb 27, 2016
Feb 27, 2016
148
// Для дотримання заданої точності рекомендується використовувати
Feb 27, 2016
Feb 27, 2016
151
BigDecimal tenCents = new BigDecimal("0.1");
152
153
154
// Рядки
155
String fooString = "Це мій рядок!";
156
157
// \n є символом переходу на новий рядок
158
String barString = "Друк з нового рядка?\nНема питань!";
159
// \t — це символ табуляції
Feb 27, 2016
Feb 27, 2016
160
String bazString = "Хочете додати табуляцію?\tТримайте!";
161
System.out.println(fooString);
162
System.out.println(barString);
163
System.out.println(bazString);
164
165
// Масиви
166
// Розмір масиву має бути визначений перед ініціалізацією
167
// Наведений формат ілюструє ініціалізацію масивів
168
// <тип даних>[] <ім’я змінної> = new <тип даних>[<розмір масиву>];
169
// <тип даних> <ім’я змінної>[] = new <тип даних>[<розмір масиву>];
Feb 27, 2016
Feb 27, 2016
170
int[] intArray = new int[10];
171
String[] stringArray = new String[1];
172
boolean boolArray[] = new boolean[100];
173
174
// Інший шлях оголошення та ініціалізації масиву
175
int[] y = {9000, 1000, 1337};
176
String names[] = {"Bob", "John", "Fred", "Juan Pedro"};
177
boolean bools[] = new boolean[] {true, false, false};
178
Feb 27, 2016
Feb 27, 2016
180
System.out.println("intArray @ 0: " + intArray[0]);
181
182
// Масиви є змінними та мають нульовий елемент.
183
intArray[1] = 1;
184
System.out.println("intArray @ 1: " + intArray[1]); // => 1
185
186
// Додатково
187
// ArrayLists — Схожі на масив, але мають більший функціонал та змінний розмір.
188
// LinkedLists — Реалізація двозв’язного списку. Всі операції
Feb 27, 2016
Feb 27, 2016
189
// виконуються так, як очікується від
190
// двозв’язного списку.
191
// Maps — Множина об’єктів, які пов’язують ключ зі значенням. Map є
Feb 27, 2016
Feb 27, 2016
192
// інтерфейсом, тому не може бути успадкований.
Feb 27, 2016
Feb 27, 2016
194
// вказуватись у класі, який його реалізує.
195
// Ключ не може повторюватись і пов’язаний лише з одним значенням
196
// HashMaps — Цей клас використовує хеш-таблицю для реалізації інтерфейсу Map.
Feb 27, 2016
Feb 27, 2016
197
// Це дозволяє виконувати певні операції,
198
// такі, як отримання та вставка елемента,
199
// залишаючись постійними навіть для великої кількості елементів.
Feb 27, 2016
Feb 27, 2016
200
201
///////////////////////////////////////
Feb 27, 2016
Feb 27, 2016
203
///////////////////////////////////////
Feb 27, 2016
Feb 27, 2016
205
Feb 27, 2016
Feb 27, 2016
207
Feb 27, 2016
Feb 27, 2016
209
System.out.println("1+2 = " + (i1 + i2)); // => 3
210
System.out.println("2-1 = " + (i2 - i1)); // => 1
211
System.out.println("2*1 = " + (i2 * i1)); // => 2
212
System.out.println("1/2 = " + (i1 / i2)); // => 0 (int/int повертається як int)
Feb 27, 2016
Feb 27, 2016
213
System.out.println("1/2 = " + (i1 / (double)i2)); // => 0.5
214
Feb 27, 2016
Feb 27, 2016
216
System.out.println("11%3 = "+(11 % 3)); // => 2
217
Feb 27, 2016
Feb 27, 2016
219
System.out.println("3 == 2? " + (3 == 2)); // => false
220
System.out.println("3 != 2? " + (3 != 2)); // => true
221
System.out.println("3 > 2? " + (3 > 2)); // => true
222
System.out.println("3 < 2? " + (3 < 2)); // => false
223
System.out.println("2 <= 2? " + (2 <= 2)); // => true
224
System.out.println("2 >= 2? " + (2 >= 2)); // => true
225
Feb 27, 2016
Feb 27, 2016
227
System.out.println("3 > 2 && 2 > 3? " + ((3 > 2) && (2 > 3))); // => false
228
System.out.println("3 > 2 || 2 > 3? " + ((3 > 2) || (2 > 3))); // => true
229
System.out.println("!(3 == 2)? " + (!(3 == 2))); // => true
230
Feb 27, 2016
Feb 27, 2016
232
/*
233
~ Унарне бітове доповнення
234
<< Знаковий зсув уліво
235
>> Знаковий/Арифметичний зсув управо
236
>>> Беззнаковий/Логічний зсув управо
237
& Бітове І
238
^ Бітови виключне АБО
239
| Бітове АБО
Feb 27, 2016
Feb 27, 2016
240
*/
241
Feb 27, 2016
Feb 27, 2016
243
int i = 0;
244
System.out.println("\n->Інкремент/Декремент");
245
// Оператори ++ і -- здійснюють інкремент та декремент ретроспективно.
246
// Якщо вони розташовані перед змінною, операція виконається перед поверненням;
247
// якщо після неї — повернеться інкремент або декремент.
248
System.out.println(i++); // i = 1, друкує 0 (постінкремент)
249
System.out.println(++i); // i = 2, друкує 2 (преінкремент)
250
System.out.println(i--); // i = 1, друкує 2 (постдекремент)
251
System.out.println(--i); // i = 0, друкує 0 (предекремент)
Feb 27, 2016
Feb 27, 2016
252
253
///////////////////////////////////////
Feb 27, 2016
Feb 27, 2016
255
///////////////////////////////////////
Feb 27, 2016
Feb 27, 2016
257
Feb 27, 2016
Feb 27, 2016
259
int j = 10;
260
if (j == 10) {
Feb 27, 2016
Feb 27, 2016
262
} else if (j > 10) {
Feb 27, 2016
Feb 27, 2016
264
} else {
Feb 27, 2016
Feb 27, 2016
266
}
267
Feb 27, 2016
Feb 27, 2016
269
int fooWhile = 0;
270
while(fooWhile < 100) {
271
System.out.println(fooWhile);
272
// Інкремент лічильника
273
// Виконається 100 разів, fooWhile 0,1,2...99
Feb 27, 2016
Feb 27, 2016
274
fooWhile++;
275
}
276
System.out.println("fooWhile Value: " + fooWhile);
277
Feb 27, 2016
Feb 27, 2016
279
int fooDoWhile = 0;
280
do {
281
System.out.println(fooDoWhile);
Feb 27, 2016
Feb 27, 2016
284
fooDoWhile++;
285
} while(fooDoWhile < 100);
Feb 27, 2016
Feb 27, 2016
287
288
// Цикл з параметром For
289
// структура циклу => for(<початковий стан>; <умова завершення>; <крок>)
Feb 27, 2016
Feb 27, 2016
290
for (int fooFor = 0; fooFor < 10; fooFor++) {
291
System.out.println(fooFor);
Feb 27, 2016
Feb 27, 2016
293
}
Feb 27, 2016
Feb 27, 2016
297
outer:
298
for (int i = 0; i < 10; i++) {
299
for (int j = 0; j < 10; j++) {
300
if (i == 5 && j ==5) {
301
break outer;
Feb 27, 2016
Feb 27, 2016
303
}
304
}
305
}
307
// Цикл For Each
308
// Призначений для перебору масивів та колекцій
309
int[] fooList = {1, 2, 3, 4, 5, 6, 7, 8, 9};
Feb 27, 2016
Feb 27, 2016
310
311
for (int bar : fooList) {
312
System.out.println(bar);
Feb 27, 2016
Feb 27, 2016
314
}
315
316
// Оператор вибору Switch Case
317
// Оператор вибору працює з типами даних byte, short, char, int.
319
// класом String та класами-обгортками примітивних типів:
320
// Character, Byte, Short та Integer.
Feb 27, 2016
Feb 27, 2016
321
int month = 3;
322
String monthString;
323
switch (month) {
Feb 27, 2016
Feb 27, 2016
325
break;
Feb 27, 2016
Feb 27, 2016
327
break;
Feb 27, 2016
Feb 27, 2016
329
break;
Feb 27, 2016
Feb 27, 2016
331
break;
332
}
335
// Починаючи з Java 7 і далі, вибір рядкових змінних здійснюється так:
Feb 27, 2016
Feb 27, 2016
337
switch(myAnswer) {
Feb 27, 2016
Feb 27, 2016
340
break;
Feb 27, 2016
Feb 27, 2016
343
break;
Feb 27, 2016
Feb 27, 2016
346
break;
347
default:
Feb 27, 2016
Feb 27, 2016
349
break;
350
}
351
353
// Можна використовувати оператор «?» (знак питання) для визначення умови.
354
// Читається так: «Якщо (умова) вірна, то <перше значення>, інакше
355
// <друге значення>»
Feb 27, 2016
Feb 27, 2016
356
int foo = 5;
357
String bar = (foo < 10) ? "A" : "B";
Feb 27, 2016
Feb 27, 2016
359
360
361
////////////////////////////////////////
Feb 27, 2016
Feb 27, 2016
363
////////////////////////////////////////
364
365
// Перетворення String на Integer
366
Integer.parseInt("123");//поверне числову версію рядка "123"
Feb 27, 2016
Feb 27, 2016
367
368
// Перетворення Integer на String
369
Integer.toString(123);//повертає рядкову версію 123
Feb 27, 2016
Feb 27, 2016
370
Feb 27, 2016
Feb 27, 2016
372
// Double
373
// Long
374
// String
375
Feb 27, 2016
Feb 27, 2016
378
// http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html
379
380
381
///////////////////////////////////////
Feb 27, 2016
Feb 27, 2016
383
///////////////////////////////////////
384
Feb 27, 2016
Feb 27, 2016
386
Feb 27, 2016
Feb 27, 2016
388
Feb 27, 2016
Feb 27, 2016
390
Bicycle trek = new Bicycle();
391
393
trek.speedUp(3); // Постійно використовуються методи з назвами set і get
Feb 27, 2016
Feb 27, 2016
394
trek.setCadence(100);
395
396
// toString повертає рядкове представлення об’єкту.
397
System.out.println("Інформація про об’єкт trek: " + trek.toString());
399
// У Java немає синтаксису для явного створення статичних колекцій.
400
// Це можна зробити так:
Feb 27, 2016
Feb 27, 2016
401
402
private static final Set<String> COUNTRIES = new HashSet<String>();
403
static {
404
validCodes.add("DENMARK");
405
validCodes.add("SWEDEN");
406
validCodes.add("FINLAND");
407
}
408
Feb 27, 2016
Feb 27, 2016
410
411
private static final Set<String> COUNTRIES = new HashSet<String>() {{
412
add("DENMARK");
413
add("SWEDEN");
414
add("FINLAND");
415
}}
416
417
// Перші фігурні дужки створюють анонімний внутрішній клас, а другі —
418
// блок ініціалізації екземпляра. Однак це вважається антипаттерном:
419
// створюється новий клас для кожного випадку, що збільшує витрати
420
// пам'яті (Metaspace) і може спричинити витік пам'яті.
421
// Для Java 9+ використовуйте Set.of().
Feb 27, 2016
Feb 27, 2016
422
Feb 27, 2016
Feb 27, 2016
425
426
427
// У .java-файл можна додавати інші, не public класи зовнішнього рівня,
Feb 27, 2016
Feb 27, 2016
429
430
433
// // поля, конструктори, функції та ін.
434
// // у Java функції називаються методами.
Feb 27, 2016
Feb 27, 2016
435
// }
436
437
class Bicycle {
438
439
// Поля (змінні) класу Bicycle
440
public int cadence; // Public: доступно звідусіль
441
private int speed; // Private: доступно лише у межах класу
442
protected int gear; // Protected: доступно лише класові та його нащадкам
443
String name; // за замовчанням: доступно у даному пакеті
Feb 27, 2016
Feb 27, 2016
444
Feb 27, 2016
Feb 27, 2016
446
447
// статичний блок
448
// Java не має статичних конструкторів, але
449
// має статичний блок ініціалізації змінних класу
450
// Цей блок виконується при завантаженні класу.
Feb 27, 2016
Feb 27, 2016
451
static {
452
className = "Bicycle";
453
}
454
Feb 27, 2016
Feb 27, 2016
457
public Bicycle() {
Feb 27, 2016
Feb 27, 2016
459
// this(1, 50, 5, "Bontrager");
460
gear = 1;
461
cadence = 50;
462
speed = 5;
463
name = "Bontrager";
464
}
465
Feb 27, 2016
Feb 27, 2016
467
public Bicycle(int startCadence, int startSpeed, int startGear,
468
String name) {
469
this.gear = startGear;
470
this.cadence = startCadence;
471
this.speed = startSpeed;
472
this.name = name;
473
}
474
476
// <public/private/protected> <тип повернутого значення> <ім’я методу>(<аргументи>)
Feb 27, 2016
Feb 27, 2016
477
478
// Java-класи часто мають методи для отримання та встановлення змінних
Feb 27, 2016
Feb 27, 2016
479
481
// <модифікатор доступу> <тип повернутого значення> <ім’я методу>(<аргументи>)
Feb 27, 2016
Feb 27, 2016
482
public int getCadence() {
483
return cadence;
484
}
485
Feb 27, 2016
Feb 27, 2016
487
public void setCadence(int newValue) {
488
cadence = newValue;
489
}
490
491
public void setGear(int newValue) {
492
gear = newValue;
493
}
494
495
public void speedUp(int increment) {
496
speed += increment;
497
}
498
499
public void slowDown(int decrement) {
500
speed -= decrement;
501
}
502
503
public void setName(String newName) {
504
name = newName;
505
}
506
507
public String getName() {
508
return name;
509
}
510
511
//Метод показує значення змінних об’єкту.
512
@Override // Успадковано від класу Object.
Feb 27, 2016
Feb 27, 2016
513
public String toString() {
514
return "gear: " + gear + " cadence: " + cadence + " speed: " + speed +
515
" name: " + name;
516
}
Feb 27, 2016
Feb 27, 2016
518
Feb 27, 2016
Feb 27, 2016
520
class PennyFarthing extends Bicycle {
521
// (Penny Farthings мають велике переднє колесо.
522
// Вони не мають передач.)
Feb 27, 2016
Feb 27, 2016
523
524
public PennyFarthing(int startCadence, int startSpeed){
Feb 27, 2016
Feb 27, 2016
526
super(startCadence, startSpeed, 0, "PennyFarthing");
527
}
528
529
// Перевизначений метод має бути відмічений аннотацією, яка починається зі знака @.
Feb 27, 2016
Feb 27, 2016
532
@Override
533
public void setGear(int gear) {
534
gear = 0;
535
}
536
}
537
540
// <рівень доступу> interface <ім’я інтерфейсу> extends <батьківський інтерфейс> {
541
// // Константи
Feb 27, 2016
Feb 27, 2016
543
// }
544
Feb 27, 2016
Feb 27, 2016
546
public interface Edible {
Feb 27, 2016
Feb 27, 2016
549
}
550
551
public interface Digestible {
552
public void digest();
553
}
554
555
Feb 27, 2016
Feb 27, 2016
557
public class Fruit implements Edible, Digestible {
Feb 27, 2016
Feb 27, 2016
559
@Override
560
public void eat() {
561
// ...
562
}
563
564
@Override
565
public void digest() {
566
// ...
567
}
568
}
569
570
// В Java можна успадковувати лише один клас, але реалізовувати багато
571
// інтерфейсів. Наприклад:
Feb 27, 2016
Feb 27, 2016
572
public class ExampleClass extends ExampleClassParent implements InterfaceOne,
573
InterfaceTwo {
574
575
@Override
576
public void InterfaceOneMethod() {
577
}
578
579
@Override
580
public void InterfaceTwoMethod() {
581
}
582
583
}
584
Feb 27, 2016
Feb 27, 2016
586
588
// <рівень доступу> abstract <ім’я класу> extends <батьківський абстрактний клас> {
Feb 27, 2016
Feb 27, 2016
591
// }
592
593
// Позначення класу як абстрактного означає, що оголошені у ньому методи мають
594
// бути реалізовані у дочірніх класах. Подібно до інтерфейсів, не можна створити екземпляри
595
// абстракних класів, але їх можна успадковувати. Нащадок зобов’язаний реалізувати всі абстрактні
596
// методи. На відміну від інтерфейсів, абстрактні класи можуть мати як визначені,
598
// за винятком статичних методів, а змінні неявно мають модифікатор final, на відміну від
599
// абстрактного класу. Абстрактні класи МОЖУТЬ мати метод «main».
Feb 27, 2016
Feb 27, 2016
600
601
public abstract class Animal
602
{
603
public abstract void makeSound();
604
Feb 27, 2016
Feb 27, 2016
606
public void eat()
607
{
608
System.out.println("Я тварина, і я їм.");
609
// Зауваження: є доступ до приватних змінних.
Feb 27, 2016
Feb 27, 2016
610
age = 30;
611
}
612
Feb 27, 2016
Feb 27, 2016
614
protected int age;
615
616
public void printAge()
617
{
618
System.out.println(age);
619
}
620
Feb 27, 2016
Feb 27, 2016
622
public static void main(String[] args)
623
{
Feb 27, 2016
Feb 27, 2016
625
}
626
}
627
628
class Dog extends Animal
629
{
Feb 27, 2016
Feb 27, 2016
631
@Override
632
public void makeSound()
633
{
Feb 27, 2016
Feb 27, 2016
636
}
637
639
// @Override тут, так як у java не можна
640
// перевизначати статичні методи.
Feb 27, 2016
Feb 27, 2016
643
public static void main(String[] args)
644
{
645
Dog pluto = new Dog();
646
pluto.makeSound();
647
pluto.eat();
648
pluto.printAge();
649
}
650
}
651
Feb 27, 2016
Feb 27, 2016
653
654
// Синтаксис оголошення фінальних класів
655
// <рівень доступу> final <ім’я класу> {
Feb 27, 2016
Feb 27, 2016
658
// }
659
660
// Фінальні класи не можуть мати нащадків, також самі вони є останніми нащадками.
661
// Фінальні класи є протилежністю абстрактних у цьому плані.
Feb 27, 2016
Feb 27, 2016
663
public final class SaberToothedCat extends Animal
664
{
Feb 27, 2016
Feb 27, 2016
666
@Override
667
public void makeSound()
668
{
Feb 27, 2016
Feb 27, 2016
670
}
671
}
672
Feb 27, 2016
Feb 27, 2016
674
public abstract class Mammal()
675
{
676
// Синтаксис фінальних методів:
677
// <модифікатор доступу> final <тип повернутого значення> <ім’я функції>(<аргументи>)
Feb 27, 2016
Feb 27, 2016
678
Feb 27, 2016
Feb 27, 2016
681
public final boolean isWarmBlooded()
682
{
683
return true;
684
}
685
}
686
687
Feb 27, 2016
Feb 27, 2016
689
//
690
// Enum є спеціальним типом даних, який дозволяє змінним бути певною множиною
691
// визначених констант. Змінна має відповідати одному зі значень, що
692
// заздалегідь визначені для неї. Оскільки це константи, імена типів полів у enum
693
// задаються у верхньому регістрі. Тип «перелік» у Java задається за допомогою
694
// ключового слова enum. Наприклад, перелік днів тижня можна задати так:
Feb 27, 2016
Feb 27, 2016
695
696
public enum Day {
697
SUNDAY, MONDAY, TUESDAY, WEDNESDAY,
Feb 27, 2016
Feb 27, 2016
699
}
700
Feb 27, 2016
Feb 27, 2016
702
703
public class EnumTest {
Feb 27, 2016
Feb 27, 2016
706
Day day;
Feb 27, 2016
Feb 27, 2016
708
public EnumTest(Day day) {
709
this.day = day;
710
}
Feb 27, 2016
Feb 27, 2016
712
public void tellItLikeItIs() {
713
switch (day) {
714
case MONDAY:
Feb 27, 2016
Feb 27, 2016
716
break;
Feb 27, 2016
Feb 27, 2016
718
case FRIDAY:
Feb 27, 2016
Feb 27, 2016
720
break;
Feb 27, 2016
Feb 27, 2016
723
case SUNDAY:
Feb 27, 2016
Feb 27, 2016
725
break;
Feb 27, 2016
Feb 27, 2016
727
default:
Feb 27, 2016
Feb 27, 2016
729
break;
730
}
731
}
Feb 27, 2016
Feb 27, 2016
733
public static void main(String[] args) {
734
EnumTest firstDay = new EnumTest(Day.MONDAY);
Feb 27, 2016
Feb 27, 2016
736
EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);
Feb 27, 2016
Feb 27, 2016
738
}
739
}
740
742
// Тіло переліків може містити методи та інші змінні.
743
// Дивіться більше тут: https://docs.oracle.com/javase/tutorial/java/javaOO/enum.html
Feb 27, 2016
Feb 27, 2016
744
```
745
Feb 27, 2016
Feb 27, 2016
747
748
Посилання, наведені нижче, дозволяють тільки зрозуміти тему. Щоб знайти конкретні приклади, використовуйте Ґуґл.
Feb 27, 2016
Feb 27, 2016
749
Feb 27, 2016
Feb 27, 2016
751
752
* [Посібник Java від Sun / Oracle](http://docs.oracle.com/javase/tutorial/index.html)
Feb 27, 2016
Feb 27, 2016
753
754
* [Java — модифікатори доступу](http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html)
Feb 27, 2016
Feb 27, 2016
755
756
* [ООП-концепції](http://docs.oracle.com/javase/tutorial/java/concepts/index.html):
757
* [Наслідування](http://docs.oracle.com/javase/tutorial/java/IandI/subclasses.html)
758
* [Поліморфізм](http://docs.oracle.com/javase/tutorial/java/IandI/polymorphism.html)
759
* [Абстракція](http://docs.oracle.com/javase/tutorial/java/IandI/abstract.html)
Feb 27, 2016
Feb 27, 2016
760
761
* [Виключення](http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html)
Feb 27, 2016
Feb 27, 2016
762
763
* [Інтерфейси](http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html)
Feb 27, 2016
Feb 27, 2016
764
765
* [параметризація](http://docs.oracle.com/javase/tutorial/java/generics/index.html)
Feb 27, 2016
Feb 27, 2016
766
767
* [Стиль коду у Java](http://www.oracle.com/technetwork/java/codeconvtoc-136057.html)
Feb 27, 2016
Feb 27, 2016
768
Feb 27, 2016
Feb 27, 2016
770
771
* [Codingbat.com](http://codingbat.com/java)
772
773
* [Codewars - Java Katas](https://www.codewars.com/?language=java)
774
775
* [University of Helsinki - Object-Oriented programming with Java](http://moocfi.github.io/courses/2013/programming-part-1/)
Feb 27, 2016
Feb 27, 2016
776
Feb 27, 2016
Feb 27, 2016
778
779
* [Head First Java](http://www.headfirstlabs.com/books/hfjava/)
780
781
* [Thinking in Java](https://www.amazon.com/Thinking-Java-4th-Bruce-Eckel/dp/0131872486/)
Feb 27, 2016
Feb 27, 2016
782
783
* [Objects First with Java](http://www.amazon.com/Objects-First-Java-Practical-Introduction/dp/0132492660)
784
785
* [Java The Complete Reference](http://www.amazon.com/gp/product/0071606300)