После установки запускаем приложение NetBeans. В окне приложения выбираем команду Файл ^Создать проект, как показано на рис. 1.1.
В появившемся окне Создать проект выберите тип создаваемого приложения (рис. 1.3). В зависимости от версии и "комплектации" среды разработки NetBeans окно может выглядеть по-разному, но идея остается неизменной: необходимо указать язык разработки (если соответствующая версия NetBeans допускает использование нескольких языков) и непосредственно тип приложения. В данном случае выбираем в категории языков (список Категории в левой части окна) пункт Java (что соответствует языку Java), а в правой части окна в списке Проекты выбираем пункт Приложение Java.
В следующем окне Новый Приложение Java Application (рис. 1.4) следует указать название создаваемого проекта - в поле Имя проекта. По возможности имя должно быть кратким и информативным. В поле Расположение проекта указываем место, где будет сохранен проект. Флажок Создать главный класс оставляем установленными. В поле возле опции Создать главный класс дублируем название проекта HelloWorld2 - в этом поле вводится название для главного класса программы. По окончании нажимаем Готово.
Создается проект с шаблонным программным кодом, который вы потом можете менять, дополнять и т.д.
Начнем с примера:
Мы рекомендуем вам попробовать написать исходный текст во всех доступных вам средах разработки и редакторах, чтобы определить, какой из них вам больше всего подходит.
Для большинства языков программирования не важно, как называется файл исходного кода, но для компилятора языка Java имя файла существенно. Поэтому мы и указываем имя, под которым нужно сохранить исходный код первой программы: HelloWorld2.java.
public class HelloWorld2{
public static void main(String[] args){
System.out.println("Всем большой текстовый привет!"); }
Результат представлен на рис 2.8.
Та же простая программа, но с использованием графической библиотеки
приведена ниже. При этом вывод программы осуществляется в виде окна (рис. 2.9).
import javaxeswing.*;,
public class helioworld {
public static void main (String[] args){
JOptionPane.showMessageDialog(null, "Привет, изучаем Java ");
Основные конструкции языка
Переменные и присвоение значений
Действие, которое в большинстве программ встречается чаще всего, - это присвоение значений переменным. Любой язык программирования обязательно содержит команду присваивания, а то и несколько. Язык Java - не исключение.
Под переменной понимается именованная область памяти, содержимое которой является значением этой переменной. В ходе работы программы значение переменной может многократно меняться. Способность менять значение - это отличительное свойство переменных.
Напишем пример, демонстрирующий объявление переменных и присвоение им значений (листинг 2.2).
Листинг 2.2 Использование переменных
// Пример присвоения значений переменным public class AssignExample {
public static void main(String[] args) {
// объявляем две переменные int varl; int var2;
// присваиваем им значения: varl = 4096; var2 = varl / 4;
/
// выводим текущие значения переменных System.out.printIn("varl = " + varl);
System.out.println("var2 = varl / 4 = " + var2);
} // main!)
} // AssignExample class
После запуска этой простой программы вы увидите на экране следующий вывод:
Ү:\>java AssignExample
varl = 4096
var2 = varl / 4 = 1024
Разберем листинг 2.2 построчно. Первая незакомментированная строка метода main () содержит объявление переменной с именем varl:
int varl;
Это переменная целого (int) типа. Объявление переменной определенного типа указывает компилятору, сколько памяти он должен зарезервировать для хранения значений этой переменной. В Java существует непреложное правило, согласно которому каждая переменная должна быть объявлена перед первым ее использованием. Подробнее о типах мы поговорим далее.
Примечание
Программисты на C/C++ могли бы возразить, что в данном случае речь идет не об объявлении, а об определении переменной; поскольку под нее выделяется память. Однако в языке Java различия между этими двумя понятиями не существует, и закрепился термин «объявление переменной».
В следующей строке листинга точно так же объявляется переменная целого типа var2. Далее переменной varl присваивается целочисленная константа:
varl = 4096;
Действие присваивания обозначается в языке Java символом «=». Символы или группы символов, которые служат для обозначения различных видов операций, называются операторами. Таким образом, символ «=» - это оператор присваивания. Далее в этой главе мы рассмотрим другие операторы.
var2 = varl / 4;
В этой строке переменной var2 присваивается значение не константы, а выражения. Значение вычисленного арифметического выражения становится значением переменной var2, при этом значение переменной varl не изменяется.
Арифметические операции в языке Java обозначаются общепринятыми символами (+,-,*,/ и т. п.).
System.out.printIn("varl ="+ varl);
В этой строке значение переменной выводится на консоль с помощью уже знакомого вам метода print Ln (). Новое для вас здесь - подготовка строки к выводу: результирующая строка формируется из текста в кавычках и преобразованного к строковому виду значения переменной var1. Оператор «+» здесь служит не для сложения чисел, а для слияния строк.
Типы данных
Тип данных - это характеристика переменной или константы, определяющая, какого рода значение хранится в отведенной для нее области памяти: числовое (целое или вещественное), символьное, логическое, объект какого-либо класса или другое.
Каждый язык программирования предоставляет программисту несколько типов данных для представления различных значений переменных. Типы данных языка во многом определяют его возможности и круг задач, которые на этом языке можно решать. Типы данных и их использование - обширнейшая тема, которой можно было бы посвятить четверть этой книги, но мы ограничимся изложением только самых необходимых сведений.
Напомним, что Java - строго типизированный язык, из чего следует, в числе прочего, что любая переменная перед ее использованием должна быть объявлена с указанием ее типа.
Встроенные типы данных Java делятся на две категории: простые (primitive) и ссылочные (reference). К ссылочным типам относятся массивы, классы, интерфейсы и перечисления. Простые типы данных делятся на числовые (целые и вещественные) и логические, причем символьный тип относится к числовым.
Примечание
Такие естественные для программистов на других языках типы данных, как строковый и дата/время, реализованы в Java как ссылочные: классами string и Date.
Целочисленные типы
Для хранения целых чисел в Java предусмотрены четыре типа данных (табл. 2.1). Все они хранят целые числа со знаком. Беззнаковых числовых типов, как в C/C+ +, в языке Java нет.
Характеристики целочисленных типов данных Таблица 2.1
|
Тип int (integer) используется чаще всего. Обычно именно этот тип имеют переменные цикла, индексы массива и т. п. Тип long предназначен для хранения чисел, выходящих за пределы диапазона int.
Меньше всего памяти занимает число типа byte - один байт. Это единственный тип данных в языке Java, который используется для побайтовой обработки двоичных данных.
Последний тип, short, отличается тем, что старший байт двухбайтового числа хранится в памяти первым. Так хранились целые числа на 16-разрядных компьютерах, а в наше 32-разрядное время этот тип данных почти вышел из употребления.
Символьный тип
К целочисленным типам относится и тип char, предназначенный для представления одного символа.
К хранению символов национальных алфавитов разработчики Java отнеслись с особым вниманием, потому что приложения, написанные на Java, должны были работать по всему миру. В отличие от большинства других языков, где символ занимает один байт, размер типа char в Java составляет 2 байта. Такой размер необходим для хранения символа по стандарту Unicode.
Unicode - это стандарт кодирования множества национальных алфавитов, видов письма, технических и математических символов, разработанный для того, чтобы разрешить проблемы интернационализации в многоязычной компьютерной среде. Более ранний стандарт ASCII, в котором каждый символ представлен одним байтом, был пригоден только для европейских языков. Таблица ASCII вошла в набор Unicode как его подмножество.
Собственно Unicode - это набор (последовательность) символов, который можно закодировать разными способами. Язык Java использует кодировку UTF-8, которая отводит по одному байту для букв западно-европейских алфавитов, по два байта - для восточноевропейских, а для алфавитов экзотических языков - три и более байтов. При этом строки, содержащие только 7-битные символы из первой половины таблицы ASCII, имеют одинаковое представление как в ASCII, так и в UTF-8.
Переменной типа char можно присвоить в качестве значения одиночный символ - как печатный, так и управляющий. Например, переменной ch можно присвоить букву L:
char ch; ch = 'L';
Вывести на консоль значение переменной типа char можно с помощью метода print In ();
System.out.printIn("Значение переменной ch равно " + ch);
Поскольку тип данных char относится к целочисленным, над ним можно выполнять арифметические операции. Следующий пример демонстрирует применение операторов инкремента + + и декремента -.
Листинг 2.6. Операции инкремента и декремента над переменной символьного типа
// сохраните исходный код в файле с именем CharArithDemo.java public class CharArithDemo {
public static void main(String[] args) { char ch;
ch = 'L';
System.out.printing"ch равно " + ch); ch++;
System.out.printIn("значение ch изменилось на ", + ch);
ch = 'Д'; ch--;
System.out.println("значение ch снова изменилось
и равно " + ch);
} // main(String[])
} // CharArithDemo class
Эта программа выведет следующие строки:
ch равно L
значение ch изменилось на М значение ch снова изменилось и равно Г
Важное замечание: символ (‘А’) и строка из одного символа («А») — это совершенно разные вещи с точки зрения языка Java. Данные символьного и строкового типа хранятся в памяти по-разному.
Типы данных для вещественных чисел
Вещественное число, как известно, состоит из целой и дробной части, разделенных десятичной точкой. Для представления вещественных чисел Java располагает двумя типами данных: float и double. Первый из них предназначен для хранения чисел с 7-8 значащими цифрами, второй - для чисел с двойной точностью (15-16 значащих цифр).
Характеристики вещественных типов данных Таблица 2.2
|
Тип данных double используется гораздо чаще, чем float. С ним работают все математические функции библиотек Java. Например, метод sqrt (), определенный в классе Math и вычисляющий квадратный корень своего аргумента, принимает аргумент типа double и возвращает значение этого же типа. Следующий пример демонстрирует применение метода sqrt () для вычисления длины гипотенузы прямоугольного треугольника по теореме Пифагора.
Листинг 2.7. Пример работы с вещественными числами
// вычисление длины гипотенузы по теореме Пифагора public class HypotDemo {
public static void main(String[] args) {
double cathetusl, cathetus2, hypot;
cathetusl =3; // длина первого катета cathetus2 =4; // длина второго катета
hypot = Math.sqrt((cathetusl * cathetusl) +
(cathetus2 * cathetus2));
System.out.printIn("длина гипотенузы равна " + hypot); } // main(String[])
} // class HypotDemo
Логический тип
Переменная типа boolean (логического) может принимать всего два значения: true (истина) и false (ложь). Для наглядности приведем небольшой пример:
Листинг 2.8. Демонстрация переменных логического типа
// пример использования типа данных boolean // сохраните в файл BoolDemo.java public class BoolDemo { public static void main(String[] args) {
boolean b;
b = false;
System.out.printIn("b равно " + b);
b = true;
System.out.printIn("b равно "+ b);
// переменная логического типа может стоять // в условии оператора if
if (b) System.out.printIn("Как вы думаете, увидите ли вы эту строку?");
// операторы сравнения возвращают логическое значение
System.out.printIn("Выражение 10 > 9 имеет значение "
+ (10 > 9));
} // main(Stringf] args)
} // BoolDemo class
Когда вы запустите программу BoolDemo, вы можете заметить, что метод println () выводит значение логического типа в виде строки true или false. Из листинга видно также, что при условном операторе не обязательно должно стоять логическое выражение - с таким же успехом интерпретатор Java может проверять значение переменной типа boolean. Благодаря этому отпадает необходимость писать громоздкие конструкции вроде:
if (b == true) System, out.println ("true")■;
/*хотя это тоже допустимо*/
В последней команде вывода метод print In () печатает значение не переменной, а логического выражения (10 > 9), возвращающего значение true. Забегая вперед, скажем, что выражение в данном случае должно быть взято в скобки, потому что оператор конкатенации строк «+» имеет более высокий приоритет, чем оператор сравнения «>».
Литералы и константы
Литерал - это постоянное значение, записанное в программе в читаемой форме. Например, число 100 - это литерал, одиночный символ и текстовая строка тоже могут быть литералами и т. д.
Литерал отличается от константы и переменной тем, что ему не может быть присвоено значение. На самом деле, в своей программе вы в качестве значений констант и переменных обычно используете литералы. Например:
Counter= 1;
Textstr = "Произвольная строка";
ch = '?';
А = 4е-1;
Здесь Counter, Textstr, S, А – это переменные, а 1, "Произвольная строка", '? ', 4е-1 - литералы.
Литерал может иметь значение любого простого типа данных. Тип литерала определяется формой его записи. Например, '?' - это литерал символьного типа, а «?» - строкового; 10 - типа int, а 10.0 - типа double. Вещественные числа записываются либо с десятичной точкой, либо в так называемой научной (экспоненциальной) нотации с указанием степени числа 10: 4е-1 - то же самое, что 0.4.
Для того, чтобы заставить компилятор считать литерал, опознаваемый им как данные одного типа, данными другого типа, служат модификаторы типа. Символ L (заглавный или строчный) превращает литерал типа int в литерал типа long:
int nl = 24;
long n2 = 24L;
Вещественные литералы имеют по умолчанию тип данных double. Чтобы его поменять на float, добавьте к присваиваемому значению символ F:
float fl = 12.34F;
Целочисленные литералы распознаются как тип int, но их можно присваивать также переменным других целых типов: short, byte и char - при условии, что значение литерала не выходит за пределы диапазона для соответствующего типа, а переменной типа long - без всяких условий.
Шестнадцатеричные и восьмеричные литералы
Если вы уже когда-нибудь писали программы, то знаете, что нередко приходится работать с числами, которые удобнее представлять не в десятичной записи. Язык Java позволяет без труда использовать восьмеричную и шестнадцатеричную формы записи:
hex = OxFF // в десятичной системе соответствует числу 255
oct = 01l //в десятичной системе соответствует числу 9
Если запись числа начинается с нуля, то число понимается как восьмеричное; если в префиксе «Ох», то - как шестнадцатеричное.
Специальные символы (Esc-последовательности)
Как уже сказано, переменной типа char можно присваивать в качестве значения не только алфавитно-цифровой символ, но и такой, который нельзя ввести с клавиатуры - например, символы, посылаемые клавишами «Таb» или «Backspace». Для того, чтобы использовать такие символы в литералах, служат так называемые Esc-последовательности, то есть символ обратного слэша, за которым следует код вводимого символа (табл. 2.3).
Esc-последовательности в языке Java Таблица 2.3 |
Примеры:
char ch;
ch = '\t'; // знак табуляции
ch ='\ ''; // символ апострофа
Строковые литералы
Распространенной разновидностью литерала в языке Java является строка - последовательность символов, заключенная в кавычки:
System.out.println("Это строковый литерал");
А что делать, если внутри самой строки встречается кавычка? Не будет ли она воспринята как символ завершения строки? Будет, если ее не экранировать с помощью Esc-последовательности:
System.out.println("0\'Key"); // строка с апострофом
System.out.println("Строка с \"кавычками\"");
Часто строковые литералы используются для указания пути к некоторому файлу. В ОС Windows символом-разделителем пути служит обратный слэш. Его тоже необходимо экранировать с помощью Esc-последовательности:
String filename = "с:\\project\\helloworld\\HelloWorld.java";
Примечание
В ОС семейства Unix для разделения пути служит прямой слэш (/). Интерпретатор Java позволяет использовать этот символ и на платформе Windows. Рекомендуется для единообразия всегда писать пути через прямой слэш. Экранировать этот символ не нужно.
Следующий пример показывает, как использовать Esc-последовательности для представления специальных символов внутри строки.
Листинг 2.9. Символы форматирования текста
public class StrDemo { public static void main(String[] args) {
// для перевода каретки (начала новой строки)
// служит код \п
System.out.println("Первая строкаХпВторая строка");
// знак табуляции помогает оформить выводимый текст // в колонки. Он вводится с помощью кода \t System.out.println("A\tB\tC");
System.out.println("D\tE\tF");
} // main(String[]) method }
// StrDemo class