Урок 8. Погружение в Java

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

Мы раздробим такую объёмную тему на несколько частей, чтобы не погрязнуть в болоте неизвестности:

  • Изучим азы синтаксиса языка программирования Java и посмотрим, как код превращается в рабочее приложение;
  • Хранить и использовать информацию с помощью переменных;
  • Научимся выражать самих себя с помощью выражений Java;
  • Продолжим работу над нашей игрой;

 
Наше приложение будет задавать вопрос пользователю и давать три варианта ответа, как показано на скриншоте. У пользователя будет возможность выбрать один из вариантов ответа, а игра будет определять, верно ли ответил игрок и выдавать соответствующее текстовое сообщение:

приложение android

Компилятор

Компилятор – это то, что переводит наш с вами написанный код на языке Java в другой код, который будет запущен на виртуальной машине Java. Этот процесс называется компиляцией. Помимо этого, компилятор так же укажет вам на ошибку в синтаксисе, если таковая присутствует.

Комментарии

Комментарии ОЧЕНЬ!!! важны. Именно так. Комментарии – это часть кода, которая не обрабатывается компилятором. Они служат инструментом для программиста, который хочет задокументировать, объяснить или внести ясность в тот код, который он написал и  сделать его более понятным для других разработчиков, которые в свою очередь, возможно, захотят этот код усовершенствовать:

//это комментарий, объясняющий, что происходит в этой строке

Комментарий, как вы могли заметить начинается с двух «//» и заканчивается в конце строки.

//могу написать здесь, что угодно
а вот здесь уже не могу

Строка без двух «//» уже не будет закомментирована и Android Studio выдаст нам ошибку. Комментарии также можно использовать, если вы захотите отключить какую-нибудь функцию в своём приложении и посмотреть, что же произойдёт? Это происходит гораздо чаще, чем вы себе можете представить:

//setContentView(R.layout.activity_main);

В такой ситуации меню нашего приложения не загрузится, а будет чистый экран, а может и того хуже, можете поэкспериментировать.Помимо однострочных комментариев можно закомментировать большой кусочек кода. Делается это так – всё что будет заключено между знаками /* и */ будет игнорироваться компилятором:

/*
 Эта программа была разработана хорошим программистом,
 который пишет много комментариев с целью облегчить
 постижение этого кода
*/

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

Хранение и использование информации с помощью переменных

Представим переменную в виде отмаркированной коробки, хранящей в памяти какую-то информацию и готовую в любой момент быть вызванной или изменённой. Память девайса – это сложная система адресаций, с которой нам, к счастью, не придётся взаимодействовать напрямую (но если вы решите связать свою жизнь в дальнейшем с программированием, то высока вероятность, что хотя бы поверхностно, но вам придётся изучить этот материал). Переменным в языке Java могут быть даны любые имена, сделано это для удобства программисту. Можем представить себя память любого устройства на ОС Android  в виде большого хранилища. Когда мы даём (назначаем) имя нашим переменным, они попадают в это хранилище и ждут своего часа. Когда нам нужно использовать переменную, девайс прекрасно понимает к какой из них ему нужно сослаться для выполнения определённого действия. Например «возьми коробку A и прибавь к ней коробку B, удали коробку C» и т.д. В нашем приложении, к примеру, будет переменная «score» и к ней будут применены такие операции, как сложение, вычитание и вывод на экран. Выбор имени переменной абсолютно произволен, но для удобства разумнее подбирать имя к переменной, подходящее по смыслу её назначения в программе, например «highScore» — сразу понятно, что это наивысший результат. Так же существует такое понятие, как «верблюжийРегистр» — это стиль написания переменных или функций и т.д. в языке Java и не только. Принято это всё так же для удобного чтения чужого кода. Примеры наименований переменных:

  • score
  • highScore
  • playersPersonalBest

Думаю, с этим разобрались. Теперь перейдём к типам данных.

 

Типы данных

Несложно себе представить, что даже самая простенькая игра будет содержать в себе не одну переменную. Мы уже привели пример переменной «highScore», но что если в игре есть список из 10 наивысших баллов полученных игроком, получается что для каждого пункта нужно выделить по переменной. А что если игре требуется знать статус игрока – жив/мертв? или сколько попыток/жизней у него осталось. Тогда нам необходимо написать функцию о проверке игрока на количество оставшихся жизней и если их нет, то уничтожить его с красивой анимацией. Существует большое количество типов переменных и как мы увидим в дальнейшем, мы сами сможем их создавать или пользоваться чужими. Но пока мы рассмотрим «встроенные» типы данных Java.

