АвтоАвтоматизацияАрхитектураАстрономияАудитБиологияБухгалтерияВоенное делоГенетикаГеографияГеологияГосударствоДомДругоеЖурналистика и СМИИзобретательствоИностранные языкиИнформатикаИскусствоИсторияКомпьютерыКулинарияКультураЛексикологияЛитератураЛогикаМаркетингМатематикаМашиностроениеМедицинаМенеджментМеталлы и СваркаМеханикаМузыкаНаселениеОбразованиеОхрана безопасности жизниОхрана ТрудаПедагогикаПолитикаПравоПриборостроениеПрограммированиеПроизводствоПромышленностьПсихологияРадиоРегилияСвязьСоциологияСпортСтандартизацияСтроительствоТехнологииТорговляТуризмФизикаФизиологияФилософияФинансыХимияХозяйствоЦеннообразованиеЧерчениеЭкологияЭконометрикаЭкономикаЭлектроникаЮриспунденкция

Booleanзначение ? первое : второе

Читайте также:
  1. I. МОГИЛЬЩИК: ПЕРВОЕ ПРИБЛИЖЕНИЕ
  2. Внутренняя энергия тела и способы её изменения. Изменение внутренней энергии тела при нагревании. Первое начало термодинамики. Обратимые и необратимые процессы.
  3. Вопрос 16 Первое начало термодинамики
  4. Вопрос 20 Второе начало термодинамики
  5. Вопрос Естествознание в России. Учреждение Академии наук. Первое поколение ученых.
  6. Вопрос№24 Первое начало теории динамики. Работа газа. КПД тепловых двигателей
  7. ВТОРОЕ АУТОДАФЕ
  8. Второе важное обстоятельство - преобразования Галилея меняют вид уравнений Максвелла
  9. Второе заседание
  10. Второе начало термодинамики
  11. Второе начало термодинамики

Если booleanзначение равно true, вычисляется значение выражения первое и оно становится результатом всего оператора, иначе результатом является значение выражения второе.

Оператор instanceof возвращает значение true, если объект является экземпляром данного типа. Например, для иерархии наследования:

class Course extends Object {}

class BaseCourse extends Course {}

class FreeCourse extends BaseCourse {}

BaseCourse
Course
FreeCourse
OptionalCourse

class OptionalCourse extends Course {}

Рис. 2.2. Иерархия наследования

применение оператора instanceof может выглядеть следующим образом при вызове метода doLogic(Course c):

void doLogic(Course c) {

if (c instanceof BaseCourse) { /*реализация для BaseCourse и

FreeCourse*/

} else if (c instanceof OptionalCourse) { /*реализация для

OptionalCourse*/

} else { /*реализация для Course*/ }

}

Результатом действия оператора instanceof будет истина, если объект является объектом данного типа или одного из его подклассов, но не наоборот. Проверка на принадлежность объекта к классу Object всегда даст истину, поскольку любой класс является наследником класса Object. Результат применения этого оператора по отношению к ссылке на значение null всегда ложь, потому что null нельзя причислить к какому-либо типу. В то же время литерал null можно передавать в методы по ссылке на любой объектный тип и использовать в качестве возвращаемого значения. Базовому типу значение null присвоить нельзя, так же как использовать ссылку на базовый тип в операторе instanceof.

Классы-оболочки

Кроме базовых типов данных, в языке Java широко используются соответст­вующие классы-оболочки (wrapper-классы) из пакета java.lang: Boolean, Character, Integer, Byte, Short, Long, Float, Double. Объекты этих классов могут хранить те же значения, что и соответствующие им базовые типы.

Float
Number
+
byteValue(): byte
+
doubleValue(): double
+
floatValue(): float
 
+
intValue(): int
+
longValue(): long
+
shortValue(): short
«interface»
Comparable
Integer
Byte
Double
Long
Short
Character
Void
Boolean
+
booleanValue(): boolean
+
equals(Object): boolean
+
getBoolean(String): boolean
+
compareTo(Boolean): int
+
parseBoolean(String): boolean
+
valueOf(): Boolean

Рис. 2.3. Классы-оболочки

Объектыэтих классов представляют ссылки на участки динамической памяти, в которой хранятся их значения, и являются классами-оболочками для значений базовых типов. Классы, соответствующие числовым базовым типам, находятся в библиотеке java.lang, являются наследниками абстрактного класса Number и реализуют интерфейс Comparable, представляющий собой интерфейс для определения возможности сравнения объектов одного типа между собой. Объекты классов-оболочек по умолчанию получают значение null.

Переменную базового типа можно преобразовать к соответствующему объекту, передав ее значение конструктору при объявлении объекта. Объекты класса могут быть преобразованы к любому базовому типу методами тип Value() или обычным присваиванием.

Класс Character не является подклассом Number, этому классу нет необходимости поддерживать интерфейс классов, предназначенных для хранения результатов арифметических операций. Класс Character имеет целый ряд специфических методов для обработки символьной информации. У класса Character, в отличие от других классов оболочек, не существует конструктора с параметром типа String.

/* пример # 3: преобразование типов данных: CastTypes.java */

package chapt02;

public class CastTypes {

public static void main(String[] args) {

Float f1 = new Float(10.71); // double в Float

String s1 = Float. toString (0f); // float в String

String s2 = String. valueOf (f1); // Float в String

Byte b = Byte. valueOf ("120"); // String в Byte

double d = b.doubleValue(); // Byte в double

byte b0=(byte)(float)f1; // Float в byte

//b2 = (byte)f1; // невозможно!!!

/*f1 – не базовый тип, а класс */

short s = (short) d; // double в short

/* Character в int */

Character ch = new Character('3');

int i = Character. digit (ch.charValue(), 10);

System. out. printf("f1=%1.2e s1=%s s2=%s%n", f1, s1, s2);

System. out. printf("b=%o d=%.1f b0=%d s=%d i=%d",

b, d, b0, s, i);

}

}

Результатом выполнения данного кода будет:

f1=1.07e+01 s1=0.0 s2=10.71

b=170 d=120,0 b0=10 s=120 i=3

Метод valueOf(String str) определен для всех классов-оболочек, соответствующих примитивным типам, и выполняет действия по преобразованию значения, заданного в виде строки, к значению соответствующего объектного типа данных.

Java включает два класса для работы с высокоточной арифметикой –
java.math.BigInteger и java.math.BigDecimal,которые поддержи­вают целые числа и числа с фиксированной точкой произвольной длины.

Строка в Java представляет объект класса String. При работе со строками кроме методов класса String можно использовать перегруженную операцию " + " объединения строк. Строковые константы заключаются в двойные кавычки и не заканчиваются символом '\0', это не ASCII-строки, а массивы символов.

В версии 5.0 введен процесс автоматической инкапсуляции данных базовых типов в соответствующие объекты оболочки и обратно (автоупаковка). При этом нет необходимости в создании соответствующего объекта с использованием оператора new. Например:

Integer iob = 71;

Автораспаковка – процесс извлечения из объекта-оболочки значения базового типа. Вызовы таких методов, как intValue(), doubleValue() становятся излишними.

Допускается участие объектов в арифметических операциях, однако не следует этим злоупотреблять, поскольку упаковка/распаковка является ресурсоемким процессом:

// пример # 4: autoboxing & unboxing: NewProperties.java

package chapt02;

public class NewProperties {

public static void main(String[] args) {

Integer j = 71; //создание объекта+упаковка

Integer k = ++j; //распаковка+операция+упаковка

int i = 2;

k = i + j + k;

}

}

Однако следующий код генерирует исключительную ситуацию
NullPointerException при попытке присвоить базовому типу значение null объекта класса Integer:

Integer j = null; //объект не создан!

int i = j; //генерация исключения во время выполнения

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

int i = 128; //заменить на 127!!!

Integer oa = i; //создание объекта+упаковка

Integer ob = i;

System. out. println("oa==i " + (oa == i)); // true

System. out. println("ob==i " + (ob == i)); // true

System. out. println("oa==ob " + (oa == ob)); // false(ссылки разные)

