- •Оглавление
- •Предисловие
- •Введение
- •Глава 1. Средства разработки приложений
- •1.1. Системные требования
- •1.2. Введение в NetBeans
- •1.3. Установка NetBeans
- •1.4. Первый запуск NetBeans
- •1.5. Интерфейс пользователя
- •1.6. Настройки среды
- •1.7. Создание проекта
- •Глава 2. Язык программирования Java
- •2.1. Первое приложение
- •2.2. Метод main
- •2.3. Основные понятия языка Java
- •2.3.1. Переменные и константы
- •2.4. Примитивные типы данных
- •2.4.1. Целые и символьные типы(byte, short, char, int, long)
- •2.4.2. Логический тип Boolean
- •2.4.3. Вещественные типы (float и double)
- •2.5. Ссылочные типы
- •2.6. Выражения и операторы
- •2.6.1. Логические операторы
- •2.6.2. Целочисленные битовые операторы
- •2.6.3. Арифметические операторы
- •2.6.4. Приоритеты выполнения операторов
- •2.6.5. Преобразование типов
- •2.6.6. Оболочечные классы
- •2.7. Класс Math
- •2.8. Сложные типы данных и строки
- •2.8.1. Массивы
- •2.8.2. Строки
- •2.9. Управляющие конструкции
- •2.9.1. Составной оператор
- •2.9.2. Условный оператор if
- •2.9.3. Оператор выбора
- •2.9.4. Операторы цикла
- •2.9.5. Операторы перехода
- •Глава 3. Введение в ООП
- •3.1. Основные принципы ООП
- •3.2. Состав структура и основные свойства классов
- •3.2.1. Описание полей класса
- •3.2.2. Оператор new
- •3.2.3. Описание методов
- •3.2.4. Модификаторы
- •3.2.5. Конструкторы
- •Совмещение методов
- •Глава 4. Рефакторинг
- •Глава 5. Ввод и вывод в Java
- •Глава 6. Графический интерфейс пользователя GUI
- •6.1. Компоненты и контейнеры
- •6.2. Встроенные пакеты GUI классов на основе библиотеки awt
- •6.2.1. Метка Label
- •6.2.2. Кнопка Button
- •6.2.3. Кнопка выбора CheckBox
- •6.2.4. Радио-кнопка Radiobutton
- •6.2.5. Поле ввода TextField
- •6.2.6. Поле ввода TextArea
- •6.3. Использование визуального редактора для проектирования ГИП
- •6.4. Графика в Java
- •6.5. Обработка событий
увеличивается на 1. Во втором случае, сначала происходит увеличение значение переменной b на 1, затем значение присваивается a (a=b+1).
2.6.4. Приоритеты выполнения операторов
При вычислении выражений в Java важен приоритет выполнения операторов, который устанавливает порядок их выполнения. Как и в элементарной алгебре в Java умножение и деление имеет более высокий приоритет чем сложение и вычитание.
Круглые скобки позволяют группировать элементы выражений, при этом выражение в скобках вычисляется до вычислений в остальной части выражения. Скобки имеют более высокий приоритет, чем остальные операторы.
Квадратные скобки используются для индексирования индексов массивов.
Оператор точка используется для выделения члена объекта. В таблица 7 приведены приоритеты операторов в Java.
Та блица 12
Приоритеты операторов Java
Приорите |
Группа операторов |
Операторы |
|
|
|
т |
|
|
|||
Постфиксные |
() |
[] |
. |
|
|
1 высший |
! |
||||
2 |
Унарные |
++ |
-- |
~ |
|
3 |
Создания объектов и |
new |
(тип)операнд |
||
4 |
преобразования типа |
||||
Мультипликатив-ные |
* |
/ |
% |
|
|
5 |
Аддитивные |
+ |
- |
<< |
|
6 |
Сдвиги битов |
>> |
>>> |
instanceof |
|
7 |
Отношения |
> |
< >= |
<= |
|
8 |
Эквивалентности |
== |
!= |
|
|
9 |
Побитовое И |
& |
|
|
|
10 |
Побитовое |
^ |
|
|
|
11 |
исключающее ИЛИ |
|
|
|
|
Побитовое ИЛИ |
| |
|
|
|
|
12 |
Логическое И |
&& |
|
|
|
13 |
Логическое ИЛИ |
|| |
|
|
|
14 |
Условный |
?: |
|
|
|
15 низший |
Присваивания |
= |
|
|
|
2.6.5. Преобразование типов
Рассмотрим пример простой программы на Java в которой вводится два числа и рассчитывается произведение. В строке 05 определяются три переменные типа byte. Ввод значений будем выполнять в стандартных диалоговых окнах ввода (08,09), в строковом формате. Введенные данные будут присвоены строкам as и bs. Для дальнейших расчетов нам потребуется преобразовать (11-12) строковые данные в byte. В 13 строке находится произведение введенных
значений. В строке 15 выполняется вывод найденного значения в окно сообщения.
01 |
|
|
|
// Пакеты расширения Java |
|
|
|||
02 |
|
|
|
import javax.swing.JOptionPane; |
03 |
|
|
|
public class proc { |
04 |
|
|
|
public static void main(String[] args) { |
05 |
|
|
|
byte a, b, c; |
06 |
|
|
|
String as,bs,cs; |
07 |
|
|
|
// Ввод множителей с использованием диалогового окна |
08 |
|
|
|
as = JOptionPane.shownputDialog(“Введите 1-ое число:”); |
09 |
|
|
|
bs = JOptionPane.shownputDialog(“Введите 2-ое число:”); |
10 |
|
|
|
// преобразование из строкового типа в целое |
11 |
|
|
|
a = Byte.parseByte(as); |
12 |
|
|
|
b = Byte.parseByte(bs); |
13 |
|
|
|
c = (byte)(a*b); |
14 |
|
|
|
// Вывод результата в диалоговое окно |
15 |
|
|
|
JOptionPane.showMessageDialog(null, “Произведение = ” + |
|
|
|
c); |
|
16 |
|
|
|
|
|
|
|
System.exit(0); |
|
17 |
|
|
|
} |
18 |
|
|
|
} |
|
|
|
|
Результат вычисления произведения a*b в строке 13, может выйти |
за границы диапазона возможных значений, поэтому в программе принудительно укажем преобразование типа произведения в byte (явное преобразование типов).
В практике программирования часто встречаются случаи, когда для хранения промежуточных результатов вычислений требуется тип данных более широкий, чем у членов выражения.
Если в выражении имеются операнды разных типов: byte, short, int или char, то действуют правила автоматического преобразования типов: происходит автоматическое преобразование в тип int, после чего производится их подстановка в качестве операндов. Если же один из операндов имеет тип long, то второй операнд автоматически преобразуется к этому типу.
Если один из операндов имеет тип double, а другой float, действия производятся с числами типа double, поскольку операнд типа float автоматически преобразуется к типу double.
Если один из операндов целочисленный, а другой вещественный, сначала идёт преобразование целочисленного операнда к вещественному типу, а потом выполняется оператор.
Рассмотрим теперь правила совместимости типов в операторе присваивания. Необходимо помнить что диапазон значений типа левой части не должен быть уже, чем диапазон типа правой. Поэтому в присваиваниях, где тип в правой части не умещается в диапазон левой части, требуется указывать явное преобразование типа. Иначе компилятор выдаст сообщение об ошибке.
Для явного преобразования типа в круглых скобках перед преобразуемой величиной ставят имя того типа, к которому требуется преобразовать. Например:
double d=3.22;
Величину d можно преобразовать к типу float
(float)d
Во многих случаях к явному преобразованию типов прибегать не нужно, так как действует автоматическое преобразование, если переменной, имеющий тип с более широким диапазоном изменения, присваивается выражение, имеющее тип с более узким диапазоном изменения.
Рассмотрим выражение y=x. Если y имеет тип double, а x имеет тип float, то произойдет автоматическое преобразование типа float в тип double. Однако обратного преобразования не произойдет (из double в float), так как компилятор выдаст ошибку «Type mismatch» (несоответствие типов).
Нужно выполнить явное преобразование
y=(float)x
Необходимо помнить, что при этом преобразовании уменьшится на половину точность переменной x.
2.6.6.Оболочечные классы
Вряде случаев вместо значения примитивного типа требуется объект. Например, для работы со списками объектов. Это связано с тем, что работа с объектами в Java может быть унифицирована, поскольку все классы Java являются наследниками класса Object, а для примитивных типов этого сделать нельзя.
Для таких целей в Java каждому примитивному типу сопоставляется объектный тип, то есть класс. Такие классы называются оболочечными (class wrappers). В общем случае они имеют те же имена, что и примитивные типы, но начинающиеся не со строчной, а с заглавной буквы.
|
Та блица 13 |
Примитивные типы и соответствующие оболочечные классы |
|
Примитивный тип |
Оболочечный класс |
byte |
Byte |
short |
Short |
char |
Character |
int |
Integer |
long |
Long |
float |
Float |
double |
Double |
Основное назначение |
оболочечных классов заключается в |
создании объектов, являющихся оболочками над значениями примитивных типов. Процесс создание такого объекта из значения
примитивного типа называется упаковкой (boxing), а обратное преобразование из объекта в величину примитивного типа – распаковкой (unboxing). Оболочечные объекты хранят значение в поле соответствующего примитивного типа. Его значение доступно для чтения с помощью функции имяТипаValue().
Пример.
Метод byteValue() используется для доступа к значению объекта типа Byte.
Во многих случаях можно вообще не обращать внимания на отличие переменных с типом оболочечных классов от переменных примитивных типов, так как упаковка и распаковка при подстановке такого объекта в выражение происходит автоматически, и объект оболочечного типа в этих случаях внешне ведёт себя как число. Таким образом, если нам необходимо хранить в объекте числовое значение, то следует создать объект соответствующего оболочечного типа.
Пример.
Integer int_object = 7; int_integer = int_object*34; Byte byte_object = 8; int_object = int_object/3;
byte_object = 2;
Примечание. При операциях упаковки-распаковки выполняются дополнительные операции копирования значений в промежуточные буферные ячейки, поэтому соответствующие вычисления будут требовать больше времени и памяти, чем операций с примитивными типами, что может привести к общему повышению времени выполнения программы. С другой стороны, автоматическая упаковкараспаковка во многих случаях заметно упрощает программирование и делает текст программы более читаемым, так что для участков программы, некритичных к быстродействию, ею вполне можно пользоваться.
Помимо создания объектов, оболочечные классы имеют ряд других полезных применений. Например, в числовых оболочечных классах хранятся константы, с помощью которых можно получить максимальные и минимальные значения:
Byte.MAX_VALUE, Float.MIN_VALUE,
Double.MIN_VALUE, Double.MAX_VALUE и т.п.
В оболочечных классах также имеются методы, которые могут работать при отсутствии объекта соответствующего типа. Для их вызова используют имя типа.
Пример. Преобразование строки в число заданного типа.
Byte.parseByte(строка)
Short.parseShort(строка)
Integer.parseInt(строка)
Long.parseLong(строка)
