💻 JavaStartZero 🚀
23 subscribers
5 links
🚀 Привет, будущие разработчики! JavaStartZero - это твой главный ресурс для обучения программированию на Java с нуля. Здесь мы разбираемся в основах, концепциях и инструментах, которые помогут тебе стать успешным Java-разработчиком. 💻
Download Telegram
Тема: Переменные и константы

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

Переменные объявляются следующим образом:
тип_данных имя_переменной;

Например, определим переменную, которая будет называться x и будет иметь тип int:
int x;

В этом выражении мы объявляем переменную x типа int. То есть x будет хранить некоторое число не больше 4 байт.

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


- имя может содержать любые алфавитно-цифровые символы, а также знак
подчеркивания, при этом первый символ в имени не должен быть цифрой

- в имени не должно быть знаков пунктуации и пробелов

- имя не может быть ключевым словом языка Java
Кроме того, при объявлении и последующем использовании надо учитывать, что Java - регистрозависимый язык, поэтому следующие объявления int num; и int NUM; будут представлять две разных переменных.

Объявив переменную, мы можем присвоить ей значение:
int x;      // объявление переменной
x = 10; // присвоение значения
System.out.println(x); // 10

Также можно присвоить значение переменной при ее объявлении. Этот процесс называется инициализацией:
int x = 10;     // объявление и инициализация переменной
System.out.println(x); // 10

Если мы не присвоим переменной значение до ее использования, то мы можем получить ошибку, например, в следующем случае:
int x;
System.out.println(x);

Через запятую можно объявить сразу несколько переменных одного типа:
int x, y;
x = 10;
y = 25;
System.out.println(x); // 10
System.out.println(y); // 25

Отличительной особенностью переменных является то, что мы можем в процессе работы программы изменять их значение:
int x = 10;
System.out.println(x); // 10
x = 25;
System.out.println(x); // 25
Ключевое слово var:

Начиная с Java 10 в язык было добавлено ключевое слово var, которое также позволяет определять переменную:
var x = 10;
System.out.println(x); // 10

Слово var ставится вместо типа данных, а сам тип переменной выводится из того значения, которое ей присваивается. Например, переменной x присваивается число 10, значит, переменная будет представлять тип int.

Но если переменная объявляется с помощью var, то мы обязательно должны инициализировать ее, то есть предоставить ей начальное значение, иначе мы получим ошибку, как, например, в следующем случае:
var x;      // ! Ошибка, переменная не инициализирована
x = 10;


Константы:

Кроме переменных, в Java для хранения данных можно использовать константы. В отличие от переменных константам можно присвоить значение только один раз. Константа объявляется также, как и переменная, только вначале идет ключевое слово final:
final int LIMIT = 5;
System.out.println(LIMIT); // 5
// LIMIT=57; // так мы уже не можем написать, так как LIMIT - константа

Как правило, константы имеют имена в верхнем регистре.

Константы позволяют задать такие переменные, которые не должны больше изменяться. Например, если у нас есть переменная для хранения числа pi, то мы можем объявить ее константой, так как ее значение постоянно.
Тема: Типы данных.

Одной из основных особенностей Java является то, что данный язык является строго типизированным. А это значит, что каждая переменная и константа представляет определенный тип и данный тип строго определен. Тип данных определяет диапазон значений, которые может хранить переменная или константа.

Рассмотрим систему встроенных базовых типов данных, которая используется для создания переменных в Java. А она представлена следующими типами.

- boolean: хранит значение true или false
boolean isActive = false;
boolean isAlive = true;

- byte: хранит целое число от -128 до 127 и занимает 1 байт
byte a = 3;
byte b = 8;

- short: хранит целое число от -32768 до 32767 и занимает 2 байта
short a = 3;
short b = 8;

- int: хранит целое число от -2147483648 до 2147483647 и занимает 4 байта
int a = 4;
int b = 9;
Тема: Типы данных (продолжение)

