© 2008 Наталия Македа
Все материалы блога защищены авторским правом. Любая перепечатка или использование материалов этого блога в коммерческих целях возможна лишь с письменного согласия автора. При некоммерческом использовании ссылка на блог обязательна.

воскресенье, 27 апреля 2008 г.

Основы языка Java (Выпуск 1)

В первом выпуске мы с места в карьер ознакомимся с базовыми понятиями языка программирования Java. Очень можно долго писать вступление и объяснять, что такое Java, и зачем он (язык) нужен, и как он организован. Можно обратить внимание, что для выполнения программ на Jave необходимо генерировать объектный код, а не исполняемый, нудно рассказывать про трансляторы и компиляторы... Я решила, что лучше сразу приступить к изучению. Если что-то не понятно, пишите мне письма, пожалуйста. Я с радостью отвечу на все вопросы.

1. Основы языка

1.1. Исходные файлы

Все исходные файлы (они же "исходники"), написанные в Java, должны заканчиваться расширением .java. Файл должен содержать по крайней мере одно открытое и общедоступное (public) определение класса.

Лирическое отступление для совсем новичков

Java - объектно-ориетированный язык, то есть одним из основных его понятий является "объект", служащий для построения решения проблемы как кирпичи иблоки служат для построения дома). Объект может быть классифицирован (красные и белые кирпичи - они и в Африке кирпичи), отсюда и следует слово "класс", то есть тип строительного материала. Принципы объектно-ориентированного программирования (ООП) мы рассмотрим в следующих выпусках.

А пока что считаем, что класс - это неименное существительное без прилагательного: стол, кирпич, животное, кошка, человек и т.д. Объект - это отдельный конкретный пример класса. Класс, который описывает все существующие объекты называется "объект". Вот такая валюта - "деньги".

Если общедоступное определение класса присутствует, оно должно совпадать с именем файла без расширения. Например, если исходник содержит класс Apple, то файл должен называться Apple.java. Исходник может содержать неограниченное число не общедоступных определений классов.

Это не является требованием языка, но его лучше придерживаться дабы не нарушить переносимость вашего кода на другие платформы (отличные от той, на которой вы ухитрились запустить программу, исходник которой не соответсвует этому требованию.)

Три элемента верхнего уровня известные как единицы компиляции (compilation units) могут также присутствовать в файле:

  1. Объявление пакета (package declaration); например,package exam.problems;
  2. Утверждение импорта (imposrt statement); например, import java.awt.Button; // импортирует специфический класс import java.util.*; // импортирует целый пакет;
  3. Определение класса (class definition); например, public class Test {...}.

Формат объявления пакета очень прост. Сначала идёт ключевое слово package, за которым следует название пакета. А название пакета, в свою очередь, состоит из последовательности определённых элементов, разделённых точкой. Эта последовательность элементов отображает иерархию директорий на диске. В директорию с именем последнего элемента последовательности и находится класс. Рассмотрим пример выше: класс с таким объявлением пакета помещается в директорию problems, которая размещена в директории exam.

Вы должны быть внимательны, именуя каждый элемент последовательности: имена директории должны быть допустимы на любой платформе. То есть попросту элементы последовательности могут содержать буквы, цифры, символ подчёркивания и символ доллара.

Лирическое отступление для совсем новичков

Пакеты представляют собой совокупность классов логически связанных между собой. Например, пакет "деньги" может содержать классы "ДолларСША", "Евро", "РоссийскийРубль", "КурсВалют". Пакет(директория) "деньги" может находиться в директории "активы", и тогда объявление пакета имеет вид: package assets.money;, где assets - "активы", а money - "деньги", ясное дело.

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

Лирическое отступление для совсем новичков

Импортирование пакетов (классов) необходимо объявлять в том случае, если классы этих пакетов (эти классы) используются в текущем классе. Например, в класс "ОплатавМагазине" мы импортируем класс "РоссийскийРубль", то есть пишем: import assets.money.RussianRuble;, где RussianRuble означает "РоссийскийРубль". А в класс "ОплатаНаЧёрномРынке" мы пишем: import assets.money.*;, потому что нам могут понадобиться все заявленные валюты и их курс.

Детальное определение класса мы рассмотрим в следующих выпусках.

Пробелы и коментарии могут предшествовать любой единице компиляции. Например, класс Test может иметь такой вид:

1. // Объявление пакета
2. package exam.prepguide;
3.
4. // Импорты
5. import java.awt.Button; // импортирует специфический класс
6. import java.util.*; // импортирует целый пакет
7.
8. // Определение класса
9. public class Test {...}

