На предыдущем занятии мы с вами создали
консольный проект с таким текстом программы:
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 различает регистр букв. Далее, можно
объявить через запятую сразу несколько переменных. Ну и наконец, при объявлении
нескольких переменных, мы также можем сразу выполнять их инициализацию.
При
инициализации вещественных переменных есть одна особенность. Если мы, например,
пропишем вот такую строчку
то
интегрированная среда предупредит нас об ошибке. Почему? Здесь вроде бы все
верно? Дело в том, что любое числовое вещественное значение в Java представляется
типом double и потому мы в
этой строчке пытаемся значение типа double присвоить переменной
типа float. В результате
может произойти потеря информации и именно об этом и сообщает интегрированная
среда. Чтобы все-таки присвоить 3,5 переменной float следует указать
значение 3,5 как тип float:
Символьные типы
данных можно задавать и инициализировать вот таким образом:
то есть,
отдельный символ всегда указывается в апострофах (одинарных кавычках). О
символьных типах данных мы подробнее поговорим когда будем разбирать строки. Соответственно
булевые переменные объявляются таким образом:
boolean fl = true, flFile = false;
Переменные в Java можно создавать
в любом месте класса или функции по мере необходимости.
Если требуется
вывести в консоль значение какой-либо переменной, то используется такая инструкция:
Однако, если мы
напишем следующую строчку вот такую:
то
интегрированная среда нам сообщит об ошибке, что переменная a должна быть
проинициализирована перед выводом в консоль. Как записать значение в переменную
после ее объявления мы поговорим на следующем уроке. Пока просто запомните, что
прежде чем выводит значение переменной, это значение ей прежде нужно присвоить.
Наконец,
константы в языке Java, задаются так:
то есть перед
типом константы ставится ключевое слово final и сразу
константа должна быть проинициализирована каким-либо значением. И если мы далее
по программе попытаемся изменить это значение
то
интегрированная среда нам сообщит об ошибке, что так делать нельзя, т.к. PI – это константа.
Обратите также
внимание, что в Java константы принято писать заглавными буквами. Так
они визуально в тексте программы отличаются от обычных переменных и программисту
становится проще читать такую программу.
Ну и наконец,
как в Java можно
присваивать значения переменным после их объявления? Для этого в Java используется
оператор присваивания. Он записывается как знак равно (=). Само
присваивание значение переменной выглядит, например, так:
Здесь элементу слева от знака равенства
присваивается значение, стоящее справа от него. Чтобы лучше понять смысл этого
оператора рассмотрим такой пример:
Здесь справа текущее значение i сначала
увеличивается на 1, становится равным 2, и после этого результат присваивается
снова этой же переменной. В результате переменная увеличивает свое значение на
1. Видите разницу между математическим знаком равенства и оператором
присваивания? С математической точки зрения такое равенство выполняться не
может, но с точки зрения оператора присваивания никаких проблем!
Также не имеет смысла запись вида
так как константе 20 нельзя присвоить
какое-либо значение.
Наконец, рассмотрим два таких примера:
int a = 10;
short b = 5;
a = b;
b = a;
Здесь присвоение a=b работает без
каких-либо замечаний, но вот на b=a интегрированная
среда ругается и говорит, что возможна потеря данных, т.к. тип short меньше типа int. Чтобы все-таки
такое присвоение стало возможным, нужно сделать приведение типа переменной a к типу short в момент
присваивания, то есть, записать это в таком виде:
Этим мы скажем компилятору, что да, мы
знаем что делаем и хотим переменную int овского типа присвоить
переменной типа short.
Второй пример:
float var_f = 8.7f;
int var_i;
var_i = (int)var_f;
Здесь также
имеем дело с разными типами данных, но в отличие от предыдущего примера, здесь
будет почти всегда происходить потеря данных, т.к. целочисленная переменная не
может содержать дробную часть числа. Что же произойдет с дробной частью? Она
будет попросту отброшена. Обратите внимание, произойдет не округление числа, а
просто отбрасывание дробной части. Давайте выведем переменную var_i в консоль и
убедимся в этом:
Вот так работает
оператор присваивания и вот так присваиваются значения переменным в Java.
На этом мы
завершим наше занятие. Из него вы должны себе представлять в целом начальную
структуру программы на Java и знать как объявлять переменные и
константы и как работает оператор присваивания.