Вы находитесь на странице: 1из 56

Java.

Basics

Sergey Dovgalets
Java.
Java — сильно типизированный объектно-
ориентированный язык программирования,
разработанный компанией Sun Microsystems (в
последующем приобретённой
компанией Oracle). Приложения Java
обычно транслируются в специальный байт-код,
поэтому они могут работать на любой
компьютерной архитектуре, с
помощью виртуальной Java-машины.
Дата официального выпуска — 23 мая 1995 года.
Википедия
COMPILER VS INTERPRETER
Conversion from high-level source code to machine code
JDK, JRE and JVM
• JVM (Java Virtual Machine)
- исполняет байт-код Java.
• JRE (Java Runtime Environment)
- минимальная реализация
виртуальной машины, необходимая
для исполнения Java -приложений.
• JDK (Java Development Kit) -
комплект разработчика
приложений на языке Java,
включающий в себя компилятор,
стандартные библиотеки классов
Java, примеры, документацию,
различные утилиты и
исполнительную систему JRE. 
Платформа Java

>javac Hello Hello.java -> Hello.class


>java Hello Hello.class -> “Hello, World!”
Java. Аргументы командной строки
class CommandLine {
public static void main(String args[]) {
for(int i=0; args.length; i++)
System.out.println("args[" + i + "]: " + args[i]);
}
}
>javac CommandLine
>java CommandLine this is a test 100 -1 args[0]: this 
args[1]: is 
args[2]: a 
args[3]: test
args[4]: 100 
args[5]: -1
Java. Reserved key words
abstract continue for new switch
assert default goto* package synchronized
boolean do If private this
break double implements protected throw
byte else import public throws
case enum instanceof return transient
catch extends int short try
char final interface static void
class finally long strictfp volatile
const float native super while

Литералы: true, false, null var – Java 10

*Edsger Wybe Dijkstra. Go To Statement Considered Harmful// Communications of


the ACM, Vol. 11, No. 3, March 1968, pp. 147-148.
Типизация данных
Тип: характеристика набора данных, которая определяет: 
• диапазон возможных значений данных из набора; 
• допустимые операции, которые можно выполнять над этими
 значениями; 
• способ хранения этих значений в памяти. 

Типизация: свойство языка программирования различать типы


данных.

Переменная: поименованная, либо адресуемая иным


способом область памяти, предназначенная для хранения
данных указанного типа.
Типизация данных
Система типов данных языка — это система, которая ставит в соответствие каждому
значению, вычисленному в процессе выполнения программы, свой тип данных.

Основные функции систем типов данных:


• обеспечение безопасности: системы типов данных предотвращают так
называемые «ошибки типов», проверяя, что каждая операция получает
аргументы именно тех типов, для которых она имеет смысл, например,
математические операции не получают аргументов типа строка или массив;
• оптимизация: типы, сопоставленные значениям, могут использоваться
компилятором для оптимизации их обработки, например, для выбора способа их
хранения и алгоритма их обработки;
• документация: использование определенных типов данных может подчеркивать
намерения программиста;
• абстракция: использование типов данных высокого уровня позволяет
программисту думать о значениях как о высокоуровневых сущностях, а не как о
наборе битов.
Типизация данных.

Вид Пример Языки


Динамическая (Dynamic) var data = "string1"; Python
(типы выясняются во время выполнения data = 1; JavaScript
программы) Ruby
Статическая (Static) String data = "string1"; Java
(конечные типы устанавливаются на этапе data = 1; // Error! C
компиляции) C#
Сильная (Strongly) 1 + "string1“ //Error! Java
(не позволяет смешивать в выражениях Python
различные типы) Haskell, Lisp
Слабая (Weakly) 1 + "string1" C, JavaScript,
(выполняет неявные преобразования Visual Basic, PHP
автоматически )
Типизация данных.
Java –реализует сильную статическую типизацию.

Преимущества:
• Надежность – предоставляется возможность выявлять потенциальные ошибки
уже на этапе компиляции. Как следствие - ускорение разработки при поддержке
IDE.
• Скорость – проверки типов осуществляются один раз. Благодаря отсутствию
скрытых преобразований программы работают быстрее.
• Ясность – все объявления и преобразования реализуются вручную. Программист
точно знает результат работы его программы, и она легче читается.

В Java 10 введено ключевое слово var, что избавляет от необходимости указывать


