Объявление переменных
public class Variables { public static void main(String[] args) { int age = 25; double price = 19.99; boolean active = true; char letter = 'A'; String name = "Анна"; age = 26; System.out.println(name + ", " + age); }}Java — язык со статической типизацией: тип переменной задается при объявлении и не меняется.
Примитивные типы
| Тип | Размер | Диапазон | Пример |
|---|---|---|---|
byte | 8 бит | −128…127 | byte b = 100; |
short | 16 бит | −32 768…32 767 | short s = 1000; |
int | 32 бита | ≈ ±2,1 млрд | int i = 100000; |
long | 64 бита | ≈ ±9,2·10¹⁸ | long l = 10000000000L; |
float | 32 бита | ≈ 7 значащих цифр | float f = 1.5f; |
double | 64 бита | ≈ 15 значащих цифр | double d = 1.5; |
char | 16 бит | символ UTF-16 | char c = 'x'; |
boolean | — | true, false | boolean ok = true; |
Целые литералы по умолчанию int, дробные — double. Суффикс L делает литерал long, f — float.
Удобные формы записи литералов:
public class Literals { public static void main(String[] args) { int million = 1_000_000; int hex = 0xFF; int bin = 0b1010; int oct = 017; System.out.println(million + " " + hex + " " + bin + " " + oct); }}Вывод: 1000000 255 10 15.
Ссылочные типы
Все, что не примитив — объекты: строки, массивы, коллекции, ваши классы. Переменная хранит ссылку на объект, а не сам объект. Значение null означает отсутствие объекта.
public class References { public static void main(String[] args) { String text = "привет"; String empty = null; System.out.println(text.length()); System.out.println(empty == null); }}Вызов метода у null вызовет NullPointerException.
var — вывод типа
С Java 10 для локальных переменных тип можно не писать, компилятор выведет его сам:
public class VarDemo { public static void main(String[] args) { var count = 10; var title = "Курс"; var ratio = 0.75; System.out.println(count + " " + title + " " + ratio); }}var работает только для локальных переменных с инициализатором. Тип остается статическим.
Константы
Ключевое слово final запрещает повторное присваивание:
public class Constants { static final double PI_APPROX = 3.14159; static final int MAX_USERS = 100; public static void main(String[] args) { final int local = 5; System.out.println(PI_APPROX * local); }}Приведение типов
Расширение выполняется автоматически, сужение нужно писать явно:
public class Casting { public static void main(String[] args) { int i = 10; double d = i; double pi = 3.99; int truncated = (int) pi; long big = 3_000_000_000L; int overflow = (int) big; System.out.println(d); System.out.println(truncated); System.out.println(overflow); }}Вывод:
10.03-1294967296При сужении дробная часть отбрасывается, а при выходе за диапазон значение «заворачивается».
Переполнение
public class Overflow { public static void main(String[] args) { int max = Integer.MAX_VALUE; System.out.println(max + 1); System.out.println(Math.addExact(1, 2)); }}max + 1 даст -2147483648. Метод Math.addExact бросает исключение при переполнении.
Точность дробных чисел
public class Precision { public static void main(String[] args) { System.out.println(0.1 + 0.2); }}Результат 0.30000000000000004: double хранит числа в двоичной форме. Для денег используйте BigDecimal.
Классы-обертки
У каждого примитива есть объектный аналог: Integer, Long, Double, Boolean, Character и так далее. Они нужны для коллекций и содержат полезные методы:
public class Wrappers { public static void main(String[] args) { int a = Integer.parseInt("123"); double b = Double.parseDouble("3.14"); String s = Integer.toString(255); String bin = Integer.toBinaryString(10); int max = Integer.MAX_VALUE; Integer boxed = 5; int unboxed = boxed; System.out.println(a + " " + b + " " + s + " " + bin + " " + max + " " + unboxed); }}Автоматическое преобразование между примитивом и оберткой называется автоупаковкой (autoboxing).
Сравнивайте обертки через equals, а не ==:
public class BoxingCompare { public static void main(String[] args) { Integer a = 1000; Integer b = 1000; System.out.println(a == b); System.out.println(a.equals(b)); }}Вывод: false, затем true. Оператор == сравнивает ссылки, а кэш объектов есть только для небольших значений.
Область видимости
Переменная существует внутри блока { }, в котором объявлена:
public class Scope { public static void main(String[] args) { int outer = 1; { int inner = 2; System.out.println(outer + inner); } System.out.println(outer); }}Обращение к inner за пределами блока вызовет ошибку компиляции.