Разберемся с переменной «score». Наверняка мы подразумеваем то, что «score» — это некое число. Так что мы должны передать эту информацию компилятору. Давайте разберём основные типы данных:

  • int – этот тип используется для хранения целочисленных значений в переменной. Его размер 32 кусочка (бита) памяти таким образом хранит в себе диапазон значений от «-2147483648» и до «2147483647» (2 в степени 32);
  • long – что-то подсказывает, что этот тип данных используется, когда необходимо производить вычисления с очень большими числами. Размер такой переменной составляет 64 бита, а диапазон значений от «-9223372036854775808» до «9223372036854775807» (вы, наверное, удивлены зачем нужны значения такой большой величины. Первое, что приходит в голову это какие-нибудь математические или научные приложения для сложных вычислений);
  • float – используется для чисел с плавающей запятой, например 3,1415… размер переменной составляет 32 бита. Но поскольку дробная часть числа занимает в памяти столько же места как и целочисленная, то диапазон чисел сравнительно меньше, чем у int;
  • double – когда точности float не хватает, будем использовать этот тип данных;
  • short – используется в том случае, когда даже int будет являться для нас перебором. Можем хранить в переменной такого типа данных «2^16» значений от «-32768» до «32767»;
  • byte – бывает, что нужно совсем беречь память девайса, но хранить в таком типе данных переменная сможет только значения от «-128» и до «127»;
  • boolean – мы будем использовать довольно часто этот тип данных. Boolean переменная может хранит в себе два значения: «true» (истина), «false» (ложь). такая переменная понадобится для ответа на вопрос: Жив ли игрок?
  • char – хранит в себе один буквенно-цифровой символ.

Как видно, каждому типу данных переменной требуется определённое количество памяти. Так что мы должны указывать тип переменной перед её использованием. Перечисленные типы данных известны как  «примитивные».

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

Ссылочные типы данных указывают на начало адреса памяти, в котором хранится переменная, таким образом под такую переменную не требуется изначально выделять память. Причина этого довольно-таки проста: мы не всегда знаем сколько данных нужно будет хранить до тех пор, пока программа не будет запущена. Представим себе чемодан (приложение) для путешествий: в зависимости от цели и места вашей поездки вы заполняете его вещами. Если бы вы пользовались только примитивными типами данных, получалось бы так, что куда бы вы ни поехали (север, юг) у вас всегда в этом чемодане будут лежать и шорты и тёплые штаны. Но так как есть ссылочные типы данных, то в тот момент, когда вы направляетесь на отдых в тёплые края вы берёте с собой только шорты, тем самым у вас остаётся свободное место в чемодане (приложении), тем самым вы не утруждаете себя (а в нашем случае наш девайс) лишними усилиями. Один из самых востребованных ссылочных типов является «String» (строка). String используется для хранения любого буквенно-символьно-цифрового знака, но в отличии от char практически любого количества этих знаков. От имени игрока и до целой книги может храниться в такой переменной. Другой ссылочный тип данных Array (массив) хранит в себе переменные одного и того же типа.

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

Объявление

Хватит теории. Давайте посмотрим, как мы будем использовать переменные и типы данных на деле. По причинам изложенным выше мы должны объявлять тип данных переменной и саму переменную перед тем, как будем ею пользоваться.

Для того, чтобы объявить переменную «score»  типа «int» мы введём:

int score;

И всё! Пишем int, ставим пробел, пишем имя переменной и ставим «;» для того, чтобы компилятор понял, что это конец строки. Объявление почти всех переменных происходит таким образом. К примеру:

long millisecondsElapsed;
float gravity;
double accurateGravity;
boolean isAlive;
char playerInitial;
String playerName;

 

Инициализация

Теперь для каждой из объявленной переменной мы инициализируем значение:

score = 0;
millisecondsElapsed = 1406879842000;//1st Aug 2014 08:57:22
gravity = 1.256;
double accurateGravity =1.256098;
isAlive = true;
playerInitial = 'C';
playerName = "Charles Babbage";

Обратите внимание на то, что переменная типа «char» обрамляется одиночными кавычками(‘C’), в то время как переменная типа «String» — двойными (“Charles Babbage”). Также можно объявлять и инициализировать переменную в одной строке, например:

int score = 0;
long millisecondsElapsed = 1406879842000;//1st Aug 2014 08:57:22
float gravity = 1.256;
double accurateGravity =1.256098;
boolean isAlive = true;
char playerInitial = 'C';
String playerName = "Charles Babbage";

Возможны оба варианта: сначала объявить, а потом инициализировать или сразу объявить и инициализировать. Важно то, что оба эти действия (объявление и инициализация) должны присутствовать в коде. Урок получился довольно объёмный, но очень важно понять эти азы, без них никуда. Если остались какие-то вопросы, задавайте их в комментариях. В следующем уроке разберём операции, с помощью которых можно изменять значения переменных.