Главная | Обратная связь | Поможем написать вашу работу!
МегаЛекции

Проект «Hello World!». Проект «Объявление переменных». Преобразование простых типов. Вопрос: Чем возмущен компилятор?. Вопрос: В какой момент эти переменные исчезли из программы, т.е. из стека?




Проект «Hello World! »

Проект «Объявление переменных»

Обратите внимание. Intellsence бежит впереди всех. Интерпретатор скажет, что это неправильно.

Он говорит нам, что переменные не инициализированы. ЯП Java строго типизированный, что означает, что вы обязаны объявлять все переменные, и вы обязаны инициализировать локальные переменные. Исправим это.

run:

СБОРКА УСПЕШНО ЗАВЕРШЕНА (общее время: 0 секунд)

 

Преобразование простых типов.

Видите? Сразу все стало нормально.

А теперь смотрите. Я заменяю int на другой тип данных и программа уже некорректна.

Вопрос: Чем возмущен компилятор?

Ответ: Арифметические операции все работают для int. Не существует такой операции, которая складывает 2 байта, т. е. 2 short. Они конвертируются в 2 int и складываются в 2 int. Поэтому результат деления будет int. А дальше проблема в том, что a имеет тип short. И ЯП Java разрешает компилятору самому преобразовывать только от младшего типа к старшему.

В языке Java действуют следующие правила:

 

Если один операнд имеет тип double, другой тоже преобразуется к типу double.

Иначе, если один операнд имеет тип float, другой тоже преобразуется к типу float.

Иначе, если один операнд имеет тип long, другой тоже преобразуется к типу long.

Иначе оба операнда преобразуются к типу int.

 

Данный способ неявного преобразования встроенных типов полностью совпадает с преобразованием типов в C++.

 

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

 

Вопрос: В какой момент эти переменные исчезли из программы, т. е. из стека?

Вы знаете, что такое стек?

Внутриблока кода у нас выделяется место в стеке под три переменных. Считайте, что стек – это та же самая оперативная память, но некая ее честь специально выделена под размещение памяти именно локальных переменных. Самое важное в работе стека следующее: стек – он как стакан. У нас есть маркер текущей позиции. Я захожу в новый блок, создаются переменные a, b, c (неважно как много памяти они кушают, все зависит от реализации виртуальной машины), но маркер текущей позиции сдвигается на три переменных. Этот блок кода столько-то дополнительной памяти использует. Как только мы выходим за закрывающую фигурную скобку, то нет никакого сложного алгоритма, который бы освобождал память. Это задача сборки мусора. А в стеке маркер просто возвращает на ту позицию, которая была до начала этого блока. Освобождение памяти стека происходит одномоментно и поэтому быстрее ничего для нас с т. з. программного кода, в плане использования и освобождения памяти, нет. Поэтому, стек очень эффективен. Своя математика, использование простых типов данных из стековой памяти – это самое быстрое, что только возможно.

Далее…

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

Константы Константы используются для задания постоянных значений. В Java имеется несколько типов констант, соответствующих его встроенным типам, а именно: константа null нулевого типа; логические константы true (истина) и false (ложь) типа boolean; символьные константы типа char, например, 'a' или '\t'; строковые константы класса String, например, " Привет всем! "; целые константы типов int и long, например, 111 или -2L; плавающие константы типов float и double, например, 3. 1415926. 1. Символьные константы Символьная константа — это один символ Unicode, заключенный в одинарные кавычки. Символ может быть задан собственно символом или escape-последовательностью вида \uXXXX, где XXXX — шестнадцатеричный код символа Unicode. Примеры: 'a' 'Ю' '©' '\u03A9' Несколько символов обозначаются специальными escape-последовательностями: \0 \u0000 нуль (NUL) \b \u0008 забой (BS) \t \u0009 табуляция (HT) \n \u000A перевод строки (LF) \f \u000C перевод формата (FF) \r \u000D возврат каретки (CR) \" \u0022 двойная кавычка (" ) \' \u0027 одинарная кавычка (') \\ \u005C обратная косая черта (\) 2. Строковые константы Строковая константа — это нуль или более символов Unicode, заключенных в двойные кавычки. Строка, не содержащая символов (" " ), называется пустой строкой. Символы Unicode, входящие в состав строки, могут задаваться своим числовым кодом с помощью escape-последовательностей, как описано в предыдущем параграфе. Примеры строковых констант: " Это строковая константа. " " Графический образ хранится в файле C: \\webstuff\\mypage\\gifs\\garden.gif. " " Эта строка заканчивается разрывом строки. \r\n" 3. Целые константы Целые константы могут быть положительными, отрицательными и нулем. По системе счисления они могут быть десятичными, восьмеричными и шестнадцатеричными: Десятичные числа — это просто набор десятичных цифр, например: 1234, -256. Восьмеричные числа начинаются с 0 и состоят из цифр 0 — 7, например: 01234, -067. Шестнадцатеричные числа начинаются с 0x или 0X и состоят из цифр 0 — 9 и букв A — F в любом регистре, например: 0xA000, 0Xa000, -0x1234. Целые константы с суффиксом L или l имеют тип long (например, -1L или 0x12345678l); все остальные целые константы имеют тип int. Диапазон допустимых значений констант типа int: от -2147483648 (-231) до 2147483647 (231-1). Диапазон допустимых значений констант типа long: от -9223372036854775808L (-263) до 9223372036854775807L (263-1). 4. Плавающие константы Плавающие константы отличаются от целых наличием или десятичной точки, или буквы e в любом регистре, задающей степень десяти в научной нотации, или того и другого. Примеры плавающих чисел: 0. 0001, . 0001, 1e-4, 1. 0E-4 // Четыре плавающих числа, равных друг другу -1. 23e2 // Плавающее число, равное -123 Плавающие константы с суффиксом F или f имеют тип float (например, -1. 0F или -123. 45678f); все остальные плавающие константы имеют тип double (для подчеркивания этого они могут иметь необязательный суффикс D или d). Тип float соответствует 32-битовому формату IEEE 754, а тип double — 64-битовому формату IEEE 754. Наибольшим возможным значением числа типа float является 3. 40282347e+38f, а наименьшим возможным положительным значением 1. 40239846e-45f. Наибольшим возможным значением числа типа double является 1. 79769313486231570e+308, а наименьшим возможным положительным значением 4. 94065645841246544e-324.

  Сделать код более читаемым с помощью лексем можно таким образом:

Понятно, что я написал в переменной «c»? Т. е. вот этот знак нижнего подчеркивания разрешен в лексемах для того чтобы разделить

 

Обратите внимание на слово «null». Как только мы начнем работать со ссылочным типом данных у нас будет специальная константа null. Оно будет обозначать некоторое нулевое значение для ссылки. По сути, это инициализация ссылки пустым значением. Это удобно, потому что вы обязаны инициализировать. Для любого ссылочного типа эта константа нам пригодится.

Также у нас есть строковая константа, которая записывается в двойных кавычках.

Приведу в качестве последнего примера. Допустим я хочу получить здесь результат 3. 5. Путь у меня будет именно float. По идее у нас все в шоколаде, ведь мы получили 3. 5. Вы скажете «ну да. все ок».

А вот я хочу теперь переинициализировать переменную b не 7, а 7. 5. И у нас появится ошибка. Почему?

 Мы должны рассуждать логично. 7. 5 – это какой тип данных? double. Это так принято. А у нас a и b – float.

Поделиться:





Воспользуйтесь поиском по сайту:



©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...