9. Еще немного о структуре программы. Входная точка.

Если вы сделали два задания из предыдущего урока (а я ни минуты в этом не сомневаюсь), у вас, возможно, возникло желание поэкспериментировать и ответить на вопрос: что можно поменять в программе без ущерба для ее работоспособности, а что нельзя? Вполне возможно, что вы попробовали поменять имя единственной функции в нашей программе и получили странный результат: программа скомпилировалась успешно, но при попытке выполнения вы получили вместо текста "Hello world!" что нибудь такое:

"Exception in thread "main" java.lang.NoSuchMethodError: main"

Это совершенно нормально, именно такое сообщение и должно было появиться. Как его понимать? В дальнейшем мы посвятим целый урок тому, как понимать подобные сообщения и как с ними работать, пока же необходимо усвоить одно: если при исполнении программы на Яве неожиданно появился текст со словом "Exception", это означает, что в процессе выполнения программы произошла ошибка. Обратите внимание на то, что, с точки зрения компилятора ошибок нет, то есть синтаксически в программе все правильно, а вот при исполнении обнаружилось, что что-то не так. Только не надо сразу бежать с радостными криками и сообщать всем окружающим, что вы обнаружили ошибку в языке: опыт показывает, что в учебных программах для начинающих в 99.99% случаев ошибки при исполнении программы - это ошибки программирующего, а не ошибки языка. С подобными ошибками в процессе изучения любого языка программирования приходится сталкиваться неоднократно.

Примечание: Все стандартные сообщения об ошибках в языке Ява, естественно, выводятся по-английски (во всяком случае, мне не приходилось слышать о версии языка с русской диагностикой). Так что если английский представляет для вас проблему - держите рядом с компьютером словарь.

В очень вольном переводе, отвлекаясь от лишних деталей, которые нам сейчас все равно непонятны, можно представить вышеприведенное сообщение так: "Ошибочная ситуация. Не найден метод: main"

Однако, в чем же здесь ошибка? Ведь мы же говорили на прошлом уроке о том, что у метода может быть любое имя?

Да, это правильно! Именно потому, что у метода может быть любое имя (с учетом общих ограничений на имена, обсуждавшихся на прошлом уроке), компилятор не выдал никаких сообщений об ошибках: синтаксически в программе все правильно. Однако, с точки зрения исполнения программы, как интерпретатор (JVM) узнает, с чего начинать выполнять код? В нашем примере все просто, у нас есть только один метод, а если бы их было несколько? Где входная точка нашей программы?

Общее правило такое: При запуске обычной программы на языке Ява входная точка - функция с именем main, описанная именно так, как мы сделали в предыдущем уроке. Если JVM не находит этой входной точки, выдается вышеприведенное сообщение об ошибке. Такое же точно сообщение об ошибке может появиться и при некоторых других изменениях в описании main. Поэтому, на первых порах, пока мы подробно не обсудим все элементы описания функций, рекомендуется копировать функцию main из приведенной программы один к одному, а необходимые изменения вносить в тело этой функции.

10. Переменные.

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

Все переменные в Яве должны объявляться (декларироваться). Язык не допускает использование необъявленных переменных. Никаких "объявлений переменных по умолчанию" не допускается.

Объявление переменной в Яве выглядит следующим образом:

type name;

где type - один из используемых в языке типов данных.
name - название переменной. Название переменной подчиняется тем же синтаксическим правилам, что и названия классов и функций (см. предыдущий урок).

11. Типы данных.
В языке Ява любые данные определяются их типом. Никаких "типов по умолчанию" или "универсальных типов" не допускается. Для этого есть очень серьезные причины, которые мы обсудим в дальнейшем.

Типы данных делятся на стандартные и все остальные. Для стандартных типов данных используются специальные ключевые слова. Стандартных типов данных в языке Ява восемь:
byte
short
int
long
char
float
double
boolean

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

Внимание! Если вы по ошибке или "с помощью" какого-нибудь "умного" редактора запишете название типа данных начиная с заглавной буквы, эффект может быть неожиданным. В дальнейшем мы разберем, что именно при этом получается.

Примечание: Если Ява - ваш первый язык программирования, и вы не очень хорошо представляете себе,зачем нужны различные типы данных, советую прочитать серию моих статей "Внутреннее представление данных в компьютере и недесятичные системы счисления", в особенности, часть 4, которую можно найти, например, здесь: http://club.shelek.com/viewart.php?id=126

Прежде, чем рассматривать характеристики каждого из стандартных типов данных, давайте перепишем нашу первую программу, добавив в нее декларацию переменной типа int:
Код:
/* This is my second program */
class MyProgramWithVariable
{
public static void main(String ar[])
{
int vasia;
System.out.println("Hello world!");
}
}