System. out. println("equals ->" + oa.equals(i)

+ ob.equals(i)

+ oa.equals(ob)); // true

Метод equals() сравнивает не значения объектных ссылок, а значения объектов, на которые установлены эти ссылки. Поэтому вызов oa.equals(ob) возвращает значение true.

Значение базового типа может быть передано в метод equals(). Однако ссылка на базовый тип не может вызывать методы:

boolean b = i.equals(oa); // ошибка компиляции

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

Float f = 7; // правильно будет (float)7 или 7F вместо 7

вызывает ошибку компиляции.

Кроме того, стало возможным создавать объекты и массивы, сохраняющие различные базовые типы без взаимных преобразований, с помощью ссылки на класс Number, а именно:

Number n1 = 1;

Number n2 = 7.1;

Number array[] = {71, 7.1, 7L};

При автоупаковке значения базового типа возможны ситуации с появлением некорректных значений и непроверяемых ошибок.

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

Операторы управления

Оператор выбора if имеет следующий синтаксис:

if (boolexp) { /*операторы*/ } //1

else { /*операторы*/ } //2

Если выражение boolexp принимает значение true, то выполняется группа операторов 1, иначе – группа операторов 2. При отсутствии оператора else операторы, расположенные после окончания оператора if (строка 2), выполняются вне зависимости от значения булевского выражения оператора if. Допустимо также использование конструкции-лесенки if {} else if {}.

Аналогично C++ используется оператор switch:

switch (exp) {

case exp1:{ /*операторы*/ }

break;

case expN:{ /*операторы*/ }

break;

default: { /*операторы*/ }

}

При совпадении условий вида exp==exp1 выполняются подряд все блоки операторов до тех пор, пока не встретится оператор break, Значения exp1,…, expN должны быть константами и могут иметь значения типа int, byte, short, char или enum.

Операторы условного перехода следует применять так, чтобы нормальный ход выполнения программы был очевиден. После if следует располагать код, удовлетворяющий нормальной работе алгоритма, после else побочные и исключительные варианты. Аналогично для оператора switch нормальное исполнение алгоритма следует располагать в инструкциях case (наиболее вероятные варианты размещаются раньше остальных), альтернативное или для значений по умолчанию – в инструкции default.

В Java существует четыре вида циклов, первые три из них аналогичны соответствующим циклам в языке С++:

while (boolexp) { /*операторы*/ } // цикл с предусловием

do { /*операторы*/ } while (boolexp); // цикл с постусловием

 

for (exp1; boolexp; exp3){ /*операторы*/ } // цикл с параметрами

Здесь по традиции exp1 – начальное выражение, boolexp – условие выполнения цикла, exp3 – выражение, выполняемое в конце итерации цикла (как правило, это изменение начального значения). Циклы выполняются, пока булевское выражение boolexp равно true.

Некоторые рекомендации при проектировании циклов:

- проверка условия для всех циклов выполняется только один раз за одну итерацию, для циклов for и while – перед итерацией, для цикла do/while – по окончании итерации.

- цикл for следует использовать при необходимости выполнения алгоритма строго определенное количество раз. Цикл while используется в случае, когда неизвестно число итераций для достижения необходимого результата, например, поиск необходимого значения в массиве или коллекции. Этот цикл применяется для организации бесконечных циклов в виде while(true).

- для цикла for не рекомендуется в цикле изменять индекс цикла.

- условие завершения цикла должно быть очевидным, чтобы цикл не «сорвался» в бесконечный цикл.

- для индексов следует применять осмысленные имена.

- циклы не должны быть слишком длинными. Такой цикл претендует на выделение в отдельный метод.

- вложенность циклов не должна превышать трех.

В версии 5.0 введен еще один цикл, упрощающий доступ к массивам и коллекциям:

for (ТипДанных имя: имяОбъекта){ /*операторы*/ }

При работе с массивами и коллекциями с помощью данного цикла можно получить доступ ко всем их элементам без использования индексов.

int [] array = {1, 3, 5};

for (int i: array) // просмотр всех элементов массива

System. out. printf("%d ", i); // вывод всех элементов

Изменять значения элементов массива с помощью такого цикла нельзя. Данный цикл может обрабатывать и единичный объект, если его класс реализует интерфейсы Iterable и Iterator.

В языке Java расширились возможности оператора прерывания цикла break и оператора прерывания итерации цикла continue, которые можно использовать с меткой, например:

int j = -3;

OUT: while (true) {

for (;;)

while (j < 10) {

if (j == 0)

break OUT;

else {

j++;

System. out. printf("%d ", j);

}

}

}

System. out. print("end");

Здесь оператор break разрывает цикл, помеченный меткой OUT. Тем самым решается вопрос об отсутствии необходимости в операторе goto для выхода из вложенных циклов.

Массивы

Массив представляет собой объект, где имя массива является объектной ссылкой. Элементами массива могут быть значения базового типа или объекты. Индексирование элементов начинается с нуля. Все массивы в языке Java являются динамическими, поэтому для создания массива требуется выделение памяти с помощью оператора new или прямой инициализации. Значения элементов неинициализированного массива, для которого выделена память, устанавливаются в значения по умолчанию для массива базового типа или null для массива объектных ссылок. Для объявления ссылки на массив можно записать пустые квадратные скобки после имени типа, например: int a[]. Аналогичный результат получится при записи int[] a.

/* пример # 5: массивы и ссылки: ArrRef.java */

package chapt02;

public class ArrRef {

public static void main(String[] args) {

int myRef[], my; // объявление ссылки на массив и переменной

float [] myRefFloat, myFloat; // два массива!

// объявление с инициализацией нулевыми значениями по умолчанию

int myDyn[] = new int [10];

/*объявление с инициализацией */

int myInt[] = {5, 7, 9, -5, 6, -2}; //6 элементов

byte myByte[] = {1, 3, 5}; //3 элемента

/*объявление с помощью ссылки на Object */

Object myObj = new float [5];

// допустимые присваивания ссылок

myRef = myDyn;

myDyn = myInt;

myRefFloat = (float [])myObj;

myObj = myByte; // источник ошибки для следующей строки

myRefFloat = (float [])myObj; // ошибка выполнения

// недопустимые присваивания ссылок (нековариантность)

// myInt = myByte;

//myInt = (int [])myByte;

}

}

Ссылка на Object может быть проинициализирована массивом любого типа и любой размерности. Обратное действие требует обязательного приведения типов и корректно только в случае, если тип значений массива и тип ссылки совпадают. Если же ссылка на массив объявлена с указанием типа, то она может содержать данные только указанного типа и присваиваться другой ссылке такого же типа. Приведение типов в этом случае невозможно.

Присваивание myDyn=myInt приведет к тому, что значения элементов массива myDyn будут утрачены и две ссылки будут установлены на один массив myInt, то есть будут ссылаться на один и тот же участок памяти.

Массив представляет собой безопасный объект, поскольку все элементы инициализируются и доступ к элементам невозможен за пределами границ. Размерность массива хранится в его свойстве length.

Многомерных массивов в Java не существует, но можно объявлять массив массивов. Для задания начальных значений массивов существует специальная форма инициализатора, например:

int arr[][] = { { 1 },

{ 2, 3 },

{ 4, 5, 6 },

{ 7, 8, 9, 0 }

};

Первый индекс указывает на порядковый номер массива, например arr[2][0] указывает на первый элемент третьего массива, а именно на значение 4.

Matrix
-
a: int[][]
+
Matrix(int, int)
+
getHorizontalSize(): int
+
getVerticalSize(): int
+
getElement(int, int): int  
+
setElement(int, int, int): void
+
toString(): String
MatrixFactory
+
createRandomized(int, int): Matrix
Multiplicator
+
multiply(Matrix, Matrix): void

В следующей программе создаются и инициализируются массивы массивов равной длины (матрицы) и выполняется произведение одной матрицы на другую.

Рис. 2.4. Диаграмма классов для создания и умножения матриц

/* пример # 6: класс хранения матрицы: Matrix.java */

package chapt02;

 

