Учим Java. Объектно-ориентированное программирование и основные синтаксические конструкции. (часть 1)

Учим Java. Объектно-ориентированное программирование
и основные синтаксические конструкции. (часть 1)
Уже неоднократно упоминалось, что синтаксис язык Java унаследовал от C++. Не будем дважды перечислять все сходства и различия, давайте просто рассмотрим то, что нам предлагает Java. Уже по ходу будем проводить параллели с C++.
Увы, за технологию WORA нужно жестоко платить написанием большого количества кода для достижения более или менее приличного результата. Но это проблема слишком ленивых программистов.
Если мы хотим шагать в ногу со временем, это не должно нас останавливать.
Начать, думаю, следует со структуры программы. Она была вкратце рассмотрена в предыдущей статье.
Итак, вы уже знаете, что любое приложение Java есть класс или же несколько классов. Причем один из классов должен содержать метод public static void main(String args[]). Это не относится к апплетам. Их структуру рассмотрим в другой статье. Когда интерпретатор Java получает имя класса из командной строки, то предполагается, что среди методов этого класса имеется и main(). Если он не будет найден, то вам будет выдана ошибка. В случае его присутствия интерпретатор выполняет код, записанный в этот метод.
Проще говоря, он является аналогом главной функции программы на C/C++:

void main(void)
{
// ...
}

Возьмем для примера программу, которая будет складывать значения двух переменных и выводить результат на экран:

class sumVar
{
public static void main(String args[])
{
int a = 123;
int b = 234;
int c = a + b;
System.out.println("Результат: a + b = "+c);
}
}

Во-первых, что очень важно, имя класса должно совпадать с именем файла. Иначе компилятор выдаст ошибку. Имя файла с этим классом должно быть sumVar.java.
Во-вторых, поговорим об определении переменных и типах. Переменные в Java определяются точно так же, как и в C/C++. Сначала идет тип переменной, затем ее имя.
Говоря о типах, следует отметить, что в Java появился новый тип boolean, которого не было ни в C, ни в C++. Хотя сказать, что его не было совсем, было бы неправильно. Просто в его реализации не было необходимости. Заменой ему служили простые и короткие 0 и 1. Хотя в больших проектах, где было необходимо обеспечить легкость чтения кода, делали простые макроопределения:

#define TRUE 1
#define FALSE 0

Бьерн Страуструп тоже долгое время ломал голову над введением этого типа в C++. Я думаю, что любому программисту, ранее писавшему на C и решившему взяться за Java, будет нелегко свыкнуться с идеологией типа boolean. Но это лишь мое мнение.
По той причине, что для исключения множества ошибок в Java не стали реализовывать указатели, пришлось вводить новый класс String.
Это ложно напоминает паскалевские string, но это две совершенно разные вещи.
В Java всего восемь простых типов: byte, short, int, long, char, float, double и boolean. В отличие от C++, Java не имеет автоматического приведения типов. Поэтому приведение типов осуществляется, как и в C:

int a = 123;
char b = (char) a;
Для тех, кто не знает: в скобках — тип, к которому будет приводиться значение переменной a.
Следует заметить, что Страуструп был ярым противником ручного приведения типов.

Тип Разрядность (бит) Диапазон значений
Long 64 -9, 223, 372, 036, 854, 775, 808.. 9, 223, 372, 036, 854, 775, 807
Int 32 -2, 147, 483, 648.. 2, 147, 483, 647
Short 16 -32, 768.. 32, 767
Byte 8 -128.. 127
Но это относительные данные, так как с приходом новых компьютеров Java изменяет разрядность типов. Так, типы byte и short уже могут иметь разрядность в 32 бита. Посмотрите в документации, если вам необходимо это точно знать.
Для операций над числами с плавающей запятой в Java введены два типа: double и float, диапазоны и разрядность которых вы можете посмотреть в документации.
Для работы с символами в Java существует специально отведенный тип char. Но это не означает, что мы "надеваем смирительную рубашку" из-за типов Pascal'евского мировоззрения. В Java вы можете свободно инкрементировать/декрементировать переменные типа char, а также для этого типа было сделано специальное и небольшое исключение насчет автоматического приведения типов:

