Базовые типы данных Java

Переменная используется для выделения памяти для хранения значений. То есть при создании переменной необходимо выделить место в памяти.

Система управления памятью выделяет переменной область хранения в зависимости от её типа, и выделенное пространство можно использовать только для хранения данных этого типа.

Следовательно, определяя переменные разных типов, можно хранить в памяти целые числа, десятичные дроби или символы.

Два основных типа данных Java:

  • Встроенные типы данных
  • Ссылочные типы данных

Встроенные типы данных

Язык Java предоставляет восемь примитивных типов. Шесть числовых типов (четыре целочисленных типа, два типа с плавающей запятой), один символьный тип и один логический тип.

byte:

  • Тип данных byte — это 8-битное знаковое целое число, представленное в дополнительном коде;
  • Минимальное значение —-128(-2^7);
  • Максимальное значение —127(2^7-1);
  • Значение по умолчанию —0;
  • Тип byte используется в больших массивах для экономии места, в основном вместо целых чисел, потому что переменная типа byte занимает лишь одну четверть пространства типа int;
  • Пример: byte a = 100, byte b = -50.

short:

  • Тип данных short — это 16-битное знаковое целое число, представленное в дополнительном коде;
  • Минимальное значение —-32768(-2^15);
  • Максимальное значение —32767(2^15 - 1);
  • Тип данных short также может экономить место, как byte. Переменная типа short занимает половину объёма памяти, занимаемого переменной типа int;
  • Значение по умолчанию —0;
  • Пример: short s = 1000, short r = -20000.

int:

  • Тип данных int — это 32-битное знаковое целое число, представленное в дополнительном коде;
  • Минимальное значение —-2,147,483,648(-2^31);
  • Максимальное значение —2,147,483,647(2^31 - 1);
  • Как правило, целочисленные переменные по умолчанию имеют тип int;
  • Значение по умолчанию —0 ;
  • Пример: int a = 100000, int b = -200000.

long:

  • Тип данных long — это 64-битное знаковое целое число, представленное в дополнительном коде;
  • Минимальное значение —-9,223,372,036,854,775,808(-2^63);
  • Максимальное значение —9,223,372,036,854,775,807(2^63 -1);
  • Этот тип в основном используется в системах, где требуются относительно большие целые числа;
  • Значение по умолчанию —0L;
  • Пример:long a = 100000L,long b = -200000L。
    Символ "L" теоретически нечувствителен к регистру, но если записать его как "l", его легко спутать с цифрой "1" и трудно различить. Поэтому лучше использовать заглавную букву.

float:

  • Тип данных float — это 32-битное число с плавающей запятой одинарной точности, соответствующее стандарту IEEE 754;
  • float позволяет экономить память при хранении больших массивов чисел с плавающей запятой;
  • Значение по умолчанию —0.0f;
  • Числа с плавающей запятой нельзя использовать для представления точных значений, таких как денежные суммы;
  • Пример: float f1 = 234.5f.

double:

  • Тип данных double — это 64-битное число с плавающей запятой двойной точности, соответствующее стандарту IEEE 754;
  • Тип по умолчанию для чисел с плавающей запятой — double;
  • Тип double также не может представлять точные значения, такие как денежные суммы;
  • Значение по умолчанию —0.0d;
  • Пример:

    double   d1  = 7D ;
    double   d2  = 7.; 
    double   d3  =  8.0; 
    double   d4  =  8.D; 
    double   d5  =  12.9867; 

    7 — это литерал int, а 7D, 7. и 8.0 — литералы double.

boolean:

  • Тип данных boolean представляет один бит информации;
  • Он имеет только два значения: true и false;
  • Этот тип используется только как флаг для записи условий true/false;
  • Значение по умолчанию —false;
  • Пример: boolean one = true.

char:

  • Тип char — это один 16-битный символ Unicode;
  • Минимальное значение —\u0000(десятичный эквивалент равен 0);
  • Максимальное значение —\uffff(i.e., 65535);
  • Тип данных char может хранить любой символ;
  • Пример: char letter = 'A';.

Пример

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

Пример

public class PrimitiveTypeTest { public static void main(String[] args) { // byte System.out.println("Примитивный тип: byte Двоичные цифры:" + Byte.SIZE); System.out.println("Класс-обёртка: java.lang.Byte"); System.out.println("Минимальное значение: Byte.MIN_VALUE=" + Byte.MIN_VALUE); System.out.println("Максимальное значение: Byte.MAX_VALUE=" + Byte.MAX_VALUE); System.out.println(); // short System.out.println("Примитивный тип: short Двоичные цифры:" + Short.SIZE); System.out.println("Класс-обёртка: java.lang.Short"); System.out.println("Минимальное значение: Short.MIN_VALUE=" + Short.MIN_VALUE); System.out.println("Максимальное значение: Short.MAX_VALUE=" + Short.MAX_VALUE); System.out.println(); // int System.out.println("Примитивный тип: int Двоичные цифры:" + Integer.SIZE); System.out.println("Класс-обёртка: java.lang.Integer"); System.out.println("Минимальное значение: Integer.MIN_VALUE=" + Integer.MIN_VALUE); System.out.println("Максимальное значение: Integer.MAX_VALUE=" + Integer.MAX_VALUE); System.out.println(); // long System.out.println("Примитивный тип: long Двоичные цифры:" + Long.SIZE); System.out.println("Класс-обёртка: java.lang.Long"); System.out.println("Минимальное значение: Long.MIN_VALUE=" + Long.MIN_VALUE); System.out.println("Максимальное значение: Long.MAX_VALUE=" + Long.MAX_VALUE); System.out.println(); // float System.out.println("Примитивный тип: float Двоичные разряды:" + Float.SIZE); System.out.println("Класс-обертка: java.lang.Float"); System.out.println("Минимальное значение: Float.MIN_VALUE=" + Float.MIN_VALUE); System.out.println("Максимальное значение: Float.MAX_VALUE=" + Float.MAX_VALUE); System.out.println(); // double System.out.println("Примитивный тип: double Двоичные разряды:" + Double.SIZE); System.out.println("Класс-обертка: java.lang.Double"); System.out.println("Минимальное значение: Double.MIN_VALUE=" + Double.MIN_VALUE); System.out.println("Максимальное значение: Double.MAX_VALUE=" + Double.MAX_VALUE); System.out.println(); // char System.out.println("Примитивный тип: char Двоичные цифры:" + Character.SIZE); System.out.println("Класс-оболочка: java.lang.Character"); //Выведите Character.MIN_VALUE в консоль как числовое значение, а не как символ. System.out.println("Минимальное значение: Character.MIN_VALUE=" + (int) Character.MIN_VALUE); //Выведите Character.MAX_VALUE в консоль как числовое значение, а не как символ. System.out.println("Максимальное значение: Character.MAX_VALUE=" + (int) Character.MAX_VALUE); } }

Запустить пример »

Компиляция приведённого выше кода даёт следующий вывод:

基本类型:byte 二进制位数:8
包装类:java.lang.Byte
最小值:Byte.MIN_VALUE=-128
最大值:Byte.MAX_VALUE=127

基本类型:short 二进制位数:16
包装类:java.lang.Short
最小值:Short.MIN_VALUE=-32768
最大值:Short.MAX_VALUE=32767

基本类型:int 二进制位数:32
包装类:java.lang.Integer
最小值:Integer.MIN_VALUE=-2147483648
最大值:Integer.MAX_VALUE=2147483647

基本类型:long 二进制位数:64
包装类:java.lang.Long
最小值:Long.MIN_VALUE=-9223372036854775808
最大值:Long.MAX_VALUE=9223372036854775807

基本类型:float 二进制位数:32
包装类:java.lang.Float
最小值:Float.MIN_VALUE=1.4E-45
最大值:Float.MAX_VALUE=3.4028235E38

基本类型:double 二进制位数:64
包装类:java.lang.Double
最小值:Double.MIN_VALUE=4.9E-324
最大值:Double.MAX_VALUE=1.7976931348623157E308

基本类型:char 二进制位数:16
包装类:java.lang.Character
最小值:Character.MIN_VALUE=0
最大值:Character.MAX_VALUE=65535

Минимальное и максимальное значения Float и Double выводятся в экспоненциальной форме. Завершающее "E+число" указывает, что число перед E нужно умножить на 10 в степени этого числа. Например, 3.14E3 — это 3.14 × 103=3140, а 3.14E-3 — это 3.14 x 10-3 =0.00314.

На самом деле, в Java есть ещё один примитивный тип — void, у которого также есть соответствующий класс-оболочка java.lang.Void, но мы не можем напрямую с ними работать.

Значения по умолчанию для типов

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

Тип данныхЗначение по умолчанию
int0
long0L
short0
char'\u0000'
байт0
float0.0f
double0.0d
логическое значениеfalse
Ссылочные типы (классы, интерфейсы, массивы)null

Примечания:

  • int, short, long, byteЗначение по умолчанию равно 0.
  • charЗначение по умолчанию —\u0000(нулевой символ).
  • floatЗначение по умолчанию —0.0f。
  • doubleЗначение по умолчанию —0.0d。
  • booleanЗначение по умолчанию —false。
  • Значение по умолчанию для ссылочных типов (классов, интерфейсов, массивов) —null。

Пример

public class Test { static boolean bool; static byte by; static char ch; static double d; static float f; static int i; static long l; static short sh; static String str; public static void main(String[] args) { System.out.println("Bool :" + bool); System.out.println("Byte :" + by); System.out.println("Character:" + ch); System.out.println("Double :" + d); System.out.println("Float :" + f); System.out.println("Integer :" + i); System.out.println("Long :" + l); System.out.println("Short :" + sh); System.out.println("String :" + str); } }

Примеры вывода:

Bool     :false
Byte     :0
Character:
Double   :0.0
Float    :0.0
Integer  :0
Long     :0
Short    :0
String   :null

Ссылочные типы

