6 апр. 2015 г.

Типы данных Java – Введение

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

Типы данных в языке Java, делятся на две группы: примитивные типы (primitive types) и ссылочные типы (reference types).

Существует так же специальный тип данныхnull. Переменную этого типа создать не возможно, но можно присвоить значение null (только) ссылочному типу данных.

Примитивные типы данных Java
Существует восемь примитивных типов данных в Java:
Примитивные типы хранят значение.

Ссылочные типы данных Java
Существует четыре типа ссылочных данных в Java:
Ссылочные типы хранят ссылку на объект, или же тип данных null, то есть нулевую (пустую) ссылку.

Так же существует очень много программистских мифов и фольклорных данных, которые по разному классифицируют принадлежность всех вышеперечисленных типов. Иногда, к примеру, тип char выделают в отельный тип, так как он представляет символы, но как вы можете убедится сами из оригинальной документации по Java – это не так. Char (символьный тип), в оригинальной документации, относят к целым типам данных, потому что над ними можно выполнять все те же самые операции, что и над обычными числовыми типами. Так же, почему то, очень часто пропускают типизированные переменные и в ссылочных типах указывать только три оставшихся. Или выделяют enum в отдельный тип ссылочных данных, хотя он относится к классам, так же поступают иногда и с классом String – выделяют его в отельный вид ссылочных данных, хотя это тоже класс. Все это тайна покрытая мраком, но свет изначальной документации выведет нас к истине!

На этом лирическое отступление закончим и зафиксируем знания о типах данных Java запомнив простую диаграмму приведенную ниже.

Java_data_types

Если вы были внимательны, то заметили, что я подсветил желтым, чем отличаются примитивные типы данных от ссылочных. Это конечно не единственное различие, но самое основное. Еще раз повторюсь, что В Java все является объектом, за исключением примитивных типов. Так вот, примитивные типы передаются по значению, а ссылочные по ссылке. Масло масленное.

Чтобы разобраться с этим надо рассмотреть пример. И тут без объектов и классов опять не обойтись. Но сейчас мы упомянем ссылочные типы, только чтобы на их примере понять чем от них отличаются примитивные типы.

Приведу простую программу для демонстрации это принципиальной разницы:

JT0001

А теперь приведу вывод этой программы в консоли Eclipse

JT0002

Ключевые строки в листинге это 10, 12, 20 и 23. Как видим в строке 10 мы присвоили j то же значение что и i. И далее инкрементировали j. Затем вывели результат. Как видим i и j имеют разные значения. А вот с классом Dog, который является ссылочным типом данных все уже не так. В 20 строке мы присвоили экземпляру thatDog значение экземпляра thisDog, затем вывели результат, который показал одинаковые значения для обоих экземпляров, что не удивительно. Затем для экземпляра thatDog в 23 строке мы поменяли имя и снова вывели результат. И опять нам показали одинаковые значения. Это произошло потому, что ссылочные типы данных хранят не значение, а ссылку на объект и в данном случае происходит присвоение ссылки, а не значения. Таким образом оба экземпляра thisDog и thatDog указывают на один и тот же объект в памяти.

Может сейчас это все и не понятно, но в голове должно отложится и со временем все прояснится. Чтобы чуть более прояснить это, чуть чуть изменим программу и покажем что же на самом деле храниться в экземплярах thisDog и thatDog.

JT0003

Я добавил строки 22 и 28, которые будут выводить значение того что реально хранится в объектах thisDog и thatDog. И вот вывод на консоль Eclipse:

JT0004

Как видим и thisDog и thatDog хранят один и тот же указатель на область в памяти где располагается экземпляр класса Dog.

Ну и чтобы все стало еще чуть более понятней приведу исходник класса Dog:

JT0005

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

Так же, в какой-то мере, к типам данных можно отнести тип данных void. Переменную этого типа создать нельзя, так как этот тип используется только для того, чтобы обозначать методы классов которые ни чего не возвращают.

1 комментарий: