- boolean - true/false
- byte - -128 до 127, 1 байт
- short - (+/-)3276(7/8), 2 байта
- int - (+/-)214748364(7/8), 4 байта
- long - (+/-)9 223 372 036 854 775 80(7/8), 8 байт
- double - с плавающей точкой, 8 байт
- float - с плавающей точкой, 4 байта
- char - символ в кодировке UTF-16 (0 до 65535), 2 байта
- примитивные типы выигрывают в производительности и занимаемой памяти
Передача по значению (by value) - значения фактических параметров копируются. Вызываемый метод создает свою копию значений аргументов и затем ее использует. Поскольку работа ведется с копией, на исходный параметр это никак не влияет.
Передача по ссылке (by reference) - параметры передаются как ссылка (адрес) на исходную переменную. Вызываемый метод не создает свою копию, а ссылается на исходное значение. Следовательно, изменения, сделанные в вызываемом методе, также будут отражены в исходном значении.
Java всегда передает параметры по значению! Однако ссылки указывают на один и тот же объект в куче (heap), что приводит к изменениям параметра даже во внешних методах.
Все ЯП можно условно разделить на компилируемые и интерпретируемые. В Java используется третий подход — байт-код. Исходный код Java преобразуется компилятором в байт-код (а не машинный код). A байт-код Java преобразуется в машинный код с помощью специального интерпретатора - JVM.
JVM (Java Virtual Machine) - виртуальная машина отвечает за само выполнение кода. Она работает с байткодом (тем, что находится внутри файлов с расширением .class).
JRE (Java Runtime Environment) - окружение, необходимое для запуска Java-программ. Включает в себя стандартную библиотеку. В нее входят, как базовые пакеты lang, util, так и пакеты для работы с различными форматами, БД, пользовательским интерфейсом. JVM тоже часть JRE.
JDK (Java Development Kit) - набор программ для разработки. Включает в себя JRE, загрузчик кода java, компилятор javac, архиватор jar, генератор документации javadoc и другие утилиты, нужные во время разработки.
- Все свойства приватные (для доступа геттеры/сеттеры)
- Открытый конструктор без аргументов
- Реализует Serializable
Ошибка возникающая при недостатке физической памяти для выделения приложению. Из-за чего приложением падает без информации в логах или потоке вывода о том где и почему это произошло.
Stacktrace (стек вызовов) - последовательность вызовов функций в программе.
StackTraceElement[] stackTraceElements = Thread.currentThread().getStackTrace();
for (StackTraceElement element : stackTraceElements)
{
System.out.println(element.getMethodName());
}
//Возвращает строковое представление объекта
public String toString()
//Используются для сравнения объектов
public native int hashCode()
public boolean equals(Object obj)
//Возвращает специальный объект, который описывает текущий класс
public final native Class getClass()
//Методы для контроля доступа к объекту из различных нитей/потоков(threads). Управление синхронизацией нитей
public final native void notify()
public final native void notifyAll()
public final native void wait(long timeout)
public final void wait(long timeout, intnanos)
public final void wait()
//Позволяет «освободить» родные не-Java ресурсы: закрыть файлы, потоки и т.д.
protected void finalize()
//Позволяет клонировать объект: создает дубликат объекта
protected native Object clone()
try-with-resources аналог традиционного и подробного блока try-catch-finally. Реализация ресурса должна выполняться в try(). Ресурсы автоматически закрываются после try(), вместо ручного закрытия в блоке finally в try-catch-finally.
try (FileReader fileReader = new FileReader("D:\\test.txt");) {
...
}
catch (IOException e){
e.printStackTrace();
}
-
Конструктор по умолчанию - не описанный в классе явно, а созданный автоматически компилятором.
-
Конструктор без аргументов
public BankAccount() {
name = "";
opened = LocalDateTime.now();
balance = 0.0d;
}
- Параметризованный конструктор
public BankAccount(String name, LocalDateTime opened, double balance) {
this.name = name;
this.opened = opened;
this.balance = balance;
}
Конструктор копирования - специальный конструктор, который применяется когда необходимо создать копию сложного объекта, но при этом мы не хотим использовать метод clone(). Связанные конструкторы - один конструктор вызывает другой из этого же класса.
Поразрядные операции - выполняются над отдельными двоичными разрядами или битами чисел. В данных операциях в качестве операндов могут выступать только целые числа. Логические операции:
- & (логическое И / умножение) - если у обоих операндов значения разрядов равно 1, то операция возвращает 1, иначе возвращается число 0
- | (логическое ИЛИ / сложение) - возвращается единица, если хотя бы у одного числа в данном разряде имеется единица
- ^ (логическое исключающее ИЛИ / XOR) - Если у нас значения текущего разряда у обоих чисел разные, то возвращается 1, иначе возвращается 0
- ~ (логическое отрицание) - инвертирует все разряды числа: если значение разряда равно 1, то оно становится 0
Иммутабельный (неизменяемый/immutable) объект — объект, который после инициализации не может изменить свое состояние. То есть если в коде есть ссылка на экземпляр иммутабельного класса, то любые изменения в нем приводят к созданию нового экземпляра. Иммутабельность позволяет строить более стабильные программы и ее принципы зачастую применимы в фундаментальных частях софта.
- Объявлен как final, чтобы от него нельзя было наследоваться. Иначе дочерние классы могут нарушить иммутабельность.
- Все поля класса должны быть приватными в соответствии с принципами инкапсуляции.
- Должны быть параметризованные конструкторы для корректного создания экземпляра, через которые осуществляется первоначальная инициализация полей класса.
- В классе не должно быть сеттеров, для исключения возможности изменения состояния после инстанцирования
- Для полей-коллекций необходимо делать глубокие копии, чтобы гарантировать их неизменность.
- String
- Все классы-обертки над примитивными типами (Boolean, Integer, Byte, Long..)
- BigInteger и BigDecimal
- Объекты класса java.lang.StackTraceElement
- File
- UUID
- Объекты классов пакета java.time
- Locale
- Потокобезопасность - можно свободно использовать одновременно из разных нитей.
- Являются хорошими ключами в map.
- Отлично подходят для хранения констант.
- “Атомарность по отношению к сбою” — если immutable объект выбросит исключение, то он всё равно не останется в нежелательном (сломанном) состоянии.
- Просты в реализации и тестировании
- Не нужны такие дополнительные механизмы как конструктор копирования и реализация клона.