- long: хранит целое число от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807 и занимает 8 байт
long a = 5;
long b = 10;

- double: хранит число с плавающей точкой от ±4.9*10-324 до ±1.7976931348623157*10308 и занимает 8 байт
double x = 8.5;
double y = 2.7;

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

- float: хранит число с плавающей точкой от -3.4*1038 до 3.4*1038 и занимает 4 байта
float x = 8.5F;
float y = 2.7F;

- char: хранит одиночный символ в кодировке UTF-16 и занимает 2 байта, поэтому диапазон хранимых значений от 0 до 65535

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

Все целочисленные литералы, например, числа 10, 4, -5, воспринимаются как значения типа int, однако мы можем присваивать целочисленные литералы другим целочисленным типам: byte, long, short. В этом случае Java автоматически осуществляет соответствующие преобразования:
byte a = 1;
short b = 2;
long c = 2121;

Однако если мы захотим присвоить переменной типа long очень большое число, которое выходит за пределы допустимых значений для типа int, то мы столкнемся с ошибкой во время компиляции:
long num = 2147483649;

Здесь число 2147483649 является допустимым для типа long, но выходит за предельные значения для типа int. И так как все целочисленные значения по умолчанию расцениваются как значения типа int, то компилятор укажет нам на ошибку. Чтобы решить проблему, надо добавить к числу суффикс l или L, который указывает, что число представляет тип long:
long num = 2147483649L;
Тема: Целые числа (продолжение)

Как правило, значения для целочисленных переменных задаются в десятичной системе счисления, однако мы можем применять и другие системы счисления. Например:
int num111 = 0x6F; // 16-теричная система, число 111
int num8 = 010; // 8-ричная система, число 8
int num13 = 0b1101; // 2-ичная система, число 13

Для задания шестнадцатеричного значения после символов 0x указывается число в шестнадцатеричном формате. Таким же образом восьмеричное значение указывается после символа 0, а двоичное значение - после символов 0b.

Также целые числа поддерживают разделение разрядов числа с помощью знака подчеркивания:
int x = 123_456;
int y = 234_567__789;
System.out.println(x); // 123456
System.out.println(y); // 234567789
Тема: Числа с плавающей точкой.

При присвоении переменной типа float дробного литерала с плавающей точкой, например, 3.1, 4.5 и т.д., Java автоматически рассматривает этот литерал как значение типа double. И чтобы указать, что данное значение должно рассматриваться как float, нам надо использовать суффикс f:
float fl = 30.6f;
double db = 30.6;

И хотя в данном случае обе переменных имеют практически одно значения, но эти значения будут по-разному рассматриваться и будут занимать разное место в памяти.
#Оффтоп
#Вопросы_с_собеседований

Задание:
Какие типы данных есть в Java?

Ответ:
В Java есть примитивные типы данных:
byte — целые числа в пределах -128 до 127, весит 1 байт;
short — целые числа в пределах -32768 до 32767, весит 2 байта;
int — целые числа -2147483648 до 2147483647, весит 4 байта;
long — целые числа в пределах 9223372036854775808 до 9223372036854775807, весит 8 байтов;
float — числа с плавающей запятой в пределах -3.4E+38 до 3.4E+38, весит 4 байта;
double — числа с плавающей запятой в пределах -1.7E+308 до 1.7E+308, весит 8 байтов;
char — одиночные символы в UTF-16, весит 2 байта;
boolean значения true/false, весит 1 байт.

И ссылочные типы данных, которые указывают на объекты в куче.

P.S.: Про ссылочные типы подробнее расскажем далее
Тема: Символы и строки.

В качестве значения переменная символьного типа получает одиночный символ, заключенный в одинарные кавычки: char ch='e';. Кроме того, переменной символьного типа также можно присвоить целочисленное значение от 0 до 65535. В этом случае переменная опять же будет хранить символ, а целочисленное значение будет указывать на номер символа в таблице символов Unicode (UTF-16). Например:
char ch=102; // символ 'f'
System.out.println(ch);

