Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
java / Java_Intro1_220509.pdf
Скачиваний:
251
Добавлен:
11.05.2015
Размер:
1.71 Mб
Скачать

увеличивается на 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

Основное назначение

оболочечных классов заключается в

создании объектов, являющихся оболочками над значениями примитивных типов. Процесс создание такого объекта из значения

Byte.MIN_VALUE, Float.MAX_VALUE,

примитивного типа называется упаковкой (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(строка)

Соседние файлы в папке java