Структура программы, переменные, константы, оператор присваивания

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

package com.company;
public class Main {
    public static void main(String[] args) {
        System.out.println("Hello World!");
    }
}

Давайте изучим ее структуру подробнее. Вот это первое слово package указывает пакет, которому принадлежит данная программа. То есть, программа в данном случае находится в пакете com.company. Этот пакет вроде пространства имен языка С++ (если кто с ним знаком). Или же это можно воспринимать как некий каталог, в котором находятся файлы данного пакета. Благодаря этому разработчики, например, могут создавать классы с одинаковыми именами, расположенные в разных пакетах и при сборке большого проекта не будет происходить коллизий с их определениями. Кстати, при создании пакета com.company у нас в каталоге src был создан подкаталог com, а в нем подкаталог company и уже в этом подкаталоге находится файл Main.java с текстом программы данного пакета. И здесь сразу обратите внимание: в Java название файла должно совпадать с названием класса. Например, наш класс называется Main, поэтому и файл имеет такое же название. И отсюда следует важное следствие: в языке Java в одном файле может быть описан только один класс. Именно так все автоматически и сделала наша интегрированная среда. Что очень удобно.

Далее, второй строчкой идет определение класса. О классах мы еще подробно поговорим. Пока просто запомните, что класс задается с помощью ключевого слова class и далее идет имя этого класса – в данном случае Main. Внутри фигурных скобок мы прописываем данные класса – это его переменные и методы – это его функции. А вот это ключевое слово public означает, что класс доступен везде и всем. Это, в частности, необходимо, чтобы виртуальная машина имела к нему доступ и могла выполнить его, т.е. запустить нашу программу.

Внутри класса интегрированная среда нам автоматически прописала вот такой метод:

public static void main(String[] args) {….}

Это специальный метод языка Java. Виртуальная машина ищет в программе этот метод и начинает выполнение именно с него. То есть, эта функция является точкой входа в программу. С нее все начинается и когда она завершается, завершается и работа всей программы. Ее синтаксис пока просто запомните, мы всегда ее будем писать именно так.

Внутри фигурных скобок располагаются инструкции языка Java: его операторы, функции и т.д. Например, у нас записана такая инструкция:

System.out.println("Hello World!");

Которая означает, что мы обращаемся к классу System (он определен в стандартном пакете java.lang). В этом классе имеется объект out, реализующий поток вывода. И вызываем метод println этого объекта для вывода в консоль сообщения «Hello World!». Позже мы подробнее еще поговорим о консольном выводе. Пока просто запомните, что вот так можно выводить информацию в консоль. И после каждой конструкции всегда ставится точка с запятой.

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

// Первая программа на Java

Вот эти два слеша создают комментарий в виде строки. Если же нужно закомментировать некоторый блок текста, то он помещается между вот такими символами:

/*
Комментарий
На нескольких
строках
*/

Переменные и константы

Программы, написанные на любом языке программирования, в основном делают четыре вещи:

  • хранят данные;
  • выполняют арифметические операции;
  • выполняют логические операции;
  • реализуют циклы.

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

Для создания переменных в Java используется такой синтаксис:

<тип переменной> <имя переменной>;

Здесь тип переменной – это тип создаваемого хранилища, а имя – это имя, через которое можно работать с этим хранилищем. Какие существуют базовые типы переменных в Java? Они следующие:

Название типа

Описание

byte

для целочисленных чисел в диапазоне:

от -128 до 127

занимает 1 байт

short

для целочисленных чисел в диапазоне:

от -32768 до 32767

занимает 2 байта

int

для целочисленных чисел в диапазоне:

от - 2147483648 до 2147483647

занимает 4 байта

long

для целочисленных чисел в диапазоне:

от –9 223 372 036 854 775 808 до 9 223 372 036 854 775 807

занимает 8 байт

float

для вещественных чисел в диапазоне:

от  до

занимает 4 байта

double

для вещественных чисел в диапазоне:

от  до

занимает 8 байт

char

для одиночного символа в кодировке UTF-16

занимает 2 байта

(также можно записывать целые числа в диапазоне от 0 до 65535)

boolean

для булевых значений true и false (размер спецификацией языка строго не определен)

И здесь у вас может возникнуть вопрос: зачем нам несколько целочисленных типов данных? Давайте возьмем наибольший long и будем везде его и использовать? Все верно, так можно было бы сделать, но программист при создании программ должен руководствоваться двумя важными правилами:

  • программа должна расходовать как можно меньше памяти;
  • программа должна работать как можно быстрее и быть надежной.

