====== Общие сведения ======
===== Intellij Idea =====
Установка ubuntu\\
snap install intellij-idea-community --classic --stable
apt install default-jre (java --version)
apt install default-jdk (javac --version)
===== Сведения =====
[[https://www.oracle.com/java/technologies/downloads|Downloads]]\\
{{:develop:java:2023-01-05_17-03.png?direct&600|}}\\
[[https://habr.com/ru/articles/488144/|Про версии]]\\
Разнообразие терминов/комплектов вызывает сложности т.к. несколько проекций, по сути сводится вот к чему:\\
* JDK - Java [SE] Development Kit, комплект инструментальных средств **для разработки** (SDK старое название)
* JRE - Java Runtime Environment, только виртуальная машина, без компиляторов, **для пользователей**
* Java SE - Standart Edition
* Java EE - Enterprise Edition
* Java ME - Mirco Edition
* **Java 6** она же **Java SE 6** она же **Java SE 1.6.0**, тоже справедливо и для 7,8,9, по факту одно и тоже
==== Использование ====
При компиляции создается объект "*.class" содержащий байт код. При выполнении нужно указывать имя класса, а не имя файла\\
Имя файла должно совпадать с именем открытого класса\\
Все элементы программ на Java находятся в составе классов\\
:!: Минимальный пример
/*Класс Main должен хранится в файле Main.java (наверно как и любой другой класс)*/
public class Main {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
javac Main.java
ls -> Main.java, Main.class
java Main - выполнение
Числа с плавающей точкой нельзя использовать в расчетах где ошибки округления недопустимы, есть спец класс "BigDecimal"\\
:!: Строки принимают шестнадцатеричные юникод последовательности типа "\u0000 - \uFFFF". Причем даже в комментарии может распознать и применить, например такой коммент приведет к ошибке "c:\users" т.к. есть "\u" О_О\\
=== Типы ===
:!: Тип boolean не конвертируется в числовое значение !\\
При объявлении переменных нужно **указывать их тип**, с недавних версий, локальным можно не указывать, если его можно вывести из первоначального значения, для этого указать ключевое слово **"var"**\\
Ключевое слово **"final"** используется для определения **констант**. Приветствуется именование заглавными буквами\\
Константа на весь класс задается словами **static final**, за пределами методов, модификатор **public** откроет ее для других классов\\
:!: Перечислимые типы, **enum**\\
enum Size {SMALL, MEDIUM, LARGE, EXTRA};
Size s = Size.MEDIUM // можно присвоить null
:!: Если результат вычисления приводит к переполнению, то мат функция вернет заведомо ложный результат, есть спец функции для обработки такого д-я (переполнение типов переменных имеется ввиду)\\
Приведение происходит с указанием типа в скобках перед переменной, некоторые преобразования могут происходить с потерями (пунктирные линии):\\
{{:develop:java:2023-01-06_13-04.png?direct&600|}}
:!: Символьные строки являются неизменяемыми, всегда константы получается\\
Символьные строки сравниваются только методом **mystring.equals()**, оператор "==" только проверит хранятся ли они в одном участке памяти, так же есть метод **compareTo()**\\
**null** и **length 0** разные вещи\\
=== Ввод/Вывод ===
:!:Консольный ввод. Нужен объект "Scanner"\\
import java.util.*;
Scanner in = new Scanner(System.in);
String allLine = in.nextLine();
String oneWord = in.next();
int oneDigit = in.nextInt(); /nextDouble();
// Еще есть тайный ввод
Console cons = System.console();
String username = cons.readLine ("User name: ");
char[] passwd = cons.readPasswi:Jrd ("Password: ") ;
{{:develop:java:2023-01-06_21-04.png?direct&600|}}
{{:develop:java:2023-01-06_21-12.png?direct&600|}}
:!: Начальный каталог определяется виртуальной машиной, если запускать из IDE то путь хз какой будет\\
:!: При запуске программы можно задать ей файлы для стандартных потоков ввода/вывода, например **"java MyProg < inFile.txt > outFile.txt"**\\
=== Управляющие конструкции ===
:!: **Дробные числа** нужно быть очень внимательным с ними и пользоваться всякими спец методами для работы с ними, например:
// Этот цикл никогда не завершится
for (double x = 0; x != 10; x += 0.1)
// x перескочит с 9.99..998 на 10.999..9998. т.к. у 0.1 не существует точного двоичного представления
=== Массивы ===
Инициализируются отдельно, оператором **new**, int и boolean заполняются нулями и false с-но, объекты, в т.ч. **String**, заполняются значением **null**\\
:!: **for each** (условно). Перебираем элементы коллекции или класса если определен интерфейс "Iterable"\\
"for (int item: ArrayItems) {...}"
В операции "[]" автоматически проверяются границы массива\\
:!: