Java/Типы данных
В Java есть 8 примитивных типов, которые делят на 4 группы, вот они:
- Целые числа — byte, short, int, long
- Числа с плавающей точкой (иначе вещественные) — float, double
- Логический — boolean
- Символьный — char
Целочисленные типы [ править ]
Целочисленные типы различаются между собой только диапазонами возможных значений, например, для хранения номера элемента в таблице Менделеева пока хватит переменной типа byte.
| Тип | Размер (бит) | Диапазон |
|---|---|---|
| byte | 8 бит | от -128 до 127 |
| short | 16 бит | от -32768 до 32767 |
| char | 16 бит | беззнаковое целое число, представляющее собой символ UTF-16 (буквы и цифры) |
| int | 32 бит | от -2147483648 до 2147483647 |
| long | 64 бит | от -9223372036854775808L до 9223372036854775807L |
Пример использования целочисленных типов:
public class IntegralTypes public static void main(String[] args) byte b = 216; // Вот тут будет ошибка, т.к. у нас диапазон от -128 до 127! short s = 1123; int i = 64536; long l = 2147483648L; // Постфикс l или L обозначает литералы типа long System.out.println(i); System.out.println(b); System.out.println(s); System.out.println(l); > >
Символы тоже относят к целочисленным типам из-за особенностей представления в памяти и традиций.
public class Characters public static void main(String[] args) char a = 'a', b, c = 'c'; b = (char) ((a + c) / 2); // Можно складывать, вычитать, делить и умножать // Но из-за особенностей арифметики Java результат приходится приводить к типу char явно System.out.println(b); // Выведет символ 'b' > >
Типы с плавающей точкой [ править ]
| Тип | Размер (бит) | Диапазон |
|---|---|---|
| float | 32 | от 1.4e-45f до 3.4e+38f |
| double | 64 | от 4.9e-324 до 1.7e+308 |
public class FloatingPointTypes public static void main(String[] args) double a, b = 4.12; a = 22.1 + b; float pi = 3.14f; // При использовании типа float требуется указывать суффикс f или F // так как без них типом литерала будет считаться double float anotherPi = (float) 3.14; // Можно привести явно double c = 27; double d = pi * c; System.out.println(d); > >
Логический тип [ править ]
| Тип | Размер (бит) | Значение |
|---|---|---|
| boolean | 8 (в массивах), 32 (не в массивах используется int) | true (истина) или false (ложь) |
В стандартной реализации Sun JVM и Oracle HotSpot JVM тип boolean занимает 4 байта (32 бита), как и тип int. Однако, в определенных версиях JVM имеются реализации, где в массиве boolean каждое значение занимает по 1-му байту.
Ссылочные [ править ]
Ссылочные типы — это все остальные типы: классы, перечисления и интерфейсы, например, объявленные в стандартной библиотеке Java, а также массивы.
Строки [ править ]
Строки это объекты класса String, они очень распространены, поэтому в некоторых случаях обрабатываются отлично от всех остальных объектов. Строковые литералы записываются в двойных кавычках.
public class Strings public static void main(String[] args) String a = "Hello", b = "World"; System.out.println(a + " " + b); // Здесь + означает объединение (конкатенацию) строк // Пробел не вставляется автоматически // Строки конкатенируются слева направо, надо помнить это когда соединяешь строку и примитив String c = 2 + 2 + ""; // "4" String d = "" + 2 + 2; // "22" d = "" + (2 + 2); // а теперь d тоже "4" String foo = "a string"; String bar = "a string"; // bar будет указывать на тот же объект что и foo String baz = new String("a string"); // Чтобы гарантированно создать новую строку надо вызвать конструктор System.out.println("foo == bar ? " + (foo == bar)); // == сравнивает ссылки на объекты System.out.println("foo равен bar ? " + (foo.equals(bar))); // Метод equals служит для проверки двух объектов на равенство System.out.println("foo == baz ? " + (foo == baz)); System.out.println("foo равен baz ? " + (foo.equals(baz))); > >
Эта программа выведет:
Hello World
foo == bar ? true
foo равен bar ? true
foo == baz ? false
foo равен baz ? true
Обертки [ править ]
Если требуется создать ссылку на один из примитивных типов данных, необходимо использовать соответствующий класс-обертку. Также в таких классах есть некоторые полезные методы и константы, например минимальное значение типа int можно узнать использовав константу Integer.MIN_VALUE. Оборачивание примитива в объект называется упаковкой (boxing), а обратный процесс распаковкой (unboxing).
| Тип | Класс-обертка |
|---|---|
| byte | Byte |
| short | Short |
| int | Integer |
| long | Long |
| char | Character |
| float | Float |
| double | Double |
| boolean | Boolean |
int i; Integer boxed; // Обычное создание объекта boxed = new Integer(i); // Фабричный метод boxed = Integer.valueOf(i); // Автоматическая упаковка, компилятор просто вставит вызов Integer.valueOf boxed = i;
Рекомендуется использовать valueOf, он может быть быстрее и использовать меньше памяти потому что применяет кэширование, а конструктор всегда создает новый объект.
Получить примитив из объекта-обертки можно методом Value.
Integer boxed; int i; // Явная распаковка i = boxed.intValue(); // Автоматическая распаковка i = boxed;
Типы данных в Java
Java — строго типизированный язык . Это означает, что тип каждой переменной должен быть объявлен . Во время компиляции должен быть известен тип каждой переменной и каждого выражения. Компилятор проверяет соответствие типов и предотвращает некорректные операции присваивания. Используются следующие типы данных:
простые типы;
ссылочные (или объектные) типы.
Простые типы
Простые типы данных в Java имеют фиксированную разрядность, не зависящую от платформы. Разрядность фиксирована на уровне языка. В Java определены 8 простых типов данных :
| Тип | Разрядность (бит) | Значение по умолчанию | |
| boolean | Логическое значение true или false | — | false |
| byte | Целое со знаком | 8 | 0 |
| char | Unicode-символ | 16 | ‘\u0000’ |
| short | Целое со знаком | 16 | 0 |
| int | Целое со знаком | 32 | 0 |
| long | Целое со знаком | 64 | 0L |
| float | Число с плавающей точкой | 32 | 0.0F |
| double | Число с плавающей точкой | 64 | 0.0D |
Замечания: 1. В Java, в отличие от C++, нет беззнаковых целых типов . 2. Тип char используется для хранения символов в кодировке Unicode , которая позволяет работать с алфавитами различных языков. Первые 256 символов соответствуют стандарту ASCII. 3. Все простые типы данных по умолчанию инициализируются (см. табл.). 4. В Java существуют специальные классы (классы-оболочки) для простых типов. Они содержатся в пакете java.lang и имеют очевидные имена: Integer , Float , Double , Short , Byte , Character , Boolean . В этих классах определены полезные методы преобразования типов, например, методы преобразования строк, состоящих из цифр, в числа. В классе Integer, в частности, есть метод static int parseInt(String s) преобразующий строку в целое число. Кроме того, в классах-оболочках имеются поля-константы MAX_VALUE , MIN_VALUE , которые хранят граничные значения диапазона соответствующего типа данных. 5. Приведение типов в Java осуществляется автоматически и с помощью операции явного приведения типов. Неявное приведение простых типов (преобразование типов) Можно преобразовать любой тип из последовательности к любому другому, расположенному справа: byte , short, int, long, float, double; char, int, long, float, double; Явное приведение простых типов осуществляется с помощью оператора (тип) имя_переменной
Внимание! Нельзя выполнять приведение целого типа эквивалентом значения false , а ненулевая величина необходимости можно выполнять следующим образом: . boolean boolx; int intx; . boolx = intx != 0; intx = boolx ? 1 : 0;
к типу boolean и наоборот. В Java значение 0 не является — значения true , в отличие от C++. Преобразования при
Ссылочные (объектные) типы
Объектами в Java являются:
экземпляр класса;
массив.
Скачано с сайта http://ivc.clan.su Величины ссылочного типа — это ссылки на объекты. Переменная, имеющая ссылочный тип, содержит ссылку на объект. Ссылка является своего рода указателем, но с ней нельзя выполнять операции, допустимые в языках С и C++. Ссылочные типы:
типы классов;
типы интерфейсов;
типы массивов. Имя любого класса (интерфейса) в Java может рассматриваться как имя типа данных. Замечания • Объявление переменной ссылочного типа не создаёт соответствующий объект. Для создания объекта следует использовать оператор new . • Для всех ссылочных типов значение по умолчанию равно null . Слово null в Java используется для обозначения так называемой нулевой ссылки . Пример . Color c1, с2; // переменные ссылочного типа Color при объявлении // инициализированы значениями null
| . | ||||
| c1 | = new Color(100, 100, 100); // создание | 1-го объекта типа | Color | |
| с2 | = new Color(200, 200, 200); // создание | 2-го объекта типа | Color | |
| c1 | = с2; | // теперь переменные с1 и с2 хранят ссылку на 2-й объект | ||
| . | // Color 1-й объект Color будет удален сборщиком мусора | |||
Строки в Java
• Язык Java не имеет простого строкового типа. Для работы со строками используется ссылочный тип String . Класс String содержится в пакете java.lang. Любая строка в Java является объектом и к ней применимы все действия, выполняемые над объектами. • Строку можно создать с помощью оператора new. Возможен также неявный способ создания объектов типа String: String strl = «Новая строка»; String str2 = new String («Новая строка»); • Строки можно объединять, используя оператор конкатенации строк (единственный в Java перегруженный оператор «+»): str2 = strl + «еще одна строка»; • Класс String предназначен для работы со строковыми константами (литералами). Методы класса, модифицирующие объект String, реально не изменяют его, а создают дополнительный объект String. В пакете java.lang имеется класс StringBuffer , позволяющий создавать строковые объекты, которые можно изменять. • В Java в каждом классе определен метод toString() , который предназначен для преобразования объектов этого класса в строку (метод наследуется от класса Object).
Массивы в Java
Массивы в Java, как и экземпляры классов, являются объектами . Массивы представляют собой наборы однотипных элементов и могут содержать данные простых типов и данные ссылочных типов, т.е. ссылки на объекты (экземпляры классов или другие массивы). Для задания массива необходимо выполнить следующие действия: 1. Объявление массива При этом задается тип элементов массива, массиву присваивается имя, создается ссылка на массив . Например: int myIntArr[]; // объявление массива данных целого типа int[] myIntArr; // более предпочтительный вариант размещения скобок
Основные отличия примитивных типов от непримитивных в Java
Возьмусь предположить, что вы спрашиваете разницу между примитивными типами и классами обертками.
Примитивные типы
- Выигрыш в производительности.
Оболочки (обертки) типов
- Являются частью объектной иерархии.
- Необходимы в случаях когда класс может работать только с объектами.
- Удобство использования таких полей как MAX_VALUE и.т.д.
P.S.
Прекрасный ответ о причинах введения автоматической автоупаковки/распаковки.
Отслеживать
ответ дан 3 мар 2017 в 20:09
Sanek Zhitnik Sanek Zhitnik
2,212 2 2 золотых знака 17 17 серебряных знаков 28 28 бронзовых знаков
Непримитивные являются классами, потомками Object. Соответственно, передаются по ссылке. К ним применяются все правила работы с классами и объектами. Это часто бывает нужно, если их нужно передать в качестве аргумента методу, принимающему Object. Или указать в качестве параметра типа для Generic-а. Например, List . Но не может быть List .
В свою очередь, примитивные типы передаются по значению. Занимают меньше памяти и лишены при обработке оверхеда объектов. Во многих случаях при присвоении или передаче значения Java конвертирует примитивные типы в их объектные обёртки и обратно автоматически.
EDIT: Важно не путать, что именно мы передаём по значению, а что — по ссылке. Любая переменная ссылочного типа (reference type) хранит в себе ссылку на объект или null, если она не связана с объектом. Так же, как и в случае с переменной примитивного типа, переменная ссылочного типа передаётся по значению. В этом смысле разницы между ними нет.
Однако большая разница возникает, когда думаем о передаче примитива и объекта (или массива).
Передавая примитивное значение, в вызванном методе мы теряем всякую связь с прежней переменной, содержавшей это значение, и никак на неё повлиять не можем.
Однако, передавая ссылку, мы получаем ключ к объекту или массиву, что в общем случае создаёт проблему shared mutable state и может привести к разного рода «сюрпризам», когда объект-владелец переменной внезапно обнаруживает (или даже и не обнаруживает), что значение его атрибута изменилось.
С помощью специальных методик проектирования классов (или специальных библиотек с такими классами) можно добиться того, чтобы однажны созданные экземпляры ссылочных типов было (почти) невозможно изменить. Ключевые слова: immutable type, persistent type, value object. В языках JVM, ориентированных на функциональное программирование, такие типы входят в базовую библиотеку. В самой Java таким образом реализованы, например, обёртки над примитивными типами и String.
Какой из типов данных является ссылочным объектным java
,Что за бред. Сначало вы говорите строка это ссылочный тип, потом говорите примитивный так как она состоит из символов, потом говорите это ссылочный потому что это класс. Так какой он тип может кто-то объяснить нормально?
YesOn Уровень 13
1 августа 2021
Не понял про неизменяемость класса String: String text = «This TV»; text = text + » is very loud»; Вторая строка написана ошибочно и компилятор её не пропустит? Потому что переменная text так и останется со значением = «This TV»; ? Или что имелось ввиду?
gunsroses Уровень 22
14 сентября 2020
TV telly = new TV(); Переменной типа TV с именем telly мы задаем ссылку на создаваемый объект типа TV. скажите пожалуйста, тип переменной и объекта TV должны быть одинаковыми это понятно, а где сам объект . )
14 апреля 2020
Спасибо за статью, гораздо понятней чем лекция в курсе, но все же кой что до конца так и не понял а именно назначение вот этой строки: final TV telly = new TV(); Для чего она , и если написать вот так : public class TV < int numberOfChannel; int soundVolume; boolean isOn; public void enableTV ()< int x= TV.numberOfChannel; >>
Demitelix Уровень 11
11 апреля 2020
sergey Уровень 22
10 апреля 2020
статья по мотивам Head First Java?
Сообщество
JavaRush — это интерактивный онлайн-курс по изучению Java-программирования c нуля. Он содержит 1200 практических задач с проверкой решения в один клик, необходимый минимум теории по основам Java и мотивирующие фишки, которые помогут пройти курс до конца: игры, опросы, интересные проекты и статьи об эффективном обучении и карьере Java‑девелопера.
Подписывайтесь
Язык интерфейса
«Программистами не рождаются» © 2024 JavaRush
Скачивайте наши приложения
«Программистами не рождаются» © 2024 JavaRush
Этот веб-сайт использует данные cookie, чтобы настроить персонально под вас работу сервиса. Используя веб-сайт, вы даете согласие на применение данных cookie. Больше подробностей — в нашем Пользовательском соглашении.