  • В Java переменные ссылочного типа очень похожи на указатели в C/C++. Ссылочный тип указывает на объект, а переменная, указывающая на объект, является ссылочной переменной. При объявлении эти переменные указываются как конкретный тип, например Employee, Puppy и т. д. После объявления переменной её тип нельзя изменить.
  • Объекты и массивы являются ссылочными типами данных.
  • Значение по умолчанию для всех ссылочных типов — null.
  • Ссылочную переменную можно использовать для ссылки на любой совместимый тип.
  • Пример: Site site = new Site("Example").

Константы Java

Константы нельзя изменять во время работы программы.

В Java ключевое слово final используется для определения констант. Способ объявления аналогичен переменным:

final double PI = 3.1415927;

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

Литералы можно присваивать переменным любого встроенного типа. Например:

byte a = 68;
char a = 'A'

byte, int, long и short могут быть представлены в десятичной, шестнадцатеричной и восьмеричной системах счисления.

При использовании литералов префикс0указывает на восьмеричную систему, а префикс0xобозначает шестнадцатеричную, например:

int decimal = 100;
int octal = 0144;
int hexa =  0x64;

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

"Hello World"
"two\nlines"
"\"This is in quotes\""

И строковые константы, и символьные переменные могут содержать любые символы Unicode. Например:

char a = '\u0001';
String a = "\u0001";

Язык Java поддерживает некоторые специальные управляющие последовательности символов.

Символ Значение символа
\n Новая строка (0x0a)
\r Возврат каретки (0x0d)
\f Подача страницы (0x0c)
\b Возврат на шаг (0x08)
\0 Нулевой символ (0x0)
\s Пробел (0x20)
\t Вкладка
\" Двойная кавычка
\' Одинарная кавычка
\\ Обратная косая черта
\ddd Восьмеричный символ (ddd)
\uxxxx Шестнадцатеричный символ Unicode (xxxx)

Автоматическое преобразование типов

Целочисленные, вещественные (константные) и символьные данные можно смешивать в операциях. Во время операций данные разных типов сначала преобразуются к одному типу, затем выполняется операция.

Преобразование идёт от низкого уровня к высокому.

低  ------------------------------------>  高

byte,short,char—> int —> long—> float —> double 

Преобразование типов данных должно удовлетворять следующим правилам:

  • 1. Преобразование типов нельзя выполнять для типа boolean.

  • 2. Объектные типы нельзя преобразовывать в объекты несвязанных классов.

  • 3. При преобразовании типа с большей ёмкостью к типу с меньшей ёмкостью необходимо использовать принудительное преобразование типа (cast).

  • 4. Процесс преобразования может вызвать переполнение или потерю точности, например:

    int i =128;   
    byte b = (byte)i;
    

    Поскольку тип byte занимает 8 бит и его максимальное значение равно 127, при принудительном преобразовании int в byte значение 128 вызовет переполнение.

  • 5. Преобразование из числа с плавающей точкой в целое выполняется отбрасыванием дробной части, а не округлением, например:

    (int)23.7 == 23;        
    (int)-45.89f == -45
    

Автоматическое преобразование типов

Разрядность типа данных до преобразования должна быть меньше, чем у типа данных после преобразования. Например: тип short имеет 16 бит, поэтому он может автоматически преобразовываться в тип int с 32 битами; аналогично тип float имеет 32 бита и может автоматически преобразовываться в тип double с 64 битами.

Пример

public class ZiDongLeiZhuan{ public static void main(String[] args){ char c1='a';//Определите тип char int i1 = c1;//char автоматически преобразуется в int System.out.println("Значение после автоматического преобразования char в int равно"+i1); char c2 = 'A';//Определите тип char int i2 = c2+1;//Вычислить с типом char и типом int System.out.println("Значение после вычисления с типами char и int равно"+i2); } }

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

char自动类型转换为int后的值等于97
char类型和int计算后的值等于66

Анализ:Значение c1 — это символa, проверка таблицы ASCII показывает, что соответствующее значение int равно 97, а A соответствует 65, поэтомуi2=65+1=66。

Приведение типов

  • 1. Условие: преобразуемые типы данных должны быть совместимы.

  • 2. Формат: (type)value, где type — это тип данных после принудительного преобразования типа. Пример:

    Пример

    public class ForceTransform { public static void main(String[] args){ int i1 = 123; byte b = (byte)i1;//Принудительное преобразование типа к byte System.out.println("Значение после принудительного преобразования int к byte равно"+b); } }

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

    int强制类型转换为byte后的值等于123
    

Неявное преобразование типов

  • 1. По умолчанию целые числа имеют тип int.

  • 2. Числа с плавающей точкой по умолчанию имеют тип double; при определении типа float нужно добавлять F или f после числа.

В этом разделе объяснялись основные типы данных Java. В следующем разделе будут рассмотрены различные типы переменных и их использование.

Другие расширения