3. Типы данных (Java. Базовый курс)


Telegram channel

3. Типы данных (Java. Базовый курс)


Date of publication 16.01.2021



На этом уроке разберёмся с типами данных в Java и научимся применять их на практике.

Типы данных

Любая программа в первую очередь оперирует данными, которые нужно где-то хранить. Для этого в Java существуют переменные, в которые можно записать различную информацию. Java - строго типизированный язык, а это значит что все переменные и выражения имеют конкретный тип данных и каждый тип строго определен. Кроме этого, все операции присваивания, как явные, так и через параметры, передаваемые при вызове методов, проверяются на соответствие типов. В языке Java отсутствуют средства автоматического приведения или преобразования конфликтующих типов и любые несоответствия типов считаются ошибками, которые должны быть исправлены до завершения компиляции класса.

В Java существуют примитивные типы данных и ссылочные. Для начала разберёмся с примитивными типами, их всего 8:

Тип

Размер

Описание

Возможные значения

byte

8 бит

Целое число

от 128 до 127

short

16 бит

Целое число

от 32768 до 32767

int

32 бит

Целое число

от -2147483648 

до 2147483647

long

64 бит

Целое число

от 9223372036854775808 

до 9223372036854775807

float

32 бит

Число с плавающей запятой одинарной точности

от 1.4e-45f до 3.4e+38f

double

64 бит

Число с плавающей запятой двойной точности

от 4.9e-324 до 1.7e+308

char

16 бит

Тип для хранения символов

от '\u0000' или 0 

до '\uffff' или 65,535

boolean

8 бит (в массивах), 32 бит (не в массивах)

Логический тип данных

false или true

Для того чтобы записать данные определённого типа в переменную, её нужно объявить. Общий синтаксис объявления переменной выглядит так:

[тип] [имя переменной]; // объявление переменной без инициализации
[тип] [имя переменной] = [начальное значение]; // объявление переменной с инициализацией

Обратите внимание что знак “=” означает присваивание переменной какого-либо значения. С помощью операции присваивания можно записывать в переменную любое значение заданного типа.

Сейчас разберём более подробно как можно использовать переменные в коде и для удобства я создам новый класс VariableExample в проекте из предыдущего урока. Для создания нового класса нужно выбрать пакет в котором вы хотите создать класс и кликнуть правой кнопкой мыши, а затем в контекстном меню выбрать New > Java Class:

Создание нового класса

В VariableExampleя сразу скопирую метод main и допишу следующий код:

Примеры инициализаций переменных

Для удобства прикладываю исходный код сюда:

package ru.akutepov;

public class VariableExample {

    public static void main(String[] args) {

        // объявление переменной 'a' типа 'int' без инициализации
        int a;
        // объявление 2-х (и более) переменных типа 'int' без инициализации
        int b, c;
        // объявление переменной 'd' типа 'int' с инициализацией
        int d = 10;
        // объявление нескольких переменных с инициализацией и без
        int e = 1, f = 2, g;
        // присваивание переменной 'a' числа 100
        a = 100;
        // присваивание переменным 'b' и 'c' числа 200
        b = c = 200;
        // присваивание переменной 'g' суммы значений переменных 'a' и 'b'
        g = a + b;
        // объявление переменной 'variableLong' типа 'long' с инициализацией
        long variableLong = 10000000L;
        // объявление переменной 'variableShort' типа 'short' с инициализацией
        short variableShort = 10000;
        // объявление переменной 'variableByte' типа 'byte' с инициализацией
        byte variableByte = 100;
        // объявление переменной 'variableFloat' типа 'float' с инициализацией
        float variableFloat = 100.21F;
        // объявление переменной 'variableDouble' типа 'double' с инициализацией
        double variableDouble = 10000000.2345;
        // объявление переменной 'variableChar' типа 'char' с инициализацией
        char variableChar = 'a';
        // объявление переменной 'variableBoolean' типа 'boolean' с инициализацией
        boolean variableBoolean = true;
        
    }
}