тип локальной переменной явно:
• var data = 10;
• var list = new ArrayList<String>();
Java. Типы данных
Примитивные (максимальное быстродействие):
область объем структура класс-
обозначение диапазон
значения памяти, байт в битах оболочка

byte 1 -27… 27-1 Byte


старший бит
short 2 -215… 215-1 определяет Short
целые
int 4 -231 … 231-1 знак: Integer
0 (+)/ 1 (-)
long 8 -263… 263-1 Long

float 4 -3.41038… 3.41038 мантисса: 23 Float


вещественные
-1.7910308 …
double 8 мантисса: 52 Double
1.7910308
char
символьный 2 0 … 216-1 Character

логический boolean не менее 1 false, true - Boolean


пустой void Void
Java. Типы данных
Примитивные. Автоматическое преобразование:

byte short int long char float double


byte ОК ОК ОК ОК X ОК ОК
short X ОК ОК ОК X ОК ОК
int X X ОК ОК X ОК ОК
long X X X ОК X ОК ОК
char X X ОК ОК ОК ОК ОК
float X X X X X ОК ОК
double X X X X X X ОК
Java. Operators
группа унарные бинарные тернарные

Арифметические +, -, ++, -- +, -, /, *, %

Побитовые ~ &, |, ^, <<, >>, >>>


Переменная операция = выражение
Комбинированные
(присваивания) Операция: +, -, /, %, &, |, ^, <<, >>, >>>

Сравнения ==, !=, >, >=, <, <=

Логические ! &, |, ==, !=


short-circuit: &&, ||

Условная ?:

Преобразования (тип)
Java. Приоритет операций
Operator Associativity
[ ], ., (), (вызов метода) L -> R
!, ~, ++, --, +(унарный), -(унарный), (тип), new R -> L
*, /, % L -> R
+, - L -> R
>>, >>>, << L -> R
<, <=, > , >=, instanceof, ==, != L -> R
& L -> R
^ L -> R
| L -> R
&& L -> R
|| L -> R
?: R -> L
операция= =, +=, -=, *=, /=, %=, |=, ^=, <<=, >>=, >>>= R -> L
Java. Примеры операций
Выражение Результат
5/0 ArithmeticException
5%0
(0!=0) && (5/0>1) false
(0!=0) & (5/0>1) ArithmeticException
(5/0>1) && (0!=0)
"a=" + 10 + 0b10 + 010 a=1028
10 + 0X10 + "=a" 26=a
09 0b2 Compilation error!
int i = 3; 3
i = i++;
char c = ‘A’;
char c = 65; A
char c = \u0041’;
boolean b = true;
int x, y; Compilation error!
x = b ? y = 1 : y = 2;
Java. Примеры операций
Выражение Результат В классах-облочках
4.375e1 + " " + 0xA.Fp2 43.75 43.75
"a=" + 9. + 09. a=9.09.0
9.3 % 2.1 0.9
5 / 0. Infinity Double.POSITIVE_INFINITY
-5 / 0. -Infinity Double.NEGATIVE_INFINITY
(5. / -0.) < 0
(5 / 0.) > (5 / -0.) true
0 / -5. -0.0
(0 / -5.) == (0 / 5.) true
0 / 0.
5 % 0.
NaN Double.NaN
0 % 0.
Math.sqrt(-1)
(0 / 0.) == Math.sqrt(-1) false Double.isNaN(double v)
Java. Control Statements:
Тип оператора Оператор
Выбора: if (условие) { /*операторы*/}
if (условие) { /*операторы*/}
else { /*операторы*/ }
switch(выражение) {
case значение1:/*операторы*/
case значение2:/*операторы*/
default: /* операторы*/
}
Цикла: while (условие) { /*операторы*/ }
do { /*операторы*/ }
while (условие);
for(выражение1; условие; выражение2){
/*операторы*/
}
Java. Control Statements:
Тип оператора Оператор
Перехода: break;
break метка;
continue;
continue метка;
return;
return выражение;
System.exit(int status);
Runtime.getRuntime().exit(int status);
Java. Control Statements:
Scanner scanner = new Scanner(System.in);
Scanner scanner = new Scanner(System.in); int a = scanner.nextInt();
int a = scanner.nextInt(); int b = 0;
int b = scanner.nextInt(); for (;b == 0;){
if (b != 0){ b = scanner.nextInt();
System.out.println(a / b); }
} System.out.println(a / b);
}

Scanner scanner = new Scanner(System.in); Scanner scanner = new Scanner(System.in);