Как видите, объявление типа данных требует отдельной операции.

Теперь давайте рассмотрим характеристики стандартных типов данных в Яве.

Общее замечание: Все типы данных, кроме boolean всегда cодержат знак. Никаких данных типа "unsigned" в Яве не существует.

11.1. Тип byte.
Этот тип данных предназначен для хранения целых чисел и занимает один байт в памяти. Соответственно, диапазон допустимых значений для него - от -128 до +127 (от -2^7 д +(2^7)-1).

11.2. Тип short.
Этот тип данных предназначен для хранения целых чисел и занимает два байта в памяти. Соответственно, диапазон допустимых значений для него - от -32768 до +32767 (от -2^15 д +(2^15)-1).


11.3. Тип int.
Этот тип данных предназначен для хранения целых чисел и занимает четыне байта в памяти. Соответственно, диапазон допустимых значений для него - от -2^31 до +(2^31)-1. Это - основной целый тип данных.

11.4. Тип long.
Этот тип данных предназначен для хранения целых чисел и занимает восемь байтов в памяти. Соответственно, диапазон допустимых значений для него - от -2^63 до +(2^63)-1.

11.5. Тип char.
Этот тип данных предназначен для хранения, в первую очередь, символов. Тем не менее, он позволяет хранить и целые числа - коды символов. Этот тип требует двух байтов в памяти. Символы хранятся в кодировке Unicode.

Более детально вопросы, относящиеся к хранению символьной информации в компьютере разобраны здесь: http://club.shelek.com/viewart.php?id=126

Средства для хранения целых текстов, а не одиночных символов, будут рассмотрены позже.

11.6. Тип float.
Этот тип данных предназначен для хранения нецелых чисел и очень больших чисел, как положительных, так и отрицательных. Он занимает четыре байта в памяти. Диапазон допустимых значений для него по абсолютной величине - примерно от 10 ^-38 до 10 ^38. Данные хранятся в формате с плавающей точкой. Как и в любом типе данных, использующем представление с плавающей точкой, числа хранятся с некоторым приближением. Точность - примерно 7 десятичных знаков.

11.7. Тип double.
Этот тип данных предназначен для тех же целей, что и предыдущий, но допускает больший диапазон значений и, самое главное, бОльшую точность. Он занимает восемь байтов в памяти. Диапазон допустимых значений для него по абсолютной величине - примерно от 10 ^-308 до 10 ^308. Точность - примерно 15 десятичных знаков. Тип double является основным типом для хранения значений с плавающей точкой.

11.8. Тип boolean.
Этот тип данных предназначен для хранения логических значений true или false.

12. Литеральные константы.

Для чего нужны переменные? Для того, чтобы хранить значения. Но тогда надо уметь эти значения как-то записывать. Для записи констант в языках программирования используются литеральные константы или просто литералы. На самом деле, примеры литералов используются не только в программировании, но и в обычной математике. Если, скажем, написано уравнение
x=32+y, то в нем x и y - переменные, а 32 - типичный пример того, что в программировании называется литералом.

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

12.1. Целочисленные литералы.
Целочисленные литералы бывают десятичные, восьмеричные и шестнадцатеричные.

Десятичные целочисленные литералы - это любые целые числа (как положительные, так и отрицательные).

Так, например, 5, 0, -123498 являются допустимыми десятичными литералами, в то время, как 5. - не является (присутствует десятичная точка).

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

Как вы помните, числа, записанные в восьмеричной системе могут содержать только цифры от 0 до 7 включительно.

Примечание: Если вы не очень хорошо помните, что такое восьмеричная и шестнадцатеричная системы, советую прочитать статьи для начинающих, посвященные внутреннему представлению данных в компьютере и недесятичным системам счисления. Статьи можно найти здесь: http://club.shelek.com/view.php?id=62&type=0&sort=2&cidtopic=&cidtopic2=

Ведущий ноль в записи восьмеричных литералов используется для того, чтобы компилятор мог отличить их от десятичных. Поэтому 12 будет восприниматься как десятичный литерал (число 12), в то время как 012 - как восьмеричный (число 10). Как легко догадаться, 0168 будет восприниматься компилятором как ошибка (ведущий 0 говорит о том, что это восьмеричное число, но в восьмеричном числе не может присутствовать цифра 8).

Шестнадцатеричные целочисленные литералы - это любые целые числа, записанные в шестнадцатеричной системе (как положительные, так и отрицательные), в начале которых записано сочетание символов 0x (ноль и буква икс, русская буква "ха" недопустима!). Недостающие цифры записываются начальными буквами латинского алфавита, от A до F.

