Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Прога.doc
Скачиваний:
1
Добавлен:
01.07.2025
Размер:
345 Кб
Скачать
☆

Ссылочные типы данных

В ссылочные типы входят все классы, интерфейсы, массивы. Описанный выше тип Stringтакже относится к ссылочным типам. Этот класс из стандартной библиотеки Java.

Также существуют классы-оболочки:

  • Byte

  • Short

  • Integer

  • Long

  • Float

  • Double

  • Character

  • Boolean

В отличие от примитивных типов, они пишутся с заглавной буквы. Эти типы соответствуют примитивным типам, однако являются ссылочными. Их классы cодержат методы для преобразования типов, а также другие константы и методы полезные при работе с примитивными типами данных.

В качестве типа также выступает любой созданный нами класс при создании инстанции класса. Вспомним прошлый урок, где мы создали класс Cat, а потом создали переменнуюourcat типа Cat при создании экземпляра класса.

Cat ourcat = new Cat();

На этом закончим наше знакомство с переменными и типами в Java.

 

Итак, в этом уроке мы узнали какие бывают типы данных, научились объявлять переменные. В следующем уроке рассмотрим приведение типов.

№2

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

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

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

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

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

№3 Операторы в Java

В Java поддерживаются следующие арифметические операторы (табл. 2.4).

Таблица 2.4. Арифметические операторы

+ Сложение  - Вычитание  * Умножение / Деление % Вычисление остатка ++ Инкремент -- Декремент += Присваивание со сложением -= Присваивание с вычитанием *= Присваивание с умножением /= Присваивание с делением %= Присваивание с вычислением остатка

 

Первые пять операторов всем знакомы по школьному курсу математики, причем два так называемых унарных оператора, и можно использовать для указания знака данною числа. Далее следуют операторы под названием инкремент (++) и декремент (- -).  Один из них (инкремент) прибавляет к значению переменной единицу, другой (декремент), наоборот, убавляет единицу.

Данные операторы указываются без пробела рядом со значением переменной. Если они стоят слева от переменной, то это называется префиксной формой инкремента или декремента, и это означает, что вначале к переменной прибавляется (или от нее отнимается) единица, а потом она используется в выражении. Если же инкремент (или декремент) ставится после имени переменной, то это называется постфиксной формой, и это означает, что переменная вначале используется в выражении, а затем к ней прибавляется (или от нее отнимается) единица.

Остальные пять операторов используются следующим образом:  а += b аналогично записи: а = а + b

 

Пример использования всех этих операторов приведен в листинге 2.9.

Листинг 2.9.  Пример использования арифметических операторов

