Проект «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 (неважно как много памяти они кушают, все зависит от реализации виртуальной машины), но маркер текущей позиции сдвигается на три переменных. Этот блок кода столько-то дополнительной памяти использует. Как только мы выходим за закрывающую фигурную скобку, то нет никакого сложного алгоритма, который бы освобождал память. Это задача сборки мусора. А в стеке маркер просто возвращает на ту позицию, которая была до начала этого блока. Освобождение памяти стека происходит одномоментно и поэтому быстрее ничего для нас с т. з. программного кода, в плане использования и освобождения памяти, нет. Поэтому, стек очень эффективен. Своя математика, использование простых типов данных из стековой памяти – это самое быстрое, что только возможно. Далее… Когда вы создаете переменные, то удобно присвоить начальное значение. Некоторые варианты начальных значений в виде лексем здесь даны.
Сделать код более читаемым с помощью лексем можно таким образом:
Понятно, что я написал в переменной «c»? Т. е. вот этот знак нижнего подчеркивания разрешен в лексемах для того чтобы разделить
Обратите внимание на слово «null». Как только мы начнем работать со ссылочным типом данных у нас будет специальная константа null. Оно будет обозначать некоторое нулевое значение для ссылки. По сути, это инициализация ссылки пустым значением. Это удобно, потому что вы обязаны инициализировать. Для любого ссылочного типа эта константа нам пригодится. Также у нас есть строковая константа, которая записывается в двойных кавычках. Приведу в качестве последнего примера. Допустим я хочу получить здесь результат 3. 5. Путь у меня будет именно float. По идее у нас все в шоколаде, ведь мы получили 3. 5. Вы скажете «ну да. все ок». А вот я хочу теперь переинициализировать переменную b не 7, а 7. 5. И у нас появится ошибка. Почему? Мы должны рассуждать логично. 7. 5 – это какой тип данных? double. Это так принято. А у нас a и b – float.
Воспользуйтесь поиском по сайту: ©2015 - 2024 megalektsii.ru Все авторские права принадлежат авторам лекционных материалов. Обратная связь с нами...
|