adambard · GitHub

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

11

- ["Oleksandr Tatarchuk", "https://github.com/tatarchuk"]

Feb 27, 2016

Feb 27, 2016

12

- ["Andre Polykanine", "https://github.com/Oire"]

Aug 25, 2017

Aug 25, 2017

13

Feb 27, 2016

Feb 27, 2016

14

---

15

Feb 27, 2016

Feb 27, 2016

16

Java є об’єктно-орієнтованою мовою програмування загального призначення з підтримкою паралельного програмування, яка базується на класах.

17

[Детальніше читайте тут, англ.](http://docs.oracle.com/javase/tutorial/java/)

Feb 27, 2016

Feb 27, 2016

18

19

```java

20

// Однорядковий коментар починається з //

21

/*

22

Багаторядковий коментар виглядає так.

23

*/

24

/**

Feb 27, 2016

Feb 27, 2016

25

JavaDoc-коментар виглядає так. Використовується для опису класу та членів класу.

Feb 27, 2016

Feb 27, 2016

26

*/

27

Feb 27, 2016

Feb 27, 2016

28

// Імпорт класу ArrayList з пакета java.util

Feb 27, 2016

Feb 27, 2016

29

import java.util.ArrayList;

Jul 27, 2018

Jul 27, 2018

30

// Імпорт усіх класів з пакета java.security

Feb 27, 2016

Feb 27, 2016

31

import java.security.*;

32

Feb 27, 2016

Feb 27, 2016

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

41

System.out.println("Привіт, світе!");

Feb 27, 2016

Feb 27, 2016

42

System.out.println(

Feb 27, 2016

Feb 27, 2016

43

" Ціле число: " + 10 +

44

" Число з рухомою комою подвійної точности: " + 3.14 +

45

" Булеве значення: " + true);

Feb 27, 2016

Feb 27, 2016

46

Feb 27, 2016

Feb 27, 2016

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;

Feb 27, 2016

Feb 27, 2016

63

// Оголошення декількох змінних одного типу <тип> <ім’я1>, <ім’я2>, <ім’я3>

Feb 27, 2016

Feb 27, 2016

64

int fooInt1, fooInt2, fooInt3;

65

66

/*

67

* Ініціалізація змінних

68

*/

69

Feb 27, 2016

Feb 27, 2016

70

// Ініціалізація змінної з використанням формату <тип> <ім’я> = <значення>

Feb 27, 2016

Feb 27, 2016

71

int fooInt = 1;

Feb 27, 2016

Feb 27, 2016

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

79

// Байт — 8-бітне ціле число зі знаком

Feb 27, 2016

Feb 27, 2016

80

// (-128 <= byte <= 127)

81

byte fooByte = 100;

82

Feb 27, 2016

Feb 27, 2016

83

// Short — 16-бітне ціле число зі знаком

84

// (-32 768 <= short <= 32 767)

Feb 27, 2016

Feb 27, 2016

85

short fooShort = 10000;

86

Feb 27, 2016

Feb 27, 2016

87

// Integer — 32-бітне ціле число зі знаком

88

// (-2 147 483 648 <= int <= 2 147 483 647)

Feb 27, 2016

Feb 27, 2016

89

int fooInt = 1;

90

Feb 27, 2016

Feb 27, 2016

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

Jul 27, 2018

Jul 27, 2018

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;

Feb 27, 2016

Feb 27, 2016

102

// f або F використовується для позначення того, що змінна має тип float;

Feb 27, 2016

Feb 27, 2016

103

// інакше трактується як double.

104

Jul 27, 2018

Jul 27, 2018

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

109

// Boolean — true & false (істина чи хиба)

Feb 27, 2016

Feb 27, 2016

110

boolean fooBoolean = true;

111

boolean barBoolean = false;

112

Feb 27, 2016

Feb 27, 2016

113

// Char — 16-бітний символ Unicode

Feb 27, 2016

Feb 27, 2016

114

char fooChar = 'A';

115

Feb 27, 2016

Feb 27, 2016

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

//

Feb 27, 2016

Feb 27, 2016

125

// BigInteger є типом даних, який дає можливість розробнику виконувати операції

Feb 27, 2016

Feb 27, 2016

126

// з цілими числами, розрядність яких більша за 64 біти. Числа зберігаються у масиві

Feb 27, 2016

Feb 27, 2016

127

// байтів, операції над ними виконуються функціями, які мають клас BigInteger

Feb 27, 2016

Feb 27, 2016

128

//

129

// BigInteger можна ініціалізувати, використовуючи масив байтів чи рядок.

Jul 27, 2018

Jul 27, 2018

130

Feb 27, 2016

Feb 27, 2016

131

BigInteger fooBigInteger = new BigInteger(fooByteArray);

132

133

Feb 27, 2016

Feb 27, 2016

134

// BigDecimal — Незмінні знакові дробові числа довільної точності

Feb 27, 2016

Feb 27, 2016

135

//

Jul 27, 2018

Jul 27, 2018

136

// BigDecimal складається з двох частин: цілого числа довільної точності

Feb 27, 2016

Feb 27, 2016

137

// з немасштабованим значенням та 32-бітного масштабованого цілого числа

138

//

Feb 27, 2016

Feb 27, 2016

139

// BigDecimal дозволяє розробникам контролювати десяткове округлення.

140

// Рекомендовано використовувати BigDecimal зі значеннями валют

Feb 27, 2016

Feb 27, 2016

141

// і там, де необхідна точність дробових обчислень.

142

//

Feb 27, 2016

Feb 27, 2016

143

// BigDecimal може бути ініціалізований типами даних int, long, double або String

Feb 27, 2016

Feb 27, 2016

144

// чи немасштабованим значенням (BigInteger) і масштабованим значенням (int).

145

146

BigDecimal fooBigDecimal = new BigDecimal(fooBigInteger, fooInt);

Jul 27, 2018

Jul 27, 2018

147

Feb 27, 2016

Feb 27, 2016

148

// Для дотримання заданої точності рекомендується використовувати

Jul 27, 2018

Jul 27, 2018

149

// конструктор, який приймає String

150

Feb 27, 2016

Feb 27, 2016

151

BigDecimal tenCents = new BigDecimal("0.1");

152

153

154

// Рядки

155

String fooString = "Це мій рядок!";

156

Feb 27, 2016

Feb 27, 2016

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

// Наведений формат ілюструє ініціалізацію масивів

Feb 27, 2016

Feb 27, 2016

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

179

// Індексація масиву — доступ за елементами

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

// Додатково

Feb 27, 2016

Feb 27, 2016

187

// ArrayLists — Схожі на масив, але мають більший функціонал та змінний розмір.

188

// LinkedLists — Реалізація двозв’язного списку. Всі операції

Feb 27, 2016

Feb 27, 2016

189

// виконуються так, як очікується від

Feb 27, 2016

Feb 27, 2016

190

// двозв’язного списку.

191

// Maps — Множина об’єктів, які пов’язують ключ зі значенням. Map є

Feb 27, 2016

Feb 27, 2016

192

// інтерфейсом, тому не може бути успадкований.

Feb 27, 2016

Feb 27, 2016

193

// Типи ключів і значень, які зберігаються в Map, мають

Feb 27, 2016

Feb 27, 2016

194

// вказуватись у класі, який його реалізує.

Feb 27, 2016

Feb 27, 2016

195

// Ключ не може повторюватись і пов’язаний лише з одним значенням

196

// HashMaps — Цей клас використовує хеш-таблицю для реалізації інтерфейсу Map.

Feb 27, 2016

Feb 27, 2016

197

// Це дозволяє виконувати певні операції,

Feb 27, 2016

Feb 27, 2016

198

// такі, як отримання та вставка елемента,

199

// залишаючись постійними навіть для великої кількості елементів.

Feb 27, 2016

Feb 27, 2016

200

201

///////////////////////////////////////

Feb 27, 2016

Feb 27, 2016

202

// Оператори

Feb 27, 2016

Feb 27, 2016

203

///////////////////////////////////////

Feb 27, 2016

Feb 27, 2016

204

System.out.println("\n->Оператори");

Feb 27, 2016

Feb 27, 2016

205

Feb 27, 2016

Feb 27, 2016

206

int i1 = 1, i2 = 2; // Коротка форма присвоєння

Feb 27, 2016

Feb 27, 2016

207

Feb 27, 2016

Feb 27, 2016

208

// Арифметичні операції виконуються очевидним способом

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

Feb 27, 2016

Feb 27, 2016

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

215

// Ділення з остачею

Feb 27, 2016

Feb 27, 2016

216

System.out.println("11%3 = "+(11 % 3)); // => 2

217

Feb 27, 2016

Feb 27, 2016

218

// Оператори порівняння

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

226

// Логічні оператори

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

231

// Бітові оператори!

Feb 27, 2016

Feb 27, 2016

232

/*

Feb 27, 2016

Feb 27, 2016

233

~ Унарне бітове доповнення

234

<< Знаковий зсув уліво

235

>> Знаковий/Арифметичний зсув управо

236

>>> Беззнаковий/Логічний зсув управо

237

& Бітове І

238

^ Бітови виключне АБО

239

| Бітове АБО

Feb 27, 2016

Feb 27, 2016

240

*/

241

Feb 27, 2016

Feb 27, 2016

242

// Інкремент

Feb 27, 2016

Feb 27, 2016

243

int i = 0;

Feb 27, 2016

Feb 27, 2016

244

System.out.println("\n->Інкремент/Декремент");

245

// Оператори ++ і -- здійснюють інкремент та декремент ретроспективно.

246

// Якщо вони розташовані перед змінною, операція виконається перед поверненням;

Feb 27, 2016

Feb 27, 2016

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

254

// Керуючі конструкції

Feb 27, 2016

Feb 27, 2016

255

///////////////////////////////////////

Feb 27, 2016

Feb 27, 2016

256

System.out.println("\n->Керуючі конструкції");

Feb 27, 2016

Feb 27, 2016

257

Feb 27, 2016

Feb 27, 2016

258

// Оператор if використовується так само, як у мові C

Feb 27, 2016

Feb 27, 2016

259

int j = 10;

260

if (j == 10) {

Feb 27, 2016

Feb 27, 2016

261

System.out.println("Це надрукується");

Feb 27, 2016

Feb 27, 2016

262

} else if (j > 10) {

Feb 27, 2016

Feb 27, 2016

263

System.out.println("А це — ні");

Feb 27, 2016

Feb 27, 2016

264

} else {

Feb 27, 2016

Feb 27, 2016

265

System.out.println("Це — також ні");

Feb 27, 2016

Feb 27, 2016

266

}

267

Feb 27, 2016

Feb 27, 2016

268

// Цикл з передумовою While

Feb 27, 2016

Feb 27, 2016

269

int fooWhile = 0;

270

while(fooWhile < 100) {

271

System.out.println(fooWhile);

Feb 27, 2016

Feb 27, 2016

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

278

// Цикл з післяумовою Do While

Feb 27, 2016

Feb 27, 2016

279

int fooDoWhile = 0;

280

do {

281

System.out.println(fooDoWhile);

Feb 27, 2016

Feb 27, 2016

282

// Інкремент лічильника

283

// Виконається 99 разів, fooDoWhile 0->99

Feb 27, 2016

Feb 27, 2016

284

fooDoWhile++;

285

} while(fooDoWhile < 100);

Feb 27, 2016

Feb 27, 2016

286

System.out.println("Значення fooDoWhile: " + fooDoWhile);

Feb 27, 2016

Feb 27, 2016

287

Feb 27, 2016

Feb 27, 2016

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

292

// Виконається 10 разів, fooFor 0->9

Feb 27, 2016

Feb 27, 2016

293

}

Feb 27, 2016

Feb 27, 2016

294

System.out.println("Значення fooFor: " + fooFor);

Jul 27, 2018

Jul 27, 2018

295

Feb 27, 2016

Feb 27, 2016

296

// Вихід із вкладеного циклу через мітку

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

302

// вихід із зовнішнього циклу, а не лише внутрішнього

Feb 27, 2016

Feb 27, 2016

303

}

304

}

305

}

Jul 27, 2018

Jul 27, 2018

306

Feb 27, 2016

Feb 27, 2016

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

313

// Повторюється 9 разів та друкує числа від 1 до 9 на нових рядках

Feb 27, 2016

Feb 27, 2016

314

}

315

Feb 27, 2016

Feb 27, 2016

316

// Оператор вибору Switch Case

317

// Оператор вибору працює з типами даних byte, short, char, int.

Jul 27, 2018

Jul 27, 2018

318

// Також працює з переліками Enum,

Feb 27, 2016

Feb 27, 2016

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

324

case 1: monthString = "Січень";

Feb 27, 2016

Feb 27, 2016

325

break;

Feb 27, 2016

Feb 27, 2016

326

case 2: monthString = "Лютий";

Feb 27, 2016

Feb 27, 2016

327

break;

Feb 27, 2016

Feb 27, 2016

328

case 3: monthString = "Березень";

Feb 27, 2016

Feb 27, 2016

329

break;

Feb 27, 2016

Feb 27, 2016

330

default: monthString = "Інший місяць";

Feb 27, 2016

Feb 27, 2016

331

break;

332

}

Feb 27, 2016

Feb 27, 2016

333

System.out.println("Результат Switch Case: " + monthString);

Jul 27, 2018

Jul 27, 2018

334

Feb 27, 2016

Feb 27, 2016

335

// Починаючи з Java 7 і далі, вибір рядкових змінних здійснюється так:

Feb 27, 2016

Feb 27, 2016

336

String myAnswer = "можливо";

Feb 27, 2016

Feb 27, 2016

337

switch(myAnswer) {

Feb 27, 2016

Feb 27, 2016

338

case "так":

339

System.out.println("Ви відповіли «Так».");

Feb 27, 2016

Feb 27, 2016

340

break;

Feb 27, 2016

Feb 27, 2016

341

case "ні":

342

System.out.println("Ви відповіли «ні».");

Feb 27, 2016

Feb 27, 2016

343

break;

Feb 27, 2016

Feb 27, 2016

344

case "можливо":

345

System.out.println("Ви відповіли «Можливо».");

Feb 27, 2016

Feb 27, 2016

346

break;

347

default:

Feb 27, 2016

Feb 27, 2016

348

System.out.println("Ви відповіли «" + myAnswer + "»");

Feb 27, 2016

Feb 27, 2016

349

break;

350

}

351

Feb 27, 2016

Feb 27, 2016

352

// Тернарний оператор вибору

Feb 27, 2016

Feb 27, 2016

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

358

System.out.println(bar); // Надрукується А, бо умова вірна

Feb 27, 2016

Feb 27, 2016

359

360

361

////////////////////////////////////////

Feb 27, 2016

Feb 27, 2016

362

// Перетворення типів

Feb 27, 2016

Feb 27, 2016

363

////////////////////////////////////////

364

Feb 27, 2016

Feb 27, 2016

365

// Перетворення String на Integer

366

Integer.parseInt("123");//поверне числову версію рядка "123"

Feb 27, 2016

Feb 27, 2016

367

Feb 27, 2016

Feb 27, 2016

368

// Перетворення Integer на String

369

Integer.toString(123);//повертає рядкову версію 123

Feb 27, 2016

Feb 27, 2016

370

Feb 27, 2016

Feb 27, 2016

371

// Для інших перетворень є наступні класи:

Feb 27, 2016

Feb 27, 2016

372

// Double

373

// Long

374

// String

375

Feb 27, 2016

Feb 27, 2016

376

// Приведення типів

Feb 27, 2016

Feb 27, 2016

377

// Тут можна прочитати про приведення об’єктів (англ.):

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

382

// Класи та функції

Feb 27, 2016

Feb 27, 2016

383

///////////////////////////////////////

384

Feb 27, 2016

Feb 27, 2016

385

System.out.println("\n->Класи та функції");

Feb 27, 2016

Feb 27, 2016

386

Feb 27, 2016

Feb 27, 2016

387

// (Клас Bicycle наведений нижче)

Feb 27, 2016

Feb 27, 2016

388

Feb 27, 2016

Feb 27, 2016

389

// Новий об’єкт класу

Feb 27, 2016

Feb 27, 2016

390

Bicycle trek = new Bicycle();

391

Feb 27, 2016

Feb 27, 2016

392

// Виклик методу об’єкта

Feb 27, 2016

Feb 27, 2016

393

trek.speedUp(3); // Постійно використовуються методи з назвами set і get

Feb 27, 2016

Feb 27, 2016

394

trek.setCadence(100);

395

Feb 27, 2016

Feb 27, 2016

396

// toString повертає рядкове представлення об’єкту.

397

System.out.println("Інформація про об’єкт trek: " + trek.toString());

Jul 27, 2018

Jul 27, 2018

398

Feb 27, 2016

Feb 27, 2016

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

409

// Але є інший спосіб — ініціалізація з подвійними фігурними дужками.

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

Jan 23, 2026

Jan 23, 2026

417

// Перші фігурні дужки створюють анонімний внутрішній клас, а другі —

418

// блок ініціалізації екземпляра. Однак це вважається антипаттерном:

419

// створюється новий клас для кожного випадку, що збільшує витрати

420

// пам'яті (Metaspace) і може спричинити витік пам'яті.

421

// Для Java 9+ використовуйте Set.of().

Feb 27, 2016

Feb 27, 2016

422

Feb 27, 2016

Feb 27, 2016

423

} // Кінець методу main

424

} // Кінець класу LearnJava

Feb 27, 2016

Feb 27, 2016

425

426

Feb 27, 2016

Feb 27, 2016

427

// У .java-файл можна додавати інші, не public класи зовнішнього рівня,

Feb 27, 2016

Feb 27, 2016

428

// але це не є хорошою практикою. Розміщуйте класи в окремих файлах.

Feb 27, 2016

Feb 27, 2016

429

430

Feb 27, 2016

Feb 27, 2016

431

// Синтаксис оголошення класу:

Feb 27, 2016

Feb 27, 2016

432

// <public/private/protected> class <ім’я класу> {

Feb 27, 2016

Feb 27, 2016

433

// // поля, конструктори, функції та ін.

434

// // у Java функції називаються методами.

Feb 27, 2016

Feb 27, 2016

435

// }

436

437

class Bicycle {

438

Feb 27, 2016

Feb 27, 2016

439

// Поля (змінні) класу Bicycle

440

public int cadence; // Public: доступно звідусіль

441

private int speed; // Private: доступно лише у межах класу

Feb 27, 2016

Feb 27, 2016

442

protected int gear; // Protected: доступно лише класові та його нащадкам

443

String name; // за замовчанням: доступно у даному пакеті

Feb 27, 2016

Feb 27, 2016

444

Feb 27, 2016

Feb 27, 2016

445

static String className; // статична змінна класу

Feb 27, 2016

Feb 27, 2016

446

Feb 27, 2016

Feb 27, 2016

447

// статичний блок

448

// Java не має статичних конструкторів, але

449

// має статичний блок ініціалізації змінних класу

450

// Цей блок виконується при завантаженні класу.

Feb 27, 2016

Feb 27, 2016

451

static {

452

className = "Bicycle";

453

}

454

Feb 27, 2016

Feb 27, 2016

455

// Конструктори є способом створення класу

Feb 27, 2016

Feb 27, 2016

456

// Оце — конструктор

Feb 27, 2016

Feb 27, 2016

457

public Bicycle() {

Feb 27, 2016

Feb 27, 2016

458

// Можна викликати інший конструктор:

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

466

// Цей конструктор приймає аргументи

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

Feb 27, 2016

Feb 27, 2016

475

// Синтаксис методу:

Feb 27, 2016

Feb 27, 2016

476

// <public/private/protected> <тип повернутого значення> <ім’я методу>(<аргументи>)

Feb 27, 2016

Feb 27, 2016

477

Feb 27, 2016

Feb 27, 2016

478

// Java-класи часто мають методи для отримання та встановлення змінних

Feb 27, 2016

Feb 27, 2016

479

Feb 27, 2016

Feb 27, 2016

480

// Синтаксис оголошення методу:

Feb 27, 2016

Feb 27, 2016

481

// <модифікатор доступу> <тип повернутого значення> <ім’я методу>(<аргументи>)

Feb 27, 2016

Feb 27, 2016

482

public int getCadence() {

483

return cadence;

484

}

485

Feb 27, 2016

Feb 27, 2016

486

// void-методи не повертають значень

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

Feb 27, 2016

Feb 27, 2016

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

517

} // кінець класу Bicycle

Feb 27, 2016

Feb 27, 2016

518

Feb 27, 2016

Feb 27, 2016

519

// PennyFarthing є розширенням (нащадком) класу Bicycle

Feb 27, 2016

Feb 27, 2016

520

class PennyFarthing extends Bicycle {

Feb 27, 2016

Feb 27, 2016

521

// (Penny Farthings мають велике переднє колесо.

522

// Вони не мають передач.)

Feb 27, 2016

Feb 27, 2016

523

524

public PennyFarthing(int startCadence, int startSpeed){

Feb 27, 2016

Feb 27, 2016

525

// Виклик батьківського конструктора через super

Feb 27, 2016

Feb 27, 2016

526

super(startCadence, startSpeed, 0, "PennyFarthing");

527

}

528

Feb 27, 2016

Feb 27, 2016

529

// Перевизначений метод має бути відмічений аннотацією, яка починається зі знака @.

Feb 27, 2016

Feb 27, 2016

530

// Для ознайомлення з аннотаціями перейдіть за посиланням

Feb 27, 2016

Feb 27, 2016

531

// http://docs.oracle.com/javase/tutorial/java/annotations/

Feb 27, 2016

Feb 27, 2016

532

@Override

533

public void setGear(int gear) {

534

gear = 0;

535

}

536

}

537

Feb 27, 2016

Feb 27, 2016

538

// Інтерфейси

539

// Синтаксис оголошення інтерфейсів

Feb 27, 2016

Feb 27, 2016

540

// <рівень доступу> interface <ім’я інтерфейсу> extends <батьківський інтерфейс> {

541

// // Константи

Feb 27, 2016

Feb 27, 2016

542

// // Оголошення методів

Feb 27, 2016

Feb 27, 2016

543

// }

544

Feb 27, 2016

Feb 27, 2016

545

//Приклад — їжа (Food):

Feb 27, 2016

Feb 27, 2016

546

public interface Edible {

Feb 27, 2016

Feb 27, 2016

547

public void eat(); // Будь-які класи, що реалізують цей інтерфейс,

Feb 27, 2016

Feb 27, 2016

548

// повинні реалізувати цей метод.

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

556

// Можна створити клас, що реалізує обидва інтерфейси.

Feb 27, 2016

Feb 27, 2016

557

public class Fruit implements Edible, Digestible {

Jul 27, 2018

Jul 27, 2018

558

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

Feb 27, 2016

Feb 27, 2016

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

585

// Абстрактні класи

Feb 27, 2016

Feb 27, 2016

586

Feb 27, 2016

Feb 27, 2016

587

// Синтаксис оголошення абстрактних класів:

Feb 27, 2016

Feb 27, 2016

588

// <рівень доступу> abstract <ім’я класу> extends <батьківський абстрактний клас> {

Feb 27, 2016

Feb 27, 2016

589

// // Константи і змінні

590

// // Оголошення методів

Feb 27, 2016

Feb 27, 2016

591

// }

592

Feb 27, 2016

Feb 27, 2016

593

// Позначення класу як абстрактного означає, що оголошені у ньому методи мають

594

// бути реалізовані у дочірніх класах. Подібно до інтерфейсів, не можна створити екземпляри

Feb 27, 2016

Feb 27, 2016

595

// абстракних класів, але їх можна успадковувати. Нащадок зобов’язаний реалізувати всі абстрактні

Oct 18, 2018

Oct 18, 2018

596

// методи. На відміну від інтерфейсів, абстрактні класи можуть мати як визначені,

Feb 27, 2016

Feb 27, 2016

597

// так і абстрактні методи. Методи в інтерфейсах не мають тіла,

Feb 27, 2016

Feb 27, 2016

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

605

// Метод може мати тіло

Feb 27, 2016

Feb 27, 2016

606

public void eat()

607

{

Feb 27, 2016

Feb 27, 2016

608

System.out.println("Я тварина, і я їм.");

609

// Зауваження: є доступ до приватних змінних.

Feb 27, 2016

Feb 27, 2016

610

age = 30;

611

}

612

Feb 27, 2016

Feb 27, 2016

613

// Ініціалізація не потрібна

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

621

// Абстрактні класи МОЖУТЬ мати метод «main».

Feb 27, 2016

Feb 27, 2016

622

public static void main(String[] args)

623

{

Feb 27, 2016

Feb 27, 2016

624

System.out.println("Я абстрактний");

Feb 27, 2016

Feb 27, 2016

625

}

626

}

627

628

class Dog extends Animal

629

{

Feb 27, 2016

Feb 27, 2016

630

// Слід помічати перевизначення абстрактних методів

Feb 27, 2016

Feb 27, 2016

631

@Override

632

public void makeSound()

633

{

Feb 27, 2016

Feb 27, 2016

634

System.out.println("Гав!");

Feb 27, 2016

Feb 27, 2016

635

// age = 30; ==> ПОМИЛКА! age є private для Animal

Feb 27, 2016

Feb 27, 2016

636

}

637

Feb 27, 2016

Feb 27, 2016

638

// Зауваження: Буде помилка, якщо використати аннотацію

Feb 27, 2016

Feb 27, 2016

639

// @Override тут, так як у java не можна

640

// перевизначати статичні методи.

Feb 27, 2016

Feb 27, 2016

641

// Те, що тут відбувається, називається приховування методів.

Feb 27, 2016

Feb 27, 2016

642

// Більш детально: http://stackoverflow.com/questions/16313649/

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

652

// Фінальні класи

Feb 27, 2016

Feb 27, 2016

653

Feb 27, 2016

Feb 27, 2016

654

// Синтаксис оголошення фінальних класів

655

// <рівень доступу> final <ім’я класу> {

Feb 27, 2016

Feb 27, 2016

656

// // Константи і змінні

657

// // Оголошення методів

Feb 27, 2016

Feb 27, 2016

658

// }

659

Feb 27, 2016

Feb 27, 2016

660

// Фінальні класи не можуть мати нащадків, також самі вони є останніми нащадками.

661

// Фінальні класи є протилежністю абстрактних у цьому плані.

Feb 27, 2016

Feb 27, 2016

662

Feb 27, 2016

Feb 27, 2016

663

public final class SaberToothedCat extends Animal

664

{

Feb 27, 2016

Feb 27, 2016

665

// Перевизначення методу

Feb 27, 2016

Feb 27, 2016

666

@Override

667

public void makeSound()

668

{

Feb 27, 2016

Feb 27, 2016

669

System.out.println("Гррр!");

Feb 27, 2016

Feb 27, 2016

670

}

671

}

672

Feb 27, 2016

Feb 27, 2016

673

// Фінальні методи

Feb 27, 2016

Feb 27, 2016

674

public abstract class Mammal()

675

{

Feb 27, 2016

Feb 27, 2016

676

// Синтаксис фінальних методів:

677

// <модифікатор доступу> final <тип повернутого значення> <ім’я функції>(<аргументи>)

Feb 27, 2016

Feb 27, 2016

678

Feb 27, 2016

Feb 27, 2016

679

// Фінальні методи не можуть бути перевизначені класом-нащадком,

Feb 27, 2016

Feb 27, 2016

680

// вони є остаточною реалізацією методу.

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

688

// Тип Enum (перелік)

Feb 27, 2016

Feb 27, 2016

689

//

Feb 27, 2016

Feb 27, 2016

690

// Enum є спеціальним типом даних, який дозволяє змінним бути певною множиною

691

// визначених констант. Змінна має відповідати одному зі значень, що

Feb 27, 2016

Feb 27, 2016

692

// заздалегідь визначені для неї. Оскільки це константи, імена типів полів у enum

693

// задаються у верхньому регістрі. Тип «перелік» у Java задається за допомогою

694

// ключового слова enum. Наприклад, перелік днів тижня можна задати так:

Feb 27, 2016

Feb 27, 2016

695

696

public enum Day {

697

SUNDAY, MONDAY, TUESDAY, WEDNESDAY,

Jul 27, 2018

Jul 27, 2018

698

THURSDAY, FRIDAY, SATURDAY

Feb 27, 2016

Feb 27, 2016

699

}

700

Feb 27, 2016

Feb 27, 2016

701

// Перелік Day можна використовувати так:

Feb 27, 2016

Feb 27, 2016

702

703

public class EnumTest {

Jul 27, 2018

Jul 27, 2018

704

Feb 27, 2016

Feb 27, 2016

705

// Змінна того же типу, що й перелік

Feb 27, 2016

Feb 27, 2016

706

Day day;

Jul 27, 2018

Jul 27, 2018

707

Feb 27, 2016

Feb 27, 2016

708

public EnumTest(Day day) {

709

this.day = day;

710

}

Jul 27, 2018

Jul 27, 2018

711

Feb 27, 2016

Feb 27, 2016

712

public void tellItLikeItIs() {

713

switch (day) {

714

case MONDAY:

Jul 27, 2018

Jul 27, 2018

715

System.out.println("Понеділки важкі.");

Feb 27, 2016

Feb 27, 2016

716

break;

Jul 27, 2018

Jul 27, 2018

717

Feb 27, 2016

Feb 27, 2016

718

case FRIDAY:

Feb 27, 2016

Feb 27, 2016

719

System.out.println("П’ятниці краще.");

Feb 27, 2016

Feb 27, 2016

720

break;

Jul 27, 2018

Jul 27, 2018

721

722

case SATURDAY:

Feb 27, 2016

Feb 27, 2016

723

case SUNDAY:

Feb 27, 2016

Feb 27, 2016

724

System.out.println("Вихідні найліпші.");

Feb 27, 2016

Feb 27, 2016

725

break;

Jul 27, 2018

Jul 27, 2018

726

Feb 27, 2016

Feb 27, 2016

727

default:

Feb 27, 2016

Feb 27, 2016

728

System.out.println("Середина тижня так собі.");

Feb 27, 2016

Feb 27, 2016

729

break;

730

}

731

}

Jul 27, 2018

Jul 27, 2018

732

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

735

firstDay.tellItLikeItIs(); // => Понеділки важкі.

Feb 27, 2016

Feb 27, 2016

736

EnumTest thirdDay = new EnumTest(Day.WEDNESDAY);

Feb 27, 2016

Feb 27, 2016

737

thirdDay.tellItLikeItIs(); // => Середина тижня так собі.

Feb 27, 2016

Feb 27, 2016

738

}

739

}

740

Jul 27, 2018

Jul 27, 2018

741

// Переліки набагато потужніші, ніж тут показано.

Feb 27, 2016

Feb 27, 2016

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

746

## Додатково для читання

Feb 27, 2016

Feb 27, 2016

747

Feb 27, 2016

Feb 27, 2016

748

Посилання, наведені нижче, дозволяють тільки зрозуміти тему. Щоб знайти конкретні приклади, використовуйте Ґуґл.

Feb 27, 2016

Feb 27, 2016

749

Feb 27, 2016

Feb 27, 2016

750

**Офіційні посібники Oracle**:

Feb 27, 2016

Feb 27, 2016

751

Feb 27, 2016

Feb 27, 2016

752

* [Посібник Java від Sun / Oracle](http://docs.oracle.com/javase/tutorial/index.html)

Feb 27, 2016

Feb 27, 2016

753

Feb 27, 2016

Feb 27, 2016

754

* [Java — модифікатори доступу](http://docs.oracle.com/javase/tutorial/java/javaOO/accesscontrol.html)

Feb 27, 2016

Feb 27, 2016

755

Feb 27, 2016

Feb 27, 2016

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

Feb 27, 2016

Feb 27, 2016

761

* [Виключення](http://docs.oracle.com/javase/tutorial/essential/exceptions/index.html)

Feb 27, 2016

Feb 27, 2016

762

Feb 27, 2016

Feb 27, 2016

763

* [Інтерфейси](http://docs.oracle.com/javase/tutorial/java/IandI/createinterface.html)

Feb 27, 2016

Feb 27, 2016

764

Feb 27, 2016

Feb 27, 2016

765

* [параметризація](http://docs.oracle.com/javase/tutorial/java/generics/index.html)

Feb 27, 2016

Feb 27, 2016

766

Feb 27, 2016

Feb 27, 2016

767

* [Стиль коду у Java](http://www.oracle.com/technetwork/java/codeconvtoc-136057.html)

Feb 27, 2016

Feb 27, 2016

768

Feb 27, 2016

Feb 27, 2016

769

**Online-практика та посібники**

Feb 27, 2016

Feb 27, 2016

770

771

* [Codingbat.com](http://codingbat.com/java)

772

Dec 3, 2024

Dec 3, 2024

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

777

**Книжки**:

Feb 27, 2016

Feb 27, 2016

778

779

* [Head First Java](http://www.headfirstlabs.com/books/hfjava/)

780

May 13, 2024

May 13, 2024

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)

Read the original on github.com ↗