Что хранится в переменной не примитивного типа

Что хранится в переменной не примитивного типа

Базовый ответ: значение переменной хранится в стеке. Есть программа, ей при запуска ОС выдает кусок памяти. В этом куске есть стек переменных, там и хранится эта глобалка.

Любая переменная скрывает собой указатель. Грубо говоря, ты пишешь int a=2, что во время выполнения трансформируется в mov 00ff00aa, 2. Прога во время работы попросит у ОС кусок памяти, и в нем жестко выделит место под примитив. Везде, где в исходниках стоит переменная ‘a’, в бинарниках будет выделенный адрес (компилятор постарается).

Плюс, есть сильная зависимость от языка. Если используется Java, примитив может оказаться в куче (сам не джавист, но в .NET подобные ситуации возможны). Там, по идее, точное расположение в памяти зависит от реализации сборщика. Но тут нужен джавист-спец.

Первая проблема, в C# не может быть глобальных переменных, так же как и в Java.

Если вы объявляете локальную переменную в методе, она попадёт на стек. Если же это поле класса или структуры, то переменная становится частью объекта и поведение зависит от родителя.

C Objective-C не подскажу.

В C иначе, глобальные переменные вкомпиливаются в бинарный файл. Выделяется сегмент данных, при загрузке для него будет выделена память и данные будут скопированы туда средствами ОС. Тут зависит от компилятора и квалификаторов, const скорее всего попадут в отдельный сегмент без привелегий на запись.

Продолжаем серию уроков по программированию на языке Java. И сегодня пора нам написать чуть более сложное приложение, чем «Hello world». Мы будем говорить о типах данных.

Java является строго типизированным языком программирования. Это означает, что переменные имеют конкретный известный тип еще на этапе компиляции. Например, если мы возьмем язык Javascript, то там можно объявить переменную как «var a = 45» или «var b = «Hello». То есть тип переменной здесь не указывается. В Java же, напротив. Если мы хотим объявить некую переменную, нам нужно указать ее тип, чтобы компилятор знал с каким типом он работает. Закрепим прочитанное примером. Откройте наш первый проект, который мы создали в статье о первом приложении и создайте новый класс. Назовем его TypesOfData. Не забудьте при создании поставить галочку, чтобы создался метод main. Теперь можно создать пару переменных. Хм.. Но мы не сможем ничего создать, так как ничего еще не выучили. Нужно еще немного теории.

Читайте также:  Как нарисовать цветок в кореле

В Java есть 8 примитивных типов, которые делят на 3 группы, вот они:

  1. Целые числа — byte, short, char, int, long
  2. Числа с плавающей точкой (иначе дробные) — float, double
  3. Логический — boolean

Целочисленные типы данных

Типы с плавающей точкою. То есть дробные

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

Предлагаю пока поработать с целочисленными типами. Самым «популярным» среди целочисленных типов данных является тип int. Он позволяет хранить достаточно большой диапазон чисел и занимает не всего 32 бита.

Подкрепив наши знания теорией давайте воплотим их на практике. Для этого создайте несколько глобальных переменных в своем классе. Забыл упомянуть, что в Java переменные делятся на глобальные и локальные переменные. Глобальные — это те которые объявленные в классе. Локальные — те которые объявленные в методе. Об их разнице мы поговорим позже.

Вот пример объявленных глобальных приложений. Как Вы могли заметить, я называю переменные и классы в так называемом CamelCase или верблюжий регистр. Это не просто так. Дело в том, что в Java принято объявлять переменные, классы и методы именно в таком стиле. Я советую Вам начать программирование с правильного стиля, который принятый в сообществе программистов для того, чтобы Ваш код могли читать и редактировать другие люди. Также старайтесь называть переменные, методы и классы в читаемом стиле: для класса — это сущность, которую он изображает, для метода — действие, для переменной — читаемое имя, которое ей соответствует.

Мы немного отошли от темы. Давайте теперь попробуем поработать с примитивными типами. Что же можно делать с типами данных в Java? Да все что угодно: добавлять, присваивать им другие значения, отнимать, делить и т.д. Об операциях мы поговорим в следующей статье, так как она очень увеличит данную статью.

Читайте также:  Файловый вирус всегда меняет длину файла

Давайте перенесем наши переменные в main метод и попробуем поиграть с их размерностью. Для начала поэкспериментируем с byte:

public class TypesOfData <

public static void main ( String [ ] args ) <
byte byteVariable = 3 ;

byte newByteVariable = ( byte ) ( byteVariable + 125 ) ; //здесь нам нужно кастить к типу байт, так
//операция распознается как инт
System . out . println ( "First output " + newByteVariable ) ; //так как тип байт имеет размерность -128 127, то добавление к 125 3 будет переполнять размерность
//и мы получим отрицательный результат

System . out . print ( "Second output" ) ;
System . out . println ( byteVariable += 125 ) ; //сокращенную запись нельзя записать с конкатенацией в выводе на консоль как предыдущую
//но для сокращенной записи нам не нужно кастить выражение к типу byte

byte newByteVariable1 = ( byte ) ( byteVariable — 20 ) ;
System . out . println ( "Third output " + newByteVariable1 ) ;
//при отнимании ситуация противоположная. Выход за диапазон размерности даст нам положительный результат
>
>

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

В языке Java существует два типа переменных: примитивные, например int и boolean, а также ссылочные типы вроде Integer и Boolean (классы-обертки). Для каждого примитивного типа существует, соответствующий ему ссылочный тип.

Классы-обертки являются неизменяемыми: это означает, что после создания объекта его состояние (значение поля value) не может быть изменено; и задекларированы, как final
(от этих классов невозможно наследоваться).

Java автоматически производит преобразования между примитивными типами и их обертками:

В зависимости от реализации виртуальной машины, эти значения могут изменяться. Например, в виртуальной машине Oracle значения типа boolean сопоставляются со значениями 0 и 1 типа int (это связано с тем, что в VM нет инструкций для работы с булевыми значениями) и, как результат, занимают в памяти 32 бита.

Читайте также:  Сталкер тень чернобыля вылетает xr 3da exe

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

Ссылочные переменные ссылаются на объекты, которые хранятся в куче, к ним мы имеем более медленный доступ (рекомендуем ознакомиться с понятиями Стек и Куча, для лучшего усвоения материала). Ссылочные типы имеют определенные накладные расходы относительно их примитивных аналогов.

Накладные расходы зависят от реализации конкретной JVM. Здесь мы приведем результаты для 64-х битной виртуальной машины со следующими параметрами:

Ссылка на основную публикацию
Что такое синтаксический пакет
Одна из проблем, с которыми можно столкнуться при установке приложения apk на Android — сообщение: «Синтаксическая ошибка» — ошибка при...
Что отражает двоичная матрица
Представление информации в табличной форме широко распростране­но. Чаще всего мы пользуемся прямоугольными таблицами. Простейшая таблица состоит из строк и граф...
Что означают значки в погоде на айфоне
Самые интересные новости о технике Apple и не только. Что означают значки погоды на iPhone? Сегодняшняя тема весьма заинтересует многих...
Что такое синтаксическая ошибка на андроиде
При попытке распаковать приложение из APK на Android может появляться «Синтаксическая ошибка. При синтаксическом анализе пакета возникла неполадка». Это значит,...
Adblock detector