public class Matrix {

private int [][] a;

 

public Matrix(int n, int m) {

// создание и заполнение нулевыми значениями

a = new int [n][m];

}

public int getVerticalSize() {

return a.length;

}

public int getHorizontalSize() {

return a[0].length;

}

public int getElement(int i, int j) {

return a[i][j];

}

public void setElement(int i, int j, int value) {

a[i][j] = value;

}

public String toString() {

String s = "\nMatrix: " + a.length +

"x" + a[0].length + "\n";

for (int [] vector: a) {

for (int value: vector)

s+= value+" ";

s += "\n";

}

return s;

}

}

/* пример # 7: класс-создатель матрицы: MatrixFactory.java */

package chapt02;

 

public class MatrixFactory {

 

public static Matrix createRandomized(int n, int m) {

Matrix matrix = new Matrix(n, m);

for (int i = 0; i < n; i++) {

for (int j = 0; j < m; j++) {

matrix.setElement(i, j, (int)(Math. random ()*m*m));

}

}

return matrix;

}

}

/* пример # 8: произведение двух матриц: Multiplicator.java */

package chapt02;

 

public class Multiplicator {

 

public static Matrix multiply(Matrix p, Matrix q)

throws MultipleException {

int v = p.getVerticalSize();

int h = q.getHorizontalSize();

int temp = p.getHorizontalSize();

// проверка возможности умножения

if (temp!= q.getVerticalSize())

throw new MultipleException();

// создание матрицы результата

Matrix result = new Matrix(v, h);

// умножение

for (int i = 0; i < v; i++)

for (int j = 0; j < h; j++) {

int value = 0;

for (int k = 0; k < temp; k++) {

value += p.getElement(i, k) * q.getElement(k, j);

}

result.setElement(i, j, value);

}

return result;

}

}

/* пример # 9: исключительная ситуация матрицы: MultipleException.java */

package chapt02;

public class MultipleException extends Exception {}

/* пример # 10: класс, запускающий приложение: Runner.java */

package chapt02;

public class Runner {

public static void main(String[] args) {

int n = 2, m = 3, l = 4;

Matrix p = MatrixFactory. createRandomized (n, m);

Matrix q = MatrixFactory. createRandomized (m, l);

System. out. println("Matrix first is: " + p);

System. out. println("Matrix second is: " + q);

 

try {

Matrix result = Multiplicator. multiply (p, q);

System. out. println("Matrix product is: "

+ result);

} catch (MultipleException e){

System. err. println("Matrices could"

+ " not be multiplied: ");

}

}

}

Так как значения элементам массивов присваиваются при помощи метода random(), то одним из вариантов выполнения кода может быть следующий:

Matrix first is:


1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 | 11 | 12 | 13 | 14 | 15 | 16 | 17 | 18 | 19 | 20 | 21 | 22 | 23 | 24 | 25 | 26 | 27 | 28 | 29 | 30 | 31 | 32 | 33 | 34 | 35 | 36 | 37 | 38 | 39 | 40 | 41 | 42 | 43 | 44 | 45 | 46 | 47 | 48 | 49 | 50 | 51 | 52 | 53 | 54 | 55 | 56 | 57 | 58 | 59 | 60 | 61 | 62 | 63 | 64 | 65 | 66 | 67 | 68 | 69 | 70 | 71 | 72 | 73 | 74 | 75 | 76 | 77 | 78 | 79 | 80 | 81 | 82 | 83 | 84 | 85 | 86 | 87 | 88 | 89 | 90 | 91 | 92 | 93 | 94 | 95 | 96 | 97 | 98 | 99 | 100 | 101 | 102 | 103 | 104 | 105 | 106 | 107 | 108 | 109 | 110 | 111 | 112 | 113 | 114 | 115 | 116 | 117 | 118 | 119 | 120 | 121 | 122 | 123 | 124 | 125 | 126 | 127 | 128 | 129 | 130 | 131 | 132 | 133 | 134 | 135 | 136 | 137 | 138 | 139 | 140 | 141 | 142 | 143 |

Поиск по сайту:



Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав. Студалл.Орг (0.044 сек.)