Именно в соответствии с первым правилом следует выбирать переменные с меньшим числом байт, если их достаточно для программирования текущей задачи. Вот почему во многих языках существует целый набор однотипных переменных.

Итак, с типами данных разобрались. Теперь как задавать имена переменных? Для этого существуют такие очень простые правила:

  • имена лучше задавать латиницей, даже если есть возможность писать кириллицу;
  • в качестве первого символа можно использовать символы a-z, A-Z и символ _
  • в качестве второго и последующих символов можно писать еще и цифры 0-9.

Ну и некоторое такое не особо официальное правило – имена переменных, как правило, должны отражать суть хранимых данных.

Например, мы можем определить переменные вот так:

short a;
short b = 5;
int A, B;
double e = 5, f;

В первой строчке создается целочисленное хранилище с именем a. Во второй строчке создается тоже целочисленное хранилище с именем b и в него сразу записывается значение 5. Это называется начальной инициализацией переменной в момент ее объявления.

Теперь обратите внимание на имена переменных a и A – это две разные переменные, т.е. Java различает регистр букв. Далее, можно объявить через запятую сразу несколько переменных. Ну и наконец, при объявлении нескольких переменных, мы также можем сразу выполнять их инициализацию.

При инициализации вещественных переменных есть одна особенность. Если мы, например, пропишем вот такую строчку

float var_f = 3.5;

то интегрированная среда предупредит нас об ошибке. Почему? Здесь вроде бы все верно? Дело в том, что любое числовое вещественное значение в Java представляется типом double и потому мы в этой строчке пытаемся значение типа double присвоить переменной типа float. В результате может произойти потеря информации и именно об этом и сообщает интегрированная среда. Чтобы все-таки присвоить 3,5 переменной float следует указать значение 3,5 как тип float:

float var_f = 3.5f;

Символьные типы данных можно задавать и инициализировать вот таким образом:

char ch = 'a';

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

boolean fl = true, flFile = false;

Переменные в Java можно создавать в любом месте класса или функции по мере необходимости.

Если требуется вывести в консоль значение какой-либо переменной, то используется такая инструкция:

System.out.println(b);

Однако, если мы напишем следующую строчку вот такую:

System.out.println(a);

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

Наконец, константы в языке Java, задаются так:

final double PI = 3.14;

то есть перед типом константы ставится ключевое слово final и сразу константа должна быть проинициализирована каким-либо значением. И если мы далее по программе попытаемся изменить это значение

PI = 5.5;

то интегрированная среда нам сообщит об ошибке, что так делать нельзя, т.к. PI – это константа.

Обратите также внимание, что в Java константы принято писать заглавными буквами. Так они визуально в тексте программы отличаются от обычных переменных и программисту становится проще читать такую программу.

Ну и наконец, как в Java можно присваивать значения переменным после их объявления? Для этого в Java используется оператор присваивания. Он записывается как знак равно (=). Само присваивание значение переменной выглядит, например, так:

short c = 6;

Здесь элементу слева от знака равенства присваивается значение, стоящее справа от него. Чтобы лучше понять смысл этого оператора рассмотрим такой пример:

int i=1;
i=i+1;

Здесь справа текущее значение i сначала увеличивается на 1, становится равным 2, и после этого результат присваивается снова этой же переменной. В результате переменная увеличивает свое значение на 1. Видите разницу между математическим знаком равенства и оператором присваивания? С математической точки зрения такое равенство выполняться не может, но с точки зрения оператора присваивания никаких проблем!

Также не имеет смысла запись вида

20 = i;

так как константе 20 нельзя присвоить какое-либо значение.

Наконец, рассмотрим два таких примера:

int a = 10;
short b = 5;
a = b;
b = a;

Здесь присвоение a=b работает без каких-либо замечаний, но вот на b=a интегрированная среда ругается и говорит, что возможна потеря данных, т.к. тип short меньше типа int. Чтобы все-таки такое присвоение стало возможным, нужно сделать приведение типа переменной a к типу short в момент присваивания, то есть, записать это в таком виде:

b = (short)a;

Этим мы скажем компилятору, что да, мы знаем что делаем и хотим переменную int овского типа присвоить переменной типа short.

Второй пример:

float var_f = 8.7f;
int var_i;
var_i = (int)var_f;

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

System.out.println(var_i);

Вот так работает оператор присваивания и вот так присваиваются значения переменным в Java.

На этом мы завершим наше занятие. Из него вы должны себе представлять в целом начальную структуру программы на Java и знать как объявлять переменные и константы и как работает оператор присваивания.