C 8-й по 14-ю строчку я объявляю переменные типа int различными способами. Допускается использовать любой из них, в зависимости от ситуации. Тип int является наиболее употребляемым и предназначен для хранения 32-разрядных целочисленных значений со знаком в пределах от -2147483648 до 2147483647. Среди прочего переменные типа int зачастую используются для управления циклами и индексирования массивов.

С 16-й по 20 строке я в качестве примера присваиваю переменным типа int различные значения разными способами. Пока переменной примитивного типа не присвоено значение, она считается не проинициализированой и использовать её нельзя.

В строке 22 я объявляю переменную типа long. Этот тип 64-разрядных целочисленных значений со знаком в пределах от –9223372036854775808 до 9223372036854775807 и удобен в тех случаях, когда длины типа int недостаточно для хранения требуемого значения.

В строке 24 я объявляю переменную типа short. Тип short представляет 16-разрядные целочисленные значения со знаком в пределах от -32768 до 32767. Этот тип данных применяется в Java реже всех остальных.

В строке 26 я объявляю переменную типа byte. Это 8-разрядный тип данных со знаком и диапазоном допустимых значений от -128 до 127. Переменные типа byte особенно удобны для работы с потоками ввода-вывода данных в сети или файлах.

В строке 28 я объявляю переменную типа float. Этот тип определяет числовое значение с плавающей точкой одинарной точности, для хранения которого в оперативной памяти требуется 32 бита. На некоторых процессорах обработка числовых значений с плавающей точкой одинарной точности выполняется быстрее и требует в два раза меньше памяти, чем обработка аналогичных значений двойной точности. Но если значения слишком велики или слишком малы, то тип данных float не обеспечивает требуемую точность вычислений. Все числа, которые записываются в переменную типа float должны в конце иметь букву F, например 104.2F или 104.2f;

В строке 30 я объявляю переменную типа double. Для этого типа требуется в 2 раза больше памяти, чем для float - 64 бита. На самом деле в некоторых современных процессорах, оптимизированных для выполнения математических расчетов с высокой скоростью, обработка значений двойной точности выполняется быстрее, чем обработка значений одинарной точности. Все трансцендентные математические функции вроде sin(), cos() и sqrt() возвращают значения типа double. Пользоваться типом double лучше всего, когда требуется сохранять точность многократно повторяющихся вычислений или манипулировать большими числами.

Для хранения символов в Java служит тип данных char. Переменную данного типа я объявляю в 32 строке нашего кода. Следует, иметь в виду, что в Java символы представлены в Юникоде (Unicode), определяющем полный набор международных символов на всех известных языках мира. На ранней стадии развития языка Java для хранения этих символов требовалось 16 бит, и поэтому в Java был внедрен 16-разрядный тип char. Диапазон допустимых значений этого типа данных составляет от 0 до 65536. Отрицательных значений типа char не существует. Переменной типа char можно присвоить как значение самого символа, так и его код. Значение символа заключается в одинарные кавычки, например: ‘x’.

И, наконец, в 34 строке объявлена переменная имеет тип boolean. Переменные этого типа могут принимать только одно из двух значений: true (истинное) или false (ложное). Значения этого логического типа возвращаются из всех операций сравнения вроде а < b.
 

Арифметические операции

Над числовыми переменными есть возможность выполнять различные арифметические операции. Полный список таких операций представлен ниже в таблице:

Операция

Описание

+

Сложение

Вычитание

*

Умножение

/

Деление

%

Деление по модулю

++

Инкремент (увеличиваем значение на 1)

+=

Сложение с присваиванием

=

Вычитание с присваиванием

*=

Умножение с присваиванием

/=

Деление с присваиванием

%=

Деление по модулю с присваиванием

--

Декремент (уменьшаем значение на 1)

( )

Круглые скобки служат для изменения порядка действий (как в математике)