int a = scanner.nextInt(); int a = scanner.nextInt();
int b = 0; int b;
while (b == 0){ do {
b = scanner.nextInt(); b = scanner.nextInt();
} }while (b == 0);
System.out.println(a / b); System.out.println(a / b);
}
Java. Control Statements:
boolean t = true;
first:
{
second: outer:
{ for (int i = 0; i < 10; i++) {
third: for (int j = 0; j < 10; j++) {
{ if (j > i) {
System.out.println("Before the break."); System.out.println();
if (t) { continue outer;
break second; }
} System.out.print(" " + (i * j));
System.out.println("This won't execute"); }
} }
System.out.println("This won't execute"); System.out.println();
}
System.out.println("This is after second block.");
}
Java. Control Statements:
String[] colors = {"red", "yellow", "blue", "black", "orange", "white", "green"};

// Basic loop // foreach


for (int i = 0; i < colors.length; i++) { for (String color : colors) {
System.out.println(colors[i]); System.out.println(color);
} }

// Iterator with while loop


Iterator<String> it = Arrays.asList(colors).iterator();
while (it.hasNext()) {

Collection
System.out.println(it.next());
}

s
// Basic loop with iterator
for (Iterator<String> it = Arrays.asList(colors).iterator(); it.hasNext(); ) {
System.out.println(it.next());
}
Java. Control Statements:
String[] colors = {"red", "yellow", "blue", "black", "orange", "white", "green"};

// JDK 8 streaming example lambda expression


Arrays.stream(colors).forEach(color -> System.out.println(color));

// JDK 8 streaming example method reference


Arrays.stream(colors).forEach(System.out::println);

Java 8
// JDK 8 for each
Arrays.asList(colors).forEach(System.out::println);

// JDK 8 for each with lambda


Arrays.asList(colors).forEach(color -> System.out.println(color));
Java. Arrays
Объявление и инициализация одномерного массива:
• int array[] = new int[10];
• int array[] = new int[] { 1, 2, 3 };
• int array[] = { 5, 10, 0, -5, 16, -2 };
• Object[] objects = {new Object(),new Object(),null};

for (int i = 0; i < array.length; i++)


array[i] = 5;

Object[] objects1 = objects;


Object[] objects2 = objects.clone();
System.out.println(objects == objects1); true
System.out.println(objects == objects2); false
Java. Arrays
Массивы являются объектами:

int[] array = new int[10];


