Академический Документы
Профессиональный Документы
Культура Документы
Инкапсуляция
Инкапсуляция - языковая конструкция, позволяющая связать данные с методами,
предназначенными для обработки этих данных
3. Понятие класса
Класс - тип данных, задающий общее поведение для группы объектов (этого типа).
Доступ извне (из других объектов) к отдельным членам класса может быть ограничен.
1
5. Наследование
Наследование - один из механизмов повторного использования кода, при котором
открытые члены класса родителя доступны классу потомку.
• В Java при наследовании классов может быть только один родитель
• Суперкласс, подкласс, базовый класс
• Иерархия наследования классов - дерево узлами, которого являются классы
• Подкласс не наследует конструкторы суперкласса
• Методы суперкласса могут быть перекрыты в подклассе
• Метод считается перекрытым в подклассе, если он имеет такую же сигнатуру,
что и в суперклассе
• Область видимости метода подкласса должна быть не ниже области видимости
метода суперкласса
public class SuperClass {}
public class SubClass extends SuperClass {}
2
7. Модификатор static
• внутренний класс
• поле
• метод
• инициализатор
• static-метод не виртуальный
• static-метод может использовать только static-поля
static String text = “FirstName”;
static void aClassMethod() {
System.out.println(text);
}
public static void main(String[] args) {
// Method body goes here
}
Зачем нужен static
• точка входа в программу - метод main()
• final static константы, экземпляры вспомогательных классов
• static методы - методы, не использующие состояние объекта, не зависящие от
состояния объекта
• static конструкторы
• static методы создающие экземпляры класса (паттерн фабрика)
8. Модификатор final
• класс
• метод
• поле (экземпляр, статическое)
• переменная
• параметр метода
Объявление переменной:
• инициализация во время объявления
final int x = 10;
• инициализация 1 раз (!) после объявления переменной
final int multiplier; // Blank final variable
/* Do something*/
multiplier = 3;
3
Объявление параметра:
public void test2(final int x) {
/* Can read x, but cannot change it */
int y = x + 11;
/* Perform other logic here... */
}
Объявление поля экземпляра:
• присвоение значения в одном из экземплярных инициализаторов или во всех
конструкторах
o если присвоение в инициализаторе, то НЕЛЬЗЯ присваивать в
конструкторах
o если не присвоено в инициализаторе, то присвоение должно быть в
конструкторе, который не вызывает другой конструктор
Объявление статического поля:
public class Test3 {
public static final int YES = 1;
public static final int NO = 2;
public static final String MSG;
static {
MSG = "I am a blank final static variable";
}
}
10. Полиморфизм
Полиморфизм - возможность для одного и того же кода обрабатывать данные по-
разному.
В Java по умолчанию все экземплярные методы виртуальные (virtual)
Типичные ошибки
• Отсутствие полиморфизма
• Ненужное приведение типов
Пример:
public class SuperClass{
public void sayHello(){
System.out.println(“Hello!”); } }
7
16. Перечисления
Кроме отдельных примитивных типов данных и классов в Java есть такой тип как enum
или перечисление. Перечисления представляют набор логически связанных констант.
Объявление перечисления происходит с помощью оператора enum, после которого
идет название перечисления. Затем идет список элементов перечисления через
запятую:
enum Day{
MONDAY,
TUESDAY,
WEDNESDAY,
THURSDAY,
FRIDAY,
SATURDAY,
SUNDAY
}
• Перечисление фактически представляет новый тип, поэтому мы можем
определить переменную данного типа и использовать ее
• Перечисления могут использоваться в классах для хранения данных
Методы перечислений
• статический метод values() - возвращает массив всех констант перечисления
• ordinal() возвращает порядковый номер определенной константы (нумерация
начинается с 0)
8
int x = 10, y = 0, z;
try {
z = x / y;
System.out.println("z = " + z);
}
catch(ArithmeticException e) {
String msg = e.getMessage();
System.out.println("An error has occurred. The error is: " +
msg);
}
9
19. Обработка нескольких типов исключений
try {
// Exception1, Exception2 or
Exception 3 thrown here
}
catch (Exception3 e1) {
// Handle Exception3
}
catch (Exception2 e2) {
// Handle Exception2
}
catch (Exception1 e3) {
// Handle Exception1
}
catch (Exception e) {
// Handle Exception
}
10
21. Выброс исключения
throw – используется для возбуждения исключения;
throws – используется в сигнатуре методов для предупреждения, о том, что метод
может выбросить исключение.
11
23. Понятие обобщенного типа
Обобщения (Generic) — ссылочный тип, который принимает один или несколько
параметров типа. С их помощью можно объявлять классы, интерфейсы и методы, где
тип данных указан в виде параметра.
• SomeType<T> - обобщенный тип, generic-тип
• T - параметр типа (formal type parameter)
List<String> words = new ArrayList<String>();
words.add("Hello ");
words.add("world!");
String s = words.get(0)+words.get(1);
Во время выполнения нет никакого способа узнать, что T=String для объекта списка -
эта информация исчезла.
12
25. Принцип подстановки
• Переменной данного типа может быть присвоено значение любого подтипа
данного типа.
• Метод с параметром данного типа может быть вызван с аргументом любого
подтипа данного типа
Integer – подтип Number
Double – подтип Number
ArrayList<E> – подтип List<E>
List<E> – подтип Collection<E>
Collection<E> – подтип Iterable<E>
26. Get-принцип
Get-принцип - используй extends там, где значения только читаются (get) из структуры
данных.
public static double sum(Collection<? extends Number> nums)
{
double s = 0.0;
for (Number num : nums) s += num.doubleValue();
return s;
}
List<Integer> ints = Arrays.asList(1, 2, 3);
assert sum(ints) == 6.0;
List<Double> doubles = Arrays.asList(2.78, 3.14);
assert sum(doubles) == 5.92;
List<Number> nums = Arrays.<Number>asList(1, 2, 2.78, 3.14);
assert sum(nums) == 8.92;
27. Put-принцип
Put-принцип - используй super там, где значения только записываются (put) в
структуру данных
public static void count(Collection<? super Integer> ints,
int n) {
for (int i = 0; i < n; i++) ints.add(i);
}
List<Integer> ints = new ArrayList<Integer>();
count(ints, 5);
assert ints.toString().equals("[0, 1, 2, 3, 4]");
List<Number> nums = new ArrayList<Number>();
count(nums, 5); nums.add(5.0);
assert nums.toString().equals("[0, 1, 2, 3, 4, 5.0]");
List<Object> objs = new ArrayList<Object>();
count(objs, 5); objs.add("five");
assert objs.toString().equals("[0, 1, 2, 3, 4, five]");
13
28. Захват символа подстановки
Захват подстановочного типа — это тип, который используется компилятором,
представляет тип конкретного экземпляра типа подстановочного знака в одном
конкретном месте.
Пример:
14
30. Списки
Для создания простых списков применяется
интерфейс List, который расширяет
функциональность интерфейса Collection.
31. Множества
Множество в Java – это коллекция, содержащая
неупорядоченные уникальные, то есть неповторяющиеся,
элементы.
15
32. Очередь и дек
Очередь реализует принцип «first in - first out», т.е. «первым пришёл - первым ушёл».
Базовым интерфейсом всех очередей Java является Queue. Добавление элементов в
очередь делается методом add(), удаление - poll(), получение первого элемента без
его удаления - peek().
Две самые простые реализации очереди - это LinkedList (элементы извлекаются в том
же порядке, в котором были добавлены) и PriorityQueue(сортирует элементы в
порядке возрастания (или алфавитный порядок для строк)).
34. Соответствие/словарь
В Java словари, также называемые картами и отображениями, реализованы классами
HashMap, TreeMap (через интерфейс SortedMap), Hashtable (хэш-таблица),
LinkedHashMap. Словарь представляет собой набор пар ключ-значение. При этом ключ
в пределах словаря должен быть уникальным.
Методы:
• put(key, value) – добавление элемента в словарь
• get(key) – получение значения по ключу
• entrySet(), keySet() и values() – получение множества пар, ключей, либо значений.
Можно преобразовать в списки, передав в конструктор List или методом addAll()
• containsKey(key) – проверка наличия ключа
• remove(key) – удаление элемента по ключу
• containsValue(value) – проверка наличия значения
16
35. Обход коллекции, удаление элементов коллекции
Обход:
• Iterator
• for-each loop
• forEach() method
Удаление элементов коллекции:
Collection<Type> collection = …;
Iterator<Type> it = collection.iterator();
while(it.hasNext()) {
Type value = it.next();
if (value ○ condition) it.remove();
}
Collection<Type> collection = …;
Collection<Type> toRemoveList = new ArrayList();
for(Type t: collection) {
if (t ○ condition) toRemoveList.add(t);
}
collection.removeAll(toRemoveList)
17
37. Компаратор. Сортировка коллекции
Компаратор:
Comparator<T>
public interface Comparator<T> {
int compare<T object1, T object2);
}
Сортировка:
List<String> list = new ArrayList<>();
list.add("John");
list.add("Richard");
list.add("Donna");
list.add("Ken");
Collections.sort(list);
list.sort(Comparator.comparing(String::length));
18
39. Специализированные коллекции: только для чтения,
синхронизированные, пустые, вырожденные
Коллекцию, доступную только для чтения можно получить с помощью методов:
<T> Collection<T> unmodifiableCollection(Collection<?
extends T> c)
<T> List<T> unmodifiableList(List<? extends T> list)
<K,V> Map<K,V> unmodifiableMap(Map<? extends K,? extends V>
m)
<K,V> NavigableMap<K,V>
unmodifiableNavigableMap(NavigableMap<K,?
extends V> m)
<T> Set<T> unmodifiableSet(Set<? extends T> s)
<T> NavigableSet<T> unmodifiableNavigableSet(NavigableSet<T>
s)
static <T> SortedSet<T> unmodifiableSortedSet(SortedSet<T>
s)
<K,V> SortedMap<K,V> unmodifiableSortedMap(SortedMap<K,?
extends V>
m)
19
40. Понятие лямбда-выражения
Лямбда-выражение — это безымянная функция, используемая в функциональном
программировании, анонимная реализация функционального интерфейса.
• НЕ МЕТОД
• это экземпляр реализации функционального интерфейса
• не имеет имени
• не имеет return-типа, тип выводится из контекста
• не имеет предложения throws
• не может иметь параметров типа - не может быть Generic
20
43. Анонимная реализация интерфейса
@FunctionalInterface
public interface Comparator<T> {
int compare(T o1, T o2);
}
@FunctionalInterface
public interface Operations {
double add(double n1, double n2);
double subtract(double n1, double n2);
}
21
46. Лямбда-синтаксис для компараторов
static <T,U extends Comparable<? super U>>Comparator<T>
comparing(Function<? super T,? extends U> keyExtractor)
Внутреннее итерирование:
int sum = numbers.stream()
.filter(n -> n % 2 == 1)
.map(n -> n * n)
.reduce(0, Integer::sum);
int sum = numbers.parallelStream()
.filter(n -> n % 2 == 1)
.map(n -> n * n)
.reduce(0, Integer::sum);
22
49. Понятие потока данных (Stream API). Характеристики
потока данных
Stream — это последовательность элементов данных, которая
поддерживает последовательные или параллельные операции агрегации
над ними
• ● Collection ≠ Stream
Особенности потоков
• Потоки не имеют хранилища
• Потоки могут представлять собой последовательность бесконечных элементов
• Проектирование потоков основано на внутренней итерации
• Потоки предназначены для параллельной обработки без дополнительной
работы со стороны разработчиков
• Потоки предназначены для поддержки функционального программирования
• Потоки поддерживают ленивые операции
• Потоки могут быть упорядочены или неупорядочены
• Потоки не могут быть использованы повторно
23
Пример: Stream<String> streamFromValues = Stream.of("a1",
"a2", "a3");
3. Создание стрима из массива
Шаблон: Arrays.stream(массив)
Пример: String[] array = {"a1","a2","a3"}; Stream<String>
streamFromArrays = Arrays.stream(array);
4. Создание стрима из файла (каждая строка в файле будет отдельным элементом в
стриме)
Шаблон: Files.lines(путь_к_файлу)
Пример: Stream<String> streamFromFiles =
Files.lines(Paths.get("file.txt"))
5. Создание стрима из строки
Шаблон: «строка».chars()
Пример: IntStream streamFromString = "123".chars()
6. С помощью Stream.builder
Шаблон: Stream.builder().add(...)....build()
Пример:
Stream.builder().add("a1").add("a2").add("a3").build()
7. Создание параллельного стрима
Шаблон: collection.parallelStream()
Пример: Stream<String> stream = collection.parallelStream();
8. Создание бесконечных стрима с помощью Stream.iterate
Шаблон: Stream.iterate(начальное_условие, выражение_генерации)
Пример: Stream<Integer> streamFromIterate = Stream.iterate(1,
n -> n + 1)
9. Создание бесконечных стрима с помощью Stream.generate
Шаблон: Stream.generate(выражение_генерации)
Пример: Stream<String> streamFromGenerate =
Stream.generate(() -> "a1")
Чтобы понять, в чем состоит уплощение потока, рассмотрим такую структуру, как [
[1,2,3],[4,5,6],[7,8,9] ] , которая имеет "two levels". Сглаживание этого означает
преобразование его в структуру "one level" : [ 1,2,3,4,5,6,7,8,9 ] .
25
58. Понятие сериализации, десереализации
Сериализация представляет процесс записи состояния объекта в поток,
соответственно процесс извлечения или восстановления состояния объекта из потока
называется десериализацией. Сериализация очень удобна, когда идет работа со
сложными объектами.
Для сериализации объектов в поток используется класс ObjectOutputStream. Он
записывает данные в поток.
Для создания объекта ObjectOutputStream в конструктор передается поток, в который
производится запись:
ObjectOutputStream(OutputStream out)
Класс ObjectInputStream отвечает за обратный процесс - чтение ранее
сериализованных данных из потока. В конструкторе он принимает ссылку на поток
ввода:
ObjectInputStream(InputStream in)
59. JSON-формат
JSON стал общепринятым форматом для обмена данными в клиент-серверных
приложения. Он является универсальным форматом для обмена данными.
JSON — текстовый формат обмена данными, основанный на JavaScript. Как и многие
другие текстовые форматы, JSON легко читается людьми.
Несмотря на происхождение от JavaScript, формат считается независимым от языка и
может использоваться практически с любым языком программирования. Для многих
языков существует готовый код для создания и обработки данных в формате JSON.
26