Еще одной формой задания символьных переменных является шестнадцатеричная форма: переменная получает значение в шестнадцатеричной форме, которое следует после символов "\u". Например, char ch='\u0066'; опять же будет хранить символ 'f'.

Символьные переменные не стоит путать со строковыми, 'a' не идентично "a". Строковые переменные представляют объект String, который в отличие от char или int не является примитивным типом в Java:
String hello = "Hello...";
System.out.println(hello);
Тема: Символы и строки (продолжение).

Кроме собственно символов, которые представляют буквы, цифры, знаки препинания, прочие символы, есть специальные наборы символов, которые называют управляющими последовательностями. Например, самая популярная последовательность - "\n". Она выполняет перенос на следующую строку. Например:
String text = "Hello \nworld";
System.out.println(text);

Результат выполнения данного кода:

Hello
world

В данном случае последовательность \n будет сигналом, что необходимо сделать перевод на следующую строку.
#Вопросы_с_собеседований
Вопрос
:
Объясните что такое JDK?

Ответ:
1) Java Development Kit
2) Это инструмент, необходимый для компиляции, документирования и упаковки программ Java.
3) Он содержит инструменты разработки JRE +.
Тема: Символы и строки (продолжение).

Начиная с версии 15 Java поддерживает тестовые блоки (text blocks) - многострочный текст, облеченный в тройные кавычки. Рассмотрим, в чем их практическая польза. Например, выведем большой многострочный текст:
String text = "Вот мысль, которой весь я предан,\n"+
"Итог всего, что ум скопил.\n"+
"Лишь тот, кем бой за жизнь изведан,\n"+
"Жизнь и свободу заслужил.";
System.out.println(text);

С помощью операции + мы можем присоединить к одному тексту другой, причем продолжение текста может располагаться на следующей строке. Чтобы при выводе текста происходил перенос на следующую строку, применяется последовательность \n.

Текстовые блоки, которые появились в JDK15, позволяют упростить написание многострочного текста:
String text = """
Вот мысль, которой весь я предан,
Итог всего, что ум скопил.
Лишь тот, кем бой за жизнь изведан,
Жизнь и свободу заслужил.
""";
System.out.println(text);

Весь текстовый блок оборачивается в тройные кавычки, при этом не надо использовать соединение строк или последовательность \n для их переноса.
Тема: Консольный ввод/вывод в Java.

Наиболее простой способ взаимодействия с пользователем представляет консоль: мы можем выводить на консоль некоторую информацию или, наоборот, считывать с консоли некоторые данные. Для взаимодействия с консолью в Java применяется класс System, а его функциональность собственно обеспечивает консольный ввод и вывод.
#Вопросы_с_собеседований.

Вопрос:
Что такое JRE?

Ответ:
1) Java Runtime Environment.
2) JRE относится к среде выполнения, в которой может выполняться байт-код Java.
3)Это реализация JVM, которая существует физически.

Вопрос:
Что такое JVM?

Ответ:
1) Java Virtual Machine.
2) Это абстрактная машина. Это спецификация, которая обеспечивает среду выполнения, в которой может выполняться байт-код.
3) JVM следует за тремя обозначениями: спецификация, реализация и экземпляр среды выполнения.
Тема: Вывод на консоль.

Для создания потока вывода в класс System определен объект out. В этом объекте определен метод println, который позволяет вывести на консоль некоторое значение с последующим переводом курсора консоли на следующую строку. Например:
public class Program {

public static void main(String[] args) {

System.out.println("Hello world!");
System.out.println("Bye world...");
}
}

В метод println передается любое значение, как правило, строка, которое надо вывести на консоль. И в данном случае мы получим следующий вывод:

Hello world!
Bye world...