Давайте закрепим полученные знания на практике и напишем простейший калькулятор, который будет запрашивать 2 числа и выполнять над ними различные арифметические операции. Для удобства я создам отдельный класс Calculator и добавлю в него метод main:

Класс Calculator

Исходный код программы представлен ниже:

package ru.akutepov;

import java.util.Scanner;

public class Calculator {

    public static void main(String[] args) {
        Scanner input = new Scanner(System.in);

        double a = input.nextDouble();
        double b = input.nextDouble();

        double c = a + b;
        System.out.println("a + b = " + c);

        c = a - b;
        System.out.println("a - b = " + c);

        c = a / b;
        System.out.println("a / b = " + c);

        c = a * b;
        System.out.println("a * b = " + c);
    }

}

Первое что бросается в глаза - строчка под номером 8, в которой объявлена переменная ссылочного типа Scanner. С помощью оператора new выделяется память для объекта класса Scanner и ссылка на данный объект сохраняется в переменную под названием input (название можно задать любое). В круглых скобках передаются параметры конструктора класса Scanner, в данном случае поток ввода. Таким образом, с помощью объекта класса Scanner можно читать из консоли данные, которые ввёл пользователь. Мы также обязаны проимпортировать используемый класс, если он находится в другом пакете. В моём примере импортируется класс Scanner в строчке 3 с помощью оператора import, при этом указывается полное название пакета, в котором находится класс Scanner: import java.util.Scanner;

Более подробно о ссылочных типах я расскажу позже, сейчас важно знать что в проекте есть переменная input, которая хранит ссылку на объект класса Scanner, благодаря чему есть возможность читать данные из консоли.

В строке 10 и 11 объявляются новые переменные a и b типа double и в них записывается значение, прочитанное из консоли. Чтение типа double из консоли выполняется с помощью вызова метода nextDouble(). Данный метод находится в классе Scanner и вызвать его можно с помощью переменной, которая хранит ссылку на объект класса Scanner - в нашем случае это переменная input. При этом имя переменной и имя метода разделены точкой: input.nextDouble(); Так как метод nextDouble() не принимает никаких аргументов, то после названия метода идут пустые круглые скобки.

Для каждого типа данных в классе Scanner существует свой метод. Например если нужно прочитать значения типа int, то необходимо воспользоваться методом nextInt(). С полным списков методов можно ознакомиться тут: https://docs.oracle.com/javase/7/docs/api/java/util/Scanner.html

В строке 13 я объявил переменную c, которой сразу присваивается сумма значений переменных a и b.

В строке 14 мы полученный результат выводится в консоль. Для этого добавляем к строке "a + b = " значение переменной c, при этом используя оператор +. Такая операция называется конкатенацией - склеивание двух строк или строки и примитивного типа. Если бы a и b были равны 1, то в консоль была бы выведена строка “a + b = 2” - всё просто!

Начиная со строки 16 и далее мы записываем в переменную c новое значение, используя другую операцию, а затем снова выводим в консоль результат. Таким образом калькулятор получает 2 значения и выполняет сложение, вычитание, деление и умножение. Вот пример работы готовой программы:


Результат работы программы

Резюме: мы с вами только в начале пути, но уже написали несколько простых программ. При этом пришлось разобрать достаточно большое количество материала, поэтому для закрепление необходимо решить несколько задачек. Это очень важно, так как без практики теория очень быстро забывается.

Домашнее задание:

  1. Пользователь вводит длины сторон прямоугольника. Напишите программу, которая будет вычислять площадь прямоугольника. Результат вывести в консоль.
  2. Дана формула: a + b (a - c) + c / (b + a), написать программу, вычисляющую данное выражение. Значение переменных считывать из консоли, результат вывести в консоль.
  3. Написать программу, которая сможет рассчитать идеальный вес человека по формуле Лоренца: Идеальный вес = (рост минус 100) – (рост минус 150)/4

< Предыдущий урок     Следующий урок >