class Example { public static void main (String args[])  { int a,b,c,d,e; a=10 b= 11;  c= 12;  a+ = b; // a=21 a *= c; // a = 252 a = a - c; // a = 240 a -= c; // a = 228 d = 5; e = 10; System.out.println (++d); Выведется 6 System.out.println (d++); Выведется 6 System.out.println (e--) ; Выведется 10 System.out.println (--e) ; Выведется 8 } }

 

Теперь рассмотрим битовые (поразрядные) операторы (табл. 2.5).

Таблица 2.5. Битовые (поразрядные) операторы

Оператор Описание - Унарное отрицание & Поразрядное И | Поразрядное ИЛИ ^ Поразрядное исключающее ИЛИ << Сдвиг битов влево >> Сдвиг битов вправо >>> Сдвиг битов вправо с заполнением старшего бита нулем &=, | =, ^=, <<=, >>=, >>>= Присвоение с аналогичной операцией

 

С помощью данных операторов мы работаем над числами в их двоичном представлении. Рассмотрим, например, запись числа 15 в двоичной форме. 00001111

Первый оператор, называемый унарным отрицанием, превращает 0 в 1, а 1 в 0. Оператор поразрядного "и" создает в итоге единицу, если у обоих аналогичных битов сравниваемых чисел тоже 1. Если у них другое сочетание чисел, то итог будет 0. Например: С = А & В

Предположим, А = 15 (00001111), а В равно 10 (00001010). Число С в таком случае будет равно 10 (00001010). Поразрядное "ИЛИ" означает следующее: если хотя бы один из битов равен 1, то итог тоже 1. Поразрядное исключающее "ИЛИ" возвращает 1, если только один из битов сравниваемых чисел равно 1. Следующие три оператора сдвигают биты влево на указанное число разрядов, причем сдвиг битов влево заполняет пустые позиции нулями. Пример использования этих операторов приведен в табл. 2.6 и листинге 2.10.

Таблица 2.6. Операторы сдвигов битов

 

А

В

А/В

А&В

А^В

~A

 

0

 

0

 

0

 

0

 

0

 

1

 

1

 

0

 

1

 

0

 

1

 

0

0

1

1

0

1

1

1

1

1

1

0

0

 

 

Листинг 2.10.  Пример использования операторов сдвигов битов

class Example  { public static void main (String args[])  { int a=3, b=4, c=5;  int d = a * b;  System.out.println (d);  d = a | c; System.out.println (d);  d &= a; System.out.println (d);  } }

 

В Java также поддерживаются и логические операторы, представленные в табл. 2.7.

 

Таблица 2.7. Логические операторы

Оператор Описание = = Равно != Не равно < Меньше < = Меньше или равно > Больше > = Больше или равно & Логическое и | Логическое или ^ Логическое исключающее или ! Отрицание && Условное и | | Условное или &=, |=, ^= Присваивание с аналогичным оператором

 

Первые шесть операторов называются операторами сравнения. Они позволяют сравнивать числа и возвращают либо значение true, либо — false. Последующие четыре оператора работают с данным типа boolean, но по работе схожи с аналогичными битовыми операторами (только надо заменить бит 0 на false, а бит 1 — на true).

Следующие два оператора используются для двух условий сразу, т.е. указаны два условия и между ними ставится оператор "условное И". Если они оба будут равны true, то выводится значение true; если хотя бы одно из них будет false, то итог будет false.

Оператор "условное или" будет возвращать значение true, если хотя бы одно из условий будет true. Они обычно используются в конструкции if (об этом мы будем говорить в следующей главе). Пример использования всех этих операторов представлен в листинге 2.11.

Листинг 2.11.  Пример использования логических операторов

class Example  { public static void main (String args[])  { int a = 10, b=15, c=20;  boolean b1 = a != b;  boolean b2 = с > a;  boolean b3 = b1 & b2;  boolean b4 = bЗ ^ b1; if (b1 && b4 = = false) // Если b1 != b4, то:  bЗ = true; else // Если это не так, то: b2 = false;  } }

 

Приведем схему использования логических операторов (табл. 2.8).

Таблица 2.8. Значения логических операторов для двух переменных

 

 

A

 

 

B

 

 

A|B

 

 

A&B

 

 

A^B

 

 

~A

false

false

false

false

false

true

true

false

true

false

true

false

false

true

true

false

true

true

true

true

true

true

false

false

№4 If

class IfElse {

public static void main(String args[]) {

int month = 4;

String season;

if (month == 12 || month == 1 || month == 2) {

season = "Winter";

}

else if (month ==3 || month == 4 || month == 5) {

season = "Spring";

}

else if (month == 6 || month == 7 || month == 8) {

season = "Summer";

}

else if (month == 9 || month == 10 || month == 11) {

season = "Autumn";

}

else {season = "Bogus Month";}

System.out.println( "April is in the " + season + ".");

}

}

№5 Инициализация и итерация необязательны. Ниже приведен пример цикла while для печати десяти строк .

class WhileDemo {

public static void main(String args[]) {

int n = 10;

while (n > 0) {

System.out.println("tick " + n);

n--;

}

} }

do-while

Иногда возникает потребность выполнить тело цикла по крайней мере один раз - даже в том случае, когда логическое выражение с самого начала принимает значение false. Для таких случаев в Java используется циклическая конструкция do-while. Ее общая форма записи такова:

[ инициализация; ] do { тело; [итерация;] } while ( завершение );

В следующем примере тело цикла выполняется до первой проверки условия завершения. Это позволяет совместить код итерации с условием завершения:

class DoWhile {

public static void main(String args[]) {

int n = 10;

do {

System.out.println("tick " + n);

} while (--n > 0);

} }

№ 6 for

class Months {

static String months[] = {

"January", "February", "March", "April",

"May", "June", "July", "August", "September",

"October", "November", "December" };

static int monthdays[] = { 31, 28, 31, 30, 31,

30, 31, 31, 30, 31, 30, 31 };

static String spring = "spring";

static String summer = "summer";

static String autumn = "autumn";

static String winter = "winter";

static String seasons[] = { winter, winter, spring,

spring, spring, summer, summer,

summer, autumn, autumn, autumn,

winter };

public static void main(String args[]) {

for (int month = 0; month < 12; month++) {

System.out.println(months[month] + " is a " +

seasons[month] + " month with " + monthdays[month] + " days.");

} } }

№7 Оператор передачи управления switch-case

class SwitchSeason { public static void main(String args[]) {

int month = 4;

String season;

switch (month) {

case 12: // FALLSTHROUGH

case 1: // FALLSTHROUGH

case 2:

season = "Winter";

break;

case 3: // FALLSTHROUGH

case 4: // FALLSTHROUGH

case 5:

season = "Spring";

break;

case 6: // FALLSTHROUGH

case 7: // FALLSTHROUGH

case 8:

season = "Summer";

break;

case 9: // FALLSTHROUGH

case 10: // FALLSTHROUGH

case 11:

season = "Autumn";

break;

default:

season = "Bogus Month";

}

System.out.println("April is in the " + season + ".");

}

}

№8 Массивы элементов базовых типов

Файл DoubleArrayInit.java

class DoubleArrayInit

{