При необходимости можно и не переводить курсор на следующую строку. В этом случае можно использовать метод System.out.print(), который аналогичен println за тем исключением, что не осуществляет перевода на следующую строку.
public class Program {

public static void main(String[] args) {

System.out.print("Hello world!");
System.out.print("Bye world...");
}
}

Консольный вывод данной программы:

Hello world!Bye world...

Но с помощью метода System.out.print также можно осуществить перевод каретки на следующую строку. Для этого надо использовать escape-последовательность \n:
System.out.print("Hello world \n");
Тема: Вывод на консоль (продолжение).

public class Program {

public static void main(String[] args) {

int x=5;
int y=6;
System.out.println("x=" + x + "; y=" + y);
}
}

Консольный вывод программы:

x=5; y=6

Но в Java есть также функция для форматированного вывода, унаследованная от языка С: System.out.printf(). С ее помощью мы можем переписать предыдущий пример следующим образом:
int x=5;
int y=6;
System.out.printf("x=%d; y=%d \n", x, y);

В данном случае символы %d обозначают спецификатор, вместо которого подставляет один из аргументов. Спецификаторов и соответствующих им аргументов может быть множество. В данном случае у нас только два аргумента, поэтому вместо первого %d подставляет значение переменной x, а вместо второго - значение переменной y. Сама буква d означает, что данный спецификатор будет использоваться для вывода целочисленных значений.
Тема: Вывод на консоль (продолжение).

Кроме спецификатора %d мы можем использовать еще ряд спецификаторов для других типов данных:

- %x: для вывода шестнадцатеричных чисел

- %f: для вывода чисел с плавающей точкой

- %e: для вывода чисел в экспоненциальной форме, например, 1.3e+01

- %c: для вывода одиночного символа

- %s: для вывода строковых значений

Например:
public class Program {

public static void main(String[] args) {

String name = "Tom";
int age = 30;
float height = 1.7f;

System.out.printf("Name: %s Age: %d Height: %.2f \n", name, age, height);
}
}

При выводе чисел с плавающей точкой мы можем указать количество знаков после запятой, для этого используем спецификатор на %.2f, где .2 указывает, что после запятой будет два знака. В итоге мы получим следующий вывод:

Name: Tom Age: 30 Height: 1,70
#Вопросы_с_собеседований.

Вопрос:
Почему Java не на 100% объектно-ориентирована?

Ответ:
Потому что в ней используются восемь примитивных типов данных, таких как boolean, byte, char, int, float, double, long, short, которые не являются объектами.

Вопрос:
Что такое классы-оболочки?

Ответ:
Классы-оболочки преобразуют примитивы в ссылочные типы (объекты). Каждому примитивному типу данных посвящен класс. Они известны как классы-оболочки, потому что они «оборачивают» примитивный тип данных в объект этого класса.
Тема: Ввод с консоли.

Для получения ввода с консоли в классе System определен объект in. Однако непосредственно через объект System.in не очень удобно работать, поэтому, как правило, используют класс Scanner, который, в свою очередь использует System.in. Например, напишем маленькую программу, которая осуществляет ввод чисел:
import java.util.Scanner;

public class Program {

public static void main(String[] args) {

Scanner in = new Scanner(System.in);
System.out.print("Input a number: ");
int num = in.nextInt();

System.out.printf("Your number: %d \n", num);
in.close();
}
}
Тема: Ввод с консоли (продолжение).

Так как класс Scanner находится в пакете java.util, то мы вначале его импортируем с помощью инструкции import java.util.Scanner.

Для создания самого объекта Scanner в его конструктор передается объект System.in. После этого мы можем получать вводимые значения. Например, в данном случае вначале выводим приглашение к вводу и затем получаем вводимое число в переменную num.

Чтобы получить введенное число, используется метод in.nextInt();, который возвращает введенное с клавиатуры целочисленное значение.

Пример работы программы:

Input a number: 5
Your number: 5