Все буквы, используемые в записи шестнадцатеричного числа могут быть как строчными, так и заглавными. Таким образом, 0x1, 0x2f30, -0X98aB - примеры допустимых шестнадцатеричных литералов.

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

Наряду с обычными целочисленными литералами в Яве есть еще и целочисленные литералы типа long. Для задания такого литерала надо в конце числа добавить букву L, строчную или заглавную. Такие литералы по своему значению не должны выходить за пределы диапазона типа данных long. Примеры допустимых литералов типа long: 0l, -2L, 0x7fffffffffFffffFl.

12.2. Литералы с плавающей точкой.
Литералы с плавающей точкой - это любые числа (как положительные, так и отрицательные), в записи которых использована десятичная точка, показатель степени 10 или и то и другое.

Показатель степени 10 задается буквой E латинского алфавита (строчной или заглавной), сопровождаемой положительным или отрицательным числом - собственно показателем степени. Примеры допустимых литералов с плавающей точкой: 3.1415 , -89. , 123.456 , 0. , 0.0 , .1234 , 0.1234 , 1e2 , 6.06E23 , 6.67e-11 , 3.5E+48

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

Если необходимо указать, что какие-то литералы с плавающей точкой должны относиться к типу float, а не double, в конце к числу добавляется строчная или заглавная буква F. Таким образом, 3.1415F и 3.5E+48f - допустимые литералы с плавающей точкой типа float.

12.3. Символьные литералы.
Символьные литералы в языке Ява всегда используются для обозначения одного символа и всегда заключаются в апострофы. То есть, апострофов всегда два - открывающий и закрывающий. Кавычки для обрамления символьного литерала недопустимы!

Символьные литералы бывают следующих видов:

1. Одиночный символ, заключенный в апострофы, например 'd' , '@' , '3' , 'Q' , ' ' (одиночный пробел между апострофами, обозначает символ "пробел").

У вас может возникнуть вопрос, а как же обозначить апостроф как символ. Может так: ''' ? К сожалению, это не сработает! Компилятор решит, что второй апостроф - это пара к первому, тогда между ними должен быть символ, а его там нет, значит - ошибка. Третий апостроф вообще без пары - еще одна ошибка.

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

2. Два символа, первый из которых - обратная косая черта, заключенные в апострофы. К таким символьным литералам относятся: '\'' - для обозначения символа "апостроф", '\"' - для обозначения символа "кавычки", '\\' - для обозначения символа "обратная косая черта", '\n' - для обозначения перехода на новую строку, '\t'- для обозначения символа табуляции и некоторые другие.

А как быть с символами, отсутствующими на клавиатуре? Для задания таких символов используется еще один вид литералов.

3. Два, три, или четыре символа, первый из которых - обратная косая черта, а остальные - восьмеричные цифры. Как всегда, вся группа заключена в апострофы. Например: '\0' , '\157' , '\62' . Таким способом задается код символа в кодировке ASCII. Соответственно, возможные значения после обратной косой черты - от 0 до 377.

Однако, как мы уже говорили, Ява поддерживает двухбайтовое представление чисел в кодировке Unicode. Что делать, если надо представить символ, не входящий в кодировку ASCII? Для этого используется последний вид символьных литералов.

4. Литерал, состоящий из шести символов, первый из которых - обратная косая черта, следующий - буква "u" латинского алфавита, а оставшиеся четыре - шестнадцатеричные цифры. Вся группа, естественно, заключена в апострофы. Например: '\u0000' , '\u15f7' , '\uab69' . Так задается код символа в кодировке Unicode.

12.3. Логические литералы.
Язык Ява поддерживает две литеральных константы для логических данных (данных типа boolean): true и false. Эти слова являются ключевыми для языка, всегда записываются строчными буквами и могут использоваться исключительно в качестве логических литералов.

Задания.
1. Напишите программу, в которой объявлено по две-три переменных всех стандартных типов данных. Скомпилируйте ее, чтобы убедиться, что переменные созданы правильно.

2. Какие из перечисленных ниже значений являются допустимыми литералами, к каким типам они относятся и каковы их значения?
39 0X39 039 12345 123.45 0x123.45 2e+3f 2e-3f 2e3f 0x2e3f 02e3f 039x 1x39 678,9 '' '\' '\n' 'ab' '\ab' '\00ab' '\uab' '\u00ab' '\u00ab 98765432109876 98765432109876L
Information
  • Posted on 31.01.2010 20:37
  • Просмотры: 381