 public static void main (String args [])

 {

  double[] db = {1.25d, 2.2d, 3.2d};

  for (int i=0; i<db.length; i++) System.out.println(db[i]);

 }

}

 

Файл FloatArrayInit.java

class FloatArrayInit

{

 public static void main (String args [])

 {

  float[] ft = {1.25f, 2.2f, 3.2f};

  for (int i=0; i<ft.length; i++) System.out.println(ft[i]);

 }

}

 

class SBLength

{

 public static void main (String args [])

 {

  StringBuffer sb[] = {new StringBuffer("First"),

                       new StringBuffer("Second"),

                       new StringBuffer("Third")};

  for(int i=0; i<sb.length; i++)

  {

   System.out.println("sb["+i+"]="+sb[i]);

  }

  System.out.println("Elements quantity of array=" + sb.length);

  System.out.println("Second element=" + sb[1]);

  System.out.println("Symbols quantity in second element=" + sb[1].length());

 }

}

№9 Массивы массивов

Есть такое понятие, как многомерные массивы. В этом случае элементом одного массива является другой массив. Рассмотрим многомерные массивы на примере двумерных

№10 Класс Math

Класс Math содержит набор математических функций, часто оказывающихся не­обходимыми при решении разных задач. Чтобы извлечь квадратный корень из числа, применяют метод sqrt. double х = 4; double у = Math.sqrt(х);  System.out.println(у); // Печатает число 2.0.

 

Между методами println и sqrt есть небольшая разница. Метод println дей­ствует на объект System, out, имея второй параметр у — число, подлежащее вы­воду. (Напомним, что out — это объект, определенный в классе System и пред­ставляющий собой стандартное устройство вывода.)

В то же время метод sqrt в классе Math не работает ни с одним объектом. Он имеет единственный параметр х — число, из которого нужно извлечь корень. Такие методы называются статиче­скими.

 

В языке Java нет оператора возведения в степень: для этого нужно использовать метод pow из класса Math.

Оператор  double у = Math.pow(x,a) ; присваивает переменной у значение переменной х, возведенное в степень а.

Оба параметра метода pow, а также возвращаемое им значение имеют тип double.

Класс Math содержит обычные тригонометрические функции: Math.sin  Math.cos  Math.tan Math.atan  Math.atan2

 

Кроме этого, в него включены экспоненциальная и обратная к ней логарифмиче­ская функции (натуральный логарифм): Math.exp  Math.log

 

В классе определены также две константы Math.PI Math.E, обозначающие аппроксимации чисел Пи и е.

Для повышения своей производительности функции в классе Math используют про­граммы из встроенного модуля для вычислений с плавающей точкой.  Если точность вычислений важнее скорости их выполнения, используйте класс strictMath.  Он реализует алгоритмы из библиотеки "Freely Distributable Math Library" ("Свободно распространяемая библиотека математических функций") fdlibm, гарантирующей идентичность результатов на всех платформах.

Исходные тексты программ, реали­зующих эти алгоритмы, можно найти на web-странице http://www.netlib.org/fdlibm/index.html. (В библиотеке fdlibm дается несколько определений каждой функции, класс StrictMath следует версии IEEE754, имена функций в которой на­чинаются с буквы "е".)