class [I
System.out.println(array.getClass());
class java.lang.Object
System.out.println(array.getClass().getSuperclass());

System.out.println(new String[3].getClass()); class [Ljava.lang.String;


System.out.println(new String[3].getClass().getSuperclass()); class java.lang.Object

System.out.println(new Object[2].getClass()); class [Ljava.lang.Object;


System.out.println(new Object[2].getClass().getSuperclass()); class java.lang.Object

System.out.println(new Object().getClass()); class java.lang.Object


System.out.println(new Object().getClass().getSuperclass()); null
Java. Arrays
Объявление и инициализация двумерного массива:
• int[] array[] = new int[10][20];
• int array[][] = { {2,7,9}, {3,6,1}, {7,4,2} };
• int[][] array1 = new int[10][];
• int[][] array2 = new int[][20]; //Error!!!

String[][] strings = new String[3][4];


for(int i = 0; i< strings.length; i++){
for(int j = 0;j < strings[i].length; j++){
strings[i][j]="Str" + i + j + ("Str".length() + 2); Str005 Str015 Str025 Str035
System.out.print(strings[i][j]+" "); Str105 Str115 Str125 Str135
} Str205 Str215 Str225 Str235
System.out.println("");
}
Java. Arrays
Многомерные массивы являются массивами массивов (Jagged
Arrays):
mas
int[][] mas;
Random random = new Random();
mas = new int[random.nextInt(10)+1][]; 0,0 0,1 0,2
for (int i = 0; i < mas.length; i++){ 0
mas[i] = new int[random.nextInt(12) + 1]; 1
} 1,0 1,1
2
for (int i = 0; i < mas.length; i++){ 3
for (int j = 0; j < mas[i].length; j++){ 2,0 2,1 2,2
mas[i][j] = random.nextInt(100); mas[]
System.out.print(mas[i][j] + " ");
} 3,0
System.out.println(); mas[][]
}
Компьютер глазами программиста
Stack Stack
Data Bus
ALU Thread1 Thread2

Registers
Address Bus

Cach
Heap

e
FPU Control Bus
(Optional)
System Bus
CPU  Process virtual address space
Parameter Stack Memory Heap Space
Application Используется частями Используется всем процессом
Size Зависит от ОС Нет ограничений (Runtime.totalMemory())
Storage Примитивы и ссылки Объекты
Order FILO Техники управления памятью
Life Пока выполняется метод Пока выполняется процесс
Efficiency Быстрее Медленнее
Allocation/Deallocation Автоматически new, Garbage Collector
Компьютер глазами программиста
public static void main(String[] args) {
int a = 10; public static void print(int[] mas){
int[] m = new int[a]; for (int d: mas){
for (int i = 0; i < m.length; i++){ System.out.println(d);
m[i] = (int) (Math.random() * 10 - 5); }
} }
print(m);
d mas
}

Stack a
Registers + Cache

print()
m
ALU i
main()
System Bus Heap
new int[a]

CPU  Process virtual address space


Java. Class
Класс – инструмент создания типа данного,
объединяющего состояние (поля) и
поведение (методы) моделируемой
сущности предметной области.

Объект – экземпляр класса, отражающий


конкретные свойства (состояние и
поведение) моделируемой сущности.
Java. Class
Все классы неявно являются наследниками Object с
методами:
• public boolean equals(Object o);
• public int hashCode();
• public String toString();
• public Class getClass();
• protected Object clone();
• protected void finalize();
• + методы синхронизации потоков
Java. Class
package com.company;
public class Main {
static class MyClass{}

public static void main(String... args) {


MyClass my = new MyClass();

System.out.println(my.equals(new MyClass())); False


System.out.println(my.hashCode()); 21029277
System.out.println(my.toString()); com.company.Main$MyClass@140e19d
System.out.println(my.getClass()); class com.company.Main$MyClass
System.out.println(my.getClass().getSuperclass()); class java.lang.Object

}
}
Java. Структура класса
class СlassName{

static {…}
{…}
accessLevelModifier СlassName(…){…}
accessLevelModifier type method1(…){…}
accessLevelModifier type method2(…){…}
}

Access Levels
Modifier Class Package Subclass World
public Yes Yes Yes Yes
protected Yes Yes Yes No
no modifier Yes Yes No No
private Yes No No No
Java.
Порядок вызова блоков инициализации
public class MyClass { MyClass myClass = new MyClass();
static {
System.out.println("Static First");
}
{
System.out.println("Nonstatic First");
}
public MyClass(){
System.out.println("Constructor"); Output
}
{ Static First
System.out.println("Nonstatic Second"); Static Second
} Nonstatic First
static { Nonstatic Second
System.out.println("Static Second"); Constructor
}
}
Java. Поля класса
Поля класса отражают его состояние

Значения по умолчанию: Тип Начальная инициализация


byte, short, int, long 0
float, double 0.0
char ‘\u0000’
boolean false
Reference type null

public class MyClass {


public String name; System.out.println(new MyClass().getName());
public String getName(){
return name;
}
public String getSting(){
String n;
return n; //Error!!! Output
} null
}
Java. Поля класса
Способы инициализации полей класса:

Место Применимость Описание


инициализации
При объявлении поля Поля класса, Инициализация может быть произведена
поля объекта коротким выражением и доступен
контекст, необходимый для ее
проведения

Инициализационный Поля класса, Инициализационный код неудобно


блок поля объекта записывать одним выражением или,
например, нужна обработка
проверяемых исключений. В случае
объектов может применяться для
инициализации полей объектов
анонимных классов.

Конструктор поля объекта Для инициализации нужны параметры


конструктора
Метод (сеттер) поля объекта Позволяет менять значение поля
Java. Методы класса
Методы класса отражают его поведение

Сигнатура

Modifiers type methodName(parameters) throws Exceptions{… return expression;}

Контракт
accessLevelModifier
abstract
final accessLevelModifier
static public
synchronized protected
native default
strictfp private
Java.
Параметры в методы передаются по значению
public int sum(int... mas) { int[] m = new int[5];
int result = 0; System.out.printf("%s%n",Arrays.toString(m));
for (int data: mas){ String s = "Start";
result += data; init(s, m);
} System.out.printf("Return: %2d%n", zero(m[0]));
return result; System.out.printf("%s%n",Arrays.toString(m));
} System.out.println("String after init: " + s);
System.out.format("Sum1 = %4d%n",sum(m));
public void init(String string, int[] mas) { System.out.format("Sum2 = %4d%n",sum(1,4));
Arrays.fill(mas, 5); System.out.format("Sum3 = %4d%n",sum());
string = "Finish";
} Output
[0, 0, 0, 0, 0]
public int zero(int data){ Return: 0
data = 0; [5, 5, 5, 5, 5]
return data; String after init: Start
} Sum1 = 25
Sum2 = 5
Sum3 = 0
Java. Перегрузка методов
Перегрузка – объявление нескольких методов с одинаковым
именем. Признаками перегрузки должны быть различия в:
• количестве параметров;
и (или)
• типах параметров.
Методы с одинаковыми сигнатурами, но различными
контрактами, не являются перегруженными (Compilation
Error!)
Java. Перегрузка методов
public static int max(int a, int b){ public static double max(double a, double b){
return a > b ? a : b; if (Double.isNaN(b))
} return a;
else
return a > b ? a : b;
}

public static int max(int[] mas){ public static int max(int... mas){
return return max(mas); Рекурсия или
Arrays.stream(mas).max().getAsInt(); } вызов max(int[] )?
}

max(new int[]{1,2,3,5,12})
Какой метод вызвать?

public static long max(int a, int b){


return a > b ? a : b; max(3,1) – какой метод будет вызван?
} max(3L,1L) – какой метод будет вызван?
Java. Конструкторы класса
Конструктор – это метод, который автоматически вызывается при
создании объекта класса и выполняет действия по инициализации
объекта.

Вызывается только вместе с ключевым словом new при создании


экземпляра класса.

Если не определен ни один из конструкторов, компилятор 


Java автоматически генерирует пустой конструктор без параметров
(конструктор по умолчанию) с тем же модификатором доступа, что и
класс.

Конструктор не имеет возвращаемого типа (всегда возвращает this),


но может иметь параметры и быть перегружаемым.
Java. Конструкторы и методы класса
Свойство Конструкторы Методы
Назначение Создание экземпляра класса Группировка операторов
Модификаторы Не могут быть abstract, final, Могут быть abstract, final,
native, static, synchronized native, static, synchronized
Возвращаемый тип Не имеют (возвращает this) Любой корректный тип
Имя Совпадает с именем класса Любое
this Ссылается на другой конструктор в Ссылается на экземпляр.
этом классе или на поле Не может вызываться
статическими методами
super Вызывает конструктор Вызывает
родительского класса переопределенный метод
родительского класса
Наследование Не наследуются Наследуются
Автоматическое Если не описан, создается Отсутствует
добавление автоматически. Автоматически
вызывает конструктор без
параметров родительского класса.
Java. Конструкторы класса
public class Point2D { public class Point3D extends Point2D{
public int x; private int z;
public int y;
public Point3D(){} // Error!!!
public Point2D(int x, int y) {
this.x = x; public void Point3D(){ // Method!!!
this.y = y; x = y = z = 0;
} }

public Point2D(int size) { public Point3D(int size){


this(size,size); z = size;
} super(size); // Error!!!
} }
}

Point2D point2D = new Point2D(2,3);


Point3D point3D = new Point3D(2,3); // Error!!!
Java. Статические свойства класса
Модификатор static объявляет поля и методы принадлежащими классу.
Особенности:
• Нет возможности получить доступ к НЕ статическим членам класса
внутри статического контекста.
• Статические поля и методы НЕ потокобезопасны.
• Отсутствует необходимость создавать объект для доступа к
статическим свойствам.
• Статические методы НЕ могут быть переопределены (раннее
связывание).
• Статическим может быть класс (nested static class), за исключением
классов верхнего уровня.
• Модификатор static также может быть объявлен в блоке
инициализации (Static initializer block).
• Статические поля не сериализуются.
• Позволяют реализовать статический импорт.
Java. Создание объектов
Задача -> Декомпозиция и абстрагирование (divide et impera)

High Cohesion + Low Coupling

состояние поля
Класс: свойства
поведение методы

Объект: переменная (экземпляр класса)


Java. Enum
public class WeekDay {
public static final int SUNDAY = 1;
public static final int MONDAY = 2;
public static final int TUESDAY = 3;
public static final int WEDNESDAY = 4;
public static final int THURSDAY = 5;
public static final int FRIDAY = 6;
public static final int SATURDAY = 7;
}

public static String getJob(int dayInWeek) {


if (dayInWeek == WeekDay.SATURDAY || dayInWeek == WeekDay.SUNDAY) {
return "Nothing";
}
return "Coding"; 1. Небезопасно: при вызове метода getJob(int)
} можно передать любое значение int.
2. Не имеет значения: при выводе будут числа.
3. Занимает меньше памяти.
Java. Enum
public enum WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

class WeekDay extends Enum Каждый enum неявно наследует


{ java.lang.Enum класс.
public static final WeekDay MONDAY;
public static final WeekDay TUESDAY;
public static final WeekDay WEDNESDAY; Каждое значение enum является
public static final WeekDay THURSDAY; объектом и объявлено как public
public static final WeekDay FRIDAY; static final.
public static final WeekDay SATURDAY;
public static final WeekDay SUNDAY;
}
Java. Enum

public enum WeekDay {


MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

public static String getJob(WeekDay weekDay) {


if (weekDay == WeekDay.SATURDAY || weekDay == WeekDay.SUNDAY) {
return "Nothing";
}
return "Coding";
}

Можно использовать оператор == для сравнения


Java. Enum
public enum WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

public static String getJob(WeekDay weekDay) {


switch (weekDay) {
case SATURDAY:
case SUNDAY:
return "Nothing";
default:
return "Coding";
}
}

Можно использовать в команде  switch


Java. Методы еnum
• static enumType[] values() – возвращает массив,
содержащий все элементы перечисления в порядке их
объявления:
public enum WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
Day: MONDAY
WeekDay[] weekDays = WeekDay.values(); Day: TUESDAY
for (WeekDay day : weekDays) { Day: WEDNESDAY
System.out.println("Day: " + day); Day: THURSDAY
} Day: FRIDAY
Output
Day: SATURDAY
Day: SUNDAY
Java. Методы еnum
• static T valueOf(Class<T> enumType, String arg) – возвращает
элемент перечисления, соответствующий передаваемому
типу и значению передаваемой строки;
public enum WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}
WeekDay weekDay = WeekDay.valueOf(WeekDay.class, "MONDAY");

• static enumType valueOf(String arg) – возвращает элемент пере­


числения, соответствующий значению передаваемой строки;

WeekDay weekDay =
WeekDay.valueOf("monday".toUpperCase(Locale.ENGLISH));
Java. Методы еnum
• int ordinal() – возвращает позицию элемента перечисления.
public enum WeekDay {
MONDAY, TUESDAY, WEDNESDAY, THURSDAY, FRIDAY, SATURDAY, SUNDAY;
}

for (WeekDay day : WeekDay.values()) { MONDAY number = 0


System.out.println(day + " number" + "= " + day.ordinal()); TUESDAY number = 1
} WEDNESDAY number = 2
Output THURSDAY number = 3
FRIDAY number = 4
SATURDAY number = 5
SUNDAY number = 6

• String toString()

• boolean equals(Object other)


Java. Методы еnum
enum WeekDay{
SUNDAY("SUN"), MONDAY("MON"), TUESDAY("TUES"),
WEDNESDAY("WED"), THURSDAY("THURS"), FRIDAY("FRI"), SATURDAY("SAT");

private String abbreviation;

public String getAbbreviation() {


return this.abbreviation;
}

WeekDay(String abbreviation) {
this.abbreviation = abbreviation;
}
}
Java. Методы еnum
enum Direction { 
UP, DOWN; 
 
public Direction opposite() { return this == UP ? DOWN : UP;} 

элементы enum могут реализовывать свое собственное поведение:

enum Direction { 
   UP { 
        public Direction opposite() { return DOWN; } 
   }, 
   DOWN { 
        public Direction opposite() { return UP; } 
   }; 
  Если есть абстрактный метод,
   public abstract Direction opposite();  он должен быть реализован!

Java. Особенности еnum
• Предоставляют типизированный, безопасный способ задания
фиксированных наборов значений.
• Конструкторы всегда являются private или default. Невозможно создать
экземпляр, используя оператор new.
• Не могут иметь наследников.
• Могут реализовывать интерфейсы. Неявно реализуют интерфейсы
java.io.Serializable и java.lang.Comparable.
• Не могут быть абстрактными.
• Могут содержать абстрактные методы, которые должны быть
реализованы.
• Не могут быть объявлены в методе.
• Возможна реализация метода main().
• Возможно использование оператора “==“ для сравнения значений:
выполняется быстрее, не генерирует NullPointerException и
контролирует совместимость типов компилятором (все ли это –
преимущества?).
• Занимают больше памяти, по сравнению со статическими константами.

Оценить