Случается, что существуют два класса с одинаковым именем, но в разных пакетах. Например, Date класс в java.util и в java.sql. Если вы используете звёздочку для импорта обоих пакетов, а затем пытаетесь использовать класс названный просто Date, вы получите ошибку компиляции о том, что такое использование неоднозначно. Вы должны или сделать явный импорт класса, или обращаться к классу, используя полный путь к нему.

1.2. Ключевые слова и дентификаторы

В языке Java существует 52 ключевых и зарезервированных слов. Они приведены в Таблице 1.1.


Таблица 1.1: Ключевые и зарезервированые слова в Java

abstractclassfalseimportpackagesupertry
assertconstfinalinstanceofprivateswitchvoid
booleancontinuefinallyintprotectedsyncronizedvolatile
breakdefaultfloatinterfacepublicthiswhile
bytedoforlongreturnthrow
casedoublegotonativeshortthrows
catchelseifnewstatictransient
charextendsimplementsnullstrictfptrue


Слова goto и const являются зарезервированными. Хоть они и не имеют никакого смысла в Java, программисты не могут использовать их как идентификатор.

Идентификатор - это слово, используемого программистом, чтобы дать имя переменной, методу, классу или метке. Ключевые и зарезервированные слова не могут быть использованы в качестве идентификаторов. Идентификатор может начинаться с буквы, символа подчёркивания (_) или символа доллара ($); последующими символами могут быть буквы, цифры, символы подчёркивания или символы доллара. Несколько примеров:

1. foobar // верно
2. BIGinterface // верно, хоть и со встроенным ключевым словом
3. // OK
4. $incomeAfterExpenses // верно
5. 3_node5 // неверно: начинается с цифры
6. !theCase // неверно: должно начинаться с буквы, $, или _

Идентификаторы чувствительны к регистру. Например, Radius и radius - различные идентификаторы.

1.3. Примитивные типы данных

Лирическое отступление для совсем новичков

Типы данных описывают формат, в котором данные хранятся в памяти компьютера. Например: целые и дробные числа, целая строка и отдельный символ, - представляются по-разному. Комплексные типы данных состоят из примитивных. Например, список строк состоит из строки и указателя (целое число) на следующую в списке строку.

Примитивные типы данных в Java: boolen, char, byte, short, int, long, float, double. Размеры этих типов приведены в Таблице 1.2.


Таблица 1.2: Примитивные
типы данных и их размер

ТипРазмер (в битах)Тип Размер (в битах)
boolean1char16
byte8short16
int32long64
float32double64

Переменные типа boolean принимают только два значения: true и false.

Четыре целочисленных типа со знаком: byte, short, int, long. Их интервалы значений приведены в Таблице 1.3.


Таблица 1.3: Интервалы значений целочисленных типов со знаком

ТипРазмер (в битах)Минимум Максимум
byte8-2727-1
short16-215215-1
int32-231231-1
long64-263263-1

Тип char - целочисленный, но без знака. Его диапазон варьируется от 1 до 2^16-2. Java символы (char тип) кодируются в системе Unicode, то есть 16-тибитное представление значительной части символов, используемых в различных письменных системах. Если 9 первых значащих битов установлены в 0, то кодировка остальной части символа совпадает с кодировкой 7-битной
системы ASCII.

Типы с плавающей десятичной запятой: float и double. Они соответсвуют спецификации IEEE 754. Некоторые математические оперции приводят к значению, не имеющему представления в цифрах (например, бесконечность). Для описания таких нецифровых ситуаций и float и double могут представляться специальными битовыми паттернами, которые не соответствуют числам. Эти паттерны определены в классах Float и Double и обращение к ним происходит следующим образом (здесь и далее NaN означает Not a Number, не число):

  • Float.NaN
  • Float.NEGATIVE_INFINITY
  • Float.POSITIVE_INFINITY
  • Double.NaN
  • Double.NEGATIVE_INFINITY
  • Double.POSITIVE_INFINITY

Следующий фрагмент кода показывает пример использования этих паттернов:
1. double d = -10.0 / 0.0;
2. if (d == Double.NEGATIVE_INFINITY) {
3. System.out.println("d только что ушёл в бесконечность: " + d);
4. }

Запомним!
Все численные примитивные типы (то есть кроме boolean и char) - со знаком.

4 комментария:

Unknown комментирует...

Идентификатор может начинаться с цифры, символа подчёркивания (_) или символа доллара ($); последующими символами могут быть буквы, цифры, символы подчёркивания или символы доллара. Несколько примеров:

1. foobar // верно
2. BIGinterface // верно, хоть и со встроенным ключевым словом
3. // OK
4. $incomeAfterExpenses // верно
5. 3_node5 // неверно: начинается с цифры

где то тут мне каежтся опечаточка;)

Natalia Macheda комментирует...

И где же?

Анонимный комментирует...

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

Natalia Macheda комментирует...

И впрямь опечаточка. Прав был Cyrill, а я не догнала :)