int a = 3;
char b = '1';
char с = (char) (a + b);

Если не поставить принудительное приведение к типу (char), то значение (a + b) может выйти за границы допустимых значений и компилятор выдаст ошибку.
Необходимо понимать, что любая переменная, объявленная вне метода, является свойством этого класса, а не глобальной переменной. Хотя эти понятия в некотором смысле схожи, но только у свойства мы можем задать видимость этой переменной из других классов.
Следующим этапом стоит рассмотреть определение массивов в Java.

int Array [];
Этой строчкой мы лишь создали переменную.
А в Java под массивы принято выделять память оператором new или же непосредственно инициализировать массив, присваивая ему множество значений:

Array = new int [150];

int Array [] = {1,2,3,4,5,6,7,8,9,10};

В первом случае мы выделили память под массив 150 значений типа int. Во втором — мы четко задали значения 10-и элементов массива Array. При использовании индекса массива больше 150 и меньше 0 вы получите ошибку. Во втором случае диапазон индексов массива от 0 до 9. В Java вы не можете добавлять элементы в массив, как это делается в Perl, например.
Обращаться к элементам массива нужно следующим образом:

Array[0] = 1;
Array[1] = 2;
int a = 5;
Array[a] = 3;

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

byte Array [][];
Array = new byte[10][10];
Array[0][0] = 16;
Array[0][1] = 21;

Строки в Java реализованы в виде отдельного класса String. Этот класс имеет множество методов и свойств, при помощи которых можно производить всевозможные действия над строками. На данный момент следует рассмотреть только основные возможность Java для работы со строками.
Для того чтобы создать строку, нужно создать переменную-экземпляр класса String и после этого выделить память для размещения ее в памяти при помощи того же оператора new. Вот как это будет выглядеть:

String s;
s = new String();

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

String(char sChars[], int bIndex, int cCount);

где sChart — массив символов, строка;
bIndex — индекс начала строки;
cCount — количество символов в строке.
Если параметры не заданы (как в нашем случае), то используются значения по умолчанию. Как в функции задавать значения параметров по умолчанию, мы рассмотрим позже, когда речь пойдет о функцих-методах.
В Java можно использовать сокращенную запись создания строки, например:

String s ="Hello World!";

Это выглядит практически так же, как и при использовании стандартного типа.
Думаю, осталось рассмотреть некоторые операции для работы над строками: сложение, сравнение и преобразование чисел в строку.
Склеивать строки (сложение) мы можем при помощи обычного бинарного оператора сложения +.
Надо заметить, что C такого не знал по причине другого подхода к этому вопросу, а в C++ такое очень просто реализуется при помощи простой перегрузки оператора +.

String s = "!";
String s1 = "Hello" + "World" + s;
System.out.println(s1);

Для сравнения строк был перегружен оператор ==.

if (s == s1) System.out.println("Совпадают.");

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

String s = "Год: "+2002;
System.out.println(s);

Очень важно знать, что при попытке произвести какие-либо математические расчеты необходимо заключать выражение в круглые скобки, иначе результат будет не тот, который вы ожидали:

String s = "Год: "+2000+2;
String s1 = "Год: "+(2000+2);
System.out.println(s);
Sytem.out.println(s1);

Вот что будет выведено на экран:
Год: 20002
Год: 2002
Таким образом, заключая арифметические действия в круглые скобки, мы даем понять компилятору, что это необходимо сначала посчитать, после чего склеить со строкой.
На этом можно завершить рассказ об основных используемых типах в Java. Все простые истины, перечисленные выше, только для того, чтобы вы, решив изучать Java, имели некоторое представление о системе типов в Java и могли продвигаться далее.
С вопросами и предложениями — пишите.

Алексей Литвинюк litvinuke@tut.by
www.litvinuke.hut.ru



Компьютерная газета. Статья была опубликована в номере 06 за 2002 год в рубрике программирование :: java

©1997-2024 Компьютерная газета