Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Тернарный оператор if-then-else



Общая форма оператора if-then-use такова:

выражение1? выражение2: выражениеЗ

 

В качестве первого операнда - - может быть исполь-зовано любое выражение, результатом которого является значение типа boolean. Если результат равен true, то выполняется оператор, заданный вторым операндом, то есть, . Если же первый операнд paвен false, то выполняется третий операнд -. Второй и третий операнды, то есть и, должны воз-вращать значения одного типа и не должны иметь тип void.

В приведенной ниже программе этот оператор используется для про-верки делителя перед выполнением операции деления. В случае нулевого делителя возвращается значение 0.

class Ternary {

public static void main(String args[]) {

int a = 42;

int b = 2;

int c = 99;

int d = 0;

int e = (b == 0)? 0: (a / b);

int f = (d == 0)? 0: (c / d);

System.out.println(" a = " + a);

System.out.println(" b = " + b);

System.out.println(" c = " + c);

System.out.println(" d = " + d);

System.out.println(" a / b = " + e);

System.out.println(" c / d = " + f);

}

}

 

При выполнении этой программы исключительной ситуации деления на нуль не возникает и выводятся следующие результаты:

С: \> java Ternary

 

а = 42

b = 2

с = 99

d = 0

a / b = 21

с / d = 0

 

Приоритеты операторов

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

БИЛЕТ №3

Классы

 

Введение в объектно-ориентированные понятия в уроке названные Понятия Объектно-ориентированного программирования, используемые велосипед class в качестве примера, с мчащимися велосипедами, горными велосипедами, и тандемными велосипедами как подклассы. Вот пример кода для возможной реализации a Bicycle class, чтобы дать Вам краткий обзор объявления class. Последующие разделы этого урока поддержат и объяснят объявления class шаг за шагом.

 

В настоящий момент не интересуйтесь деталями.

 

public class Bicycle {

 

// the Bicycle class has

// three fields

public int cadence;

public int gear;

public int speed;

 

// the Bicycle class has

// one constructor

public Bicycle(int startCadence, int startSpeed, int startGear) {

gear = startGear;

cadence = startCadence;

speed = startSpeed;

}

 

// the Bicycle class has

// four methods

public void setCadence(int newValue) {

cadence = newValue;

}

 

public void setGear(int newValue) {

gear = newValue;

}

 

public void applyBrake(int decrement) {

speed -= decrement;

}

 

public void speedUp(int increment) {

speed += increment;

}

 

}

 

Объявление Классов

 

Вы видели классы, определенные следующим образом:

 

class MyClass {

// field, constructor, and

// method declarations

}

Это - объявление class. Тело class (область между фигурными скобками) содержит весь код, который предусматривает жизненный цикл объектов, создаваемых из class: конструкторы для того, чтобы инициализировать новые объекты, объявления для полей, которые обеспечивают состояние class и его объектов, и методов, чтобы реализовать поведение class и его объектов.

 

Предыдущее объявление class является минимальным. Только те компоненты объявления class требуются. Можно предоставить больше информации о class, таком как имя его суперкласса, реализует ли это какие-либо интерфейсы, и так далее, в начале объявления class. Например,

 

class MyClass extends MySuperClass implements YourInterface {

// field, constructor, and

// method declarations

}

средства это MyClass подкласс MySuperClass и это это реализует YourInterface интерфейс.

 

Можно также добавить модификаторы как общедоступный или частное в самом начале — таким образом, можно видеть, что вводная строка объявления class может стать довольно сложной. Модификаторы, общедоступные и частные, которые определяют то, к чему могут получить доступ другие классы MyClass, обсуждаются позже в этом уроке. Урок в интерфейсах и наследовании объяснит, как и почему Вы использовали бы расширение и реализуете ключевые слова в объявлении class. В настоящий момент Вы не должны волноваться об этих дополнительных сложностях.

 

Вообще, объявления class могут включать эти компоненты в порядке:

 

Модификаторы такой как общедоступный, частный, и много других, с которыми Вы встретитесь позже.

Имя class, с первой буквой, использованной для своей выгоды условно.

Имя родителя class (суперкласс), если таковые вообще имеются, предшествовавший ключевым словом расширяется. class может только расшириться (разделяют одного родителя на подклассы.

Список разделенных запятой значений интерфейсов, реализованных class, если таковые вообще имеются, предшествовал реализациями ключевого слова. class может реализовать больше чем один интерфейс.

Тело class, окруженное фигурными скобками, {}.

 

Объекты

 

Типичная программа Java создает много объектов, которые, как Вы знаете, взаимодействуйте, вызывая методы. Через эти объектные взаимодействия программа может выполнить различные задачи, такие как реализация GUI, выполнение анимации, или отправка и получение информации по сети. Как только объект завершил работу, для которой он создавался, ее ресурсы перерабатываются для использования другими объектами.

Следующие три раздела используют вышеупомянутый пример, чтобы описать жизненный цикл объекта в пределах программы. От них Вы изучите, как записать код, который создает и использует объекты в Ваших собственных программах. Вы также изучите, как система очищает после объекта, когда его жизнь закончилась.

Создание Объектов

 

Как Вы знаете, class обеспечивает проект объектов; Вы создаете объект из class. Каждый из следующих операторов, взятых от CreateObjectDemo программа создает объект и присваивает его переменной:

 

Point originOne = new Point(23, 94);

Rectangle rectOne = new Rectangle(originOne, 100, 200);

Rectangle rectTwo = new Rectangle(50, 100);

Первая строка создает объект Point class, и вторые и третьи строки каждый создает объект Rectangle class.

 

У каждого из этих операторов есть три части (обсужденный подробно ниже):

 

Объявление: кодовый набор полужирным является всеми объявлениями переменной, которые связывают имя переменной с объектным типом.

Инстанцирование: ключевое слово new является оператором Java, который создает объект.

Инициализация: оператор new сопровождается звонком в конструктора, который инициализирует новый объект.

 

Объявление, что Переменная Обращается к Объекту

 

Ранее, Вы узнали, что, чтобы объявить переменную, Вы пишете:

 

type name;

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

 

Можно также объявить ссылочную переменную на ее собственной строке. Например:

 

Point originOne;

Если Вы объявляете originOne как это, его значение будет неопределенным, пока объект не будет фактически создан и присваивается этому. Просто объявление ссылочной переменной не создает объект. Для этого Вы должны использовать new оператор, как описано в следующем разделе. Следует присвоить объект originOne прежде, чем Вы будете использовать это в своем коде. Иначе, Вы получите ошибку компилятора.

 

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

 

Инстанцирование Класса

 

Оператор new инстанцирует class, выделяя память для нового объекта и возвращая ссылку на ту память. Оператор new также вызывает объектного конструктора.

 

Отметьте: фраза " инстанцирование class" означает ту же самую вещь как " создание объекта." Когда Вы создаете объект, Вы создаете " экземпляр" class, поэтому " инстанцируя" class.

Оператор new требует единственного, постфиксного параметра: звонок в конструктора. Имя конструктора обеспечивает имя class, чтобы инстанцировать.

 

Оператор new возвращает ссылку на объект, который она создала. Эта ссылка обычно присваивается переменной соответствующего типа, как:

 

Point originOne = new Point(23, 94);

Ссылка, возвращенная оператором new, не должна быть присвоена переменной. Это может также использоваться непосредственно в выражении. Например:

 

int height = new Rectangle().height;

Этот оператор будет обсужден в следующем разделе.

 

Инициализация Объекта

 

Вот является код для Point class:

 

public class Point {

public int x = 0;

public int y = 0;

//constructor

public Point(int a, int b) {

x = a;

y = b;

}

}

Этот class содержит единственного конструктора. Можно распознать конструктора, потому что его объявление использует то же самое имя в качестве class, и у этого нет никакого типа возврата. Конструктор в Point class берет два целочисленных параметра, как объявлено кодом (int a, int b). Следующий оператор обеспечивает 23 и 94 как значения для тех параметров:

 

Point originOne = new Point(23, 94);

Результат выполнения этого оператора может быть иллюстрирован в следующем числе:

 

 

Вот является код для Rectangle class, который содержит четырех конструкторов:

 

public class Rectangle {

public int width = 0;

public int height = 0;

public Point origin;

 

// four constructors

public Rectangle() {

origin = new Point(0, 0);

}

public Rectangle(Point p) {

origin = p;

}

public Rectangle(int w, int h) {

origin = new Point(0, 0);

width = w;

height = h;

}

public Rectangle(Point p, int w, int h) {

origin = p;

width = w;

height = h;

}

 

// a method for moving the rectangle

public void move(int x, int y) {

origin.x = x;

origin.y = y;

}

 

// a method for computing the area

// of the rectangle

public int getArea() {

return width * height;

}

}

 

Каждый конструктор позволяет Вам обеспечивать начальные значения для размера прямоугольника и width, используя и типы примитивов и ссылочные типы. Если у class есть многократные конструкторы, у них должны быть различные подписи. Компилятор Java дифференцирует конструкторов, основанных на числе и типе параметров. Когда компилятор Java встречается со следующим кодом, он знает, чтобы вызвать конструктора в Rectangle class, который требует параметра Point, сопровождаемого двумя целочисленными параметрами:

 

 

Rectangle rectOne = new Rectangle(originOne, 100, 200);

Это вызывает один из Rectangle's конструкторы, который инициализирует origin к originOne. Кроме того, наборы конструктора width к 100 и height к 200. Теперь есть две ссылки на тот же самый Point object — у объекта могут быть многократные ссылки на него, как показано в следующем числе:

 

 

Следующая строка кода вызывает Rectangle конструктор, который требует двух целочисленных параметров, которые обеспечивают начальные значения для width и height. Если Вы осмотрите код в пределах конструктора, то Вы будете видеть, что он создает новый объект Point, x которого и значения y инициализируются к 0:

 

Rectangle rectTwo = new Rectangle(50, 100);

Конструктор Rectangle, используемый в следующем операторе, не берет параметров, таким образом, он вызвал конструктора без параметров:

 

Rectangle rect = new Rectangle();

У всех классов есть по крайней мере один конструктор. Если class явно не объявляет никого, компилятор Java автоматически предоставляет конструктору без параметров, названному конструктором по умолчанию. Этот конструктор по умолчанию вызывает конструктора родителя class без параметров, или Object конструктор, если у class нет никакого другого родителя. Если у родителя нет никакого конструктора (Object действительно имеет один), компилятор отклонит программу.

 

Удаление объекта

В языке Java операторы delete нет, а " сборку мусора" обеспечивает виртуальная машина Java (JVM). Если перестать использовать объект в программе, то автоматически удаляется ссылка на него.

 

 

Билет №4

Вопросы: 1) Элементы класса. 2)Поля, методы. 3)Модификаторы полей и методов. 4)Вызов методов в Java.

Ответы:

1) Элементы класса: поля, методы конструктор, деструктор, указатель на самого себя: this.

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

Деструкторы
Деструкторы выполняют работу, обратную той, что проделывают конструкторы. Хотя класс может иметь несколько конструкторов, но деструктор может быть только один (в языке Java отсутствует). Синтаксис деструктора очень похож на синтаксис конструктора по умолчанию. Точно также деструктор не имеет аргументов, все различие заключается в том, что деструктор, будучи по своей сути функцией, парной конструктору, имеет то же имя, что и класс, но с приставкой в виде операции дополнения (~).

Указатель на самого себя: this.
Каждый объект класса имеет свой физический адрес и его можно извлечь из указателя this. Это внутренний (как бы скрытый от " прямого взгляда" ) указатель, который есть у каждого класса. На самом деле мы всегда неявно используем указатель this, когда обращаемся к членам внутри области видимости функции-члена класса.

 

Поле класса

Поле класса или атрибут в объектно-ориентированном программировании — переменная, связанная с классом или объектом. Все данные объекта хранятся в его полях. Доступ к полям осуществляется по их имени. Обычно тип данных каждого поля задаётся в описании класса, членом которого является поле.

Метод класса

Метод в объектно-ориентированном программировании — это функция или процедура, принадлежащая какому-то классу или объекту.

Как и процедура в процедурном программировании, метод состоит из некоторого количества операторов для выполнения какого-то действия, имеет набор входных аргументов и возвращаемое значение.

3) Модификаторы – это служебные слова, которые придают классу, полю класса или методу определенные свойства.

private – метод или поле класса, помеченные этим модификатором, доступны только в пределах данного класса;

package – поле/метод доступно в пределах всего пакета; это значение по умолчанию для всех полей или методов объявленных без модификаторов доступа;

protected – здесь доступ разграничивается для всех “родных” (т.е. производных или родительских) классов данного класса;

public – доступ открыт отовсюду и для всех;

static - это поля/методы, которые едины для всех объектов данного класса(т.е. ссылка этого поля у любого экземпляра класса будет ссылаться на одно и то же значение);

final - позволяющий объявлять константные поля в классе;

transient – решает проблему сериализации (представления объекта в виде последовательности байтов данных)

volatile – необходим в процессе синхронизации потоков вычислений и управления памятью;

abstract - позволяет объявить класс/метод неполноценным и не предназначенным для создания его экземпляров. Классы с таким модификатором можно только наследовать.

4) Для того чтобы вызвать метод необходимо записать полное название метода, включая круглые скобки, в том месте программы, откуда требуется запустить метод на выполнение. Полное название метода должно включать имя класса, к которому принадлежит метод, затем следует точка и имя метода.


БИЛЕТ №5

5.Массив — это группа однотипных переменных, для обращения к которым ис­пользуется общее имя. Java допускает создание массивов любого типа, которые мо­гут иметь одно или несколько измерений. Доступ к конкретному элементу массива осуществляется по его индексу. Массивы предлагают удобный способ группирова­ния связанной информации.

Одномерные массивы

По сути, одномерные массивы представляют собой список однотипных перемен­ных. Чтобы создать массив, вначале необходимо создать переменную массива требуемого типа. Общая форма объявления одномерного массива.

тип имя_переменной [];

Здесь тип задает тип элемента (называемый также базовым типом) массива. Тип элемента массива определяет тип данных, которые бу­дет содержать массив. Например, следующий оператор объявляет массив month_ days, имеющий тип “массив элементов типа int”.

int month_days[];

Хотя это объявление утверждает, что month_days — массив переменных, в дейст­вительности никакого массива еще не существует. Фактически значение массива month_days установлено равным null, которое представляет массив без значений. Чтобы связать имя month_days с реальным физическим массивом целочисленных значений, необходимо с помощью оператора new зарезервировать память и присво­ить ее массиву month_days. Общая форма оператора new примени­тельно к одномерным массивам выглядит следующим образом.

переменная_массива = new тип [размер];

Здесь тип определяет тип данных, для которых резервируется память, размер указывает количество элементов в массиве, а переменная_массива — перемен­ная массива, связанная с массивом. Другими словами, чтобы использовать опе­ратор new для резервирования памяти, потребуется указать тип и количество элементов, для которых нужно зарезервировать память. Элементы массива, для которых память была выделена оператором new, будут автоматически инициали­зированы нулевыми значениями (для числовых типов), значениями false (для логического типа) или значениями null (для ссылочных типов). Приведенный ниже оператор резервирует память для 12-элементного массива целых значений и связывает их с массивом month_days.

month_days = new int[12];

После выполнения этого оператора month_days будет ссылаться на массив, состоящий из 12 целочисленных значений. При этом все элементы массива будут инициализированы нулевыми значениями.

Подведем итоги: создание массива — двухэтапный процесс. Во-первых, необхо­димо объявить переменную нужного типа массива. Во-вторых, с помощью опера­тора new необходимо зарезервировать память для хранения массива и присвоить ее переменной массива. Таким образом, в Java все массивы являются динамически распределяемыми.

Как только массив создан и память для него зарезервирована, к конкретному элементу массива можно обращаться, указывая его индекс в квадратных скобках. Индексы массива начинаются с нуля. Например, следующий оператор присваива­ет значение 28 второму элементу массива month_days.

month_days[1] = 28;

Следующая строка кода отображает значение, хранящееся в элементе с индек­сом, равным 3.

System.out.printIn(month_days[3]);

 

Как уже было сказано, в Java индексация элементов массивов начинается с нуля, поэтому количество дней в апреле — month_days [ 3 ], или 30.

Объявление переменной массива можно объединять с распределением самого массива.

int month_days[] = new int[12];

Именно так обычно и поступают в профессионально написанных программах Java. Массивы можно инициализировать при их объявлении. Этот процесс во мно­гом аналогичен инициализации простых типов. Инициализатор массива — это раз­деляемый запятыми список выражений, заключенный в фигурные скобки. Запятые разделяют значения элементов массива. Массив будет автоматически создан до­статочно большим, чтобы в нем могли уместиться все элементы, указанные в ини­циализаторе массива. В этом случае использование оператора new не требуется. Например, чтобы сохранить количество дней каждого месяца, можно использовать следующий код, который создает и инициализирует массив целых значений.

// Усовершенствованная версия предыдущей программы, class AutoArray {

public static void main(String args[]) {

int month_days[] = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 };

System.out.println(" В апреле " + month_days[3] + " дней." );

}

}

При выполнении эта программа выдает такой же результат, как и предыдущая версия.

Система времени выполнения будет проверять соответ­ствие значения каждого индекса допустимому диапазону от 0 до 11 включительно. Попытка обращения к элементам за пределами диапазона массива (указание отрицательных индексов или индексов, которые превышают длину массива) приведет к ошибке времени выполнения.

Приведем еще один пример программы, в которой используется одномерный массив. Эта программа вычисляет среднее значение набора чисел.

// Вычисление среднего значения массива значений, class Average {

public static void main(String args[]) {

double nums[] = {10.1, 11.2, 12.3, 13.4, 14.5}; double result = 0; int i;

for(i=0; i< 5; i++)

result = result + nums[i];

System.out.printIn(" Среднее значение равно " + result / 5);

}

Многомерные массивы

В Java многомерные массивы представляют собой массивы массивов. Они, как можно догадаться, выглядят и действуют подобно обычным многомерным мас­сивам. Однако, как вы увидите, они имеют несколько незначительных отличий. При объявлении переменной многомерного массива для указания каждого допол­нительного индекса используют отдельный набор квадратных скобок. Например, следующий код объявляет переменную двухмерного массива twoD.

int twoD[][] = new int[4][5];

Этот оператор резервирует память для массива размерностью 4x5 и присваива­ет его переменной twoD. Внутренне эта матрица реализована как массив массивов значений типа int.

Следующая программа нумерует элементы в массиве слева направо, сверху вниз, а затем отображает эти значения.

// Демонстрация двухмерного массива, class TwoDArray {

public static void main(String args[]){

int twoD[][]= new int[4] [5]; int i, j, k = 0;

for(i=0; i< 4; i++)


for(j = 0; j < 5; j++) {

twoD[i][j] = k;

k+ +;


}

for(i=0; i< 4; i++) {

for(j = 0; j < 5; j++)

System.out.print(twoD[i][j] + " " );

System.out.printIn();

}

}

}

Эта программа создает следующий вывод.

0 1 2 3 4

5 6 7 8 9

10 11 12 13 14

15 16 17 18 19

При резервировании памяти под многомерный массив необходимо указать па­мять только для первого (левого) измерения. Для каждого из остальных измерений память можно резервировать отдельно. Например, следующий код резервирует память для первого измерения массива twoD при его объявлении. Резервирование памяти для второго измерения массива осуществляется вручную.

int twoD [ ] [ ] = new mt[4] [ ];

twoD[0] = new int[5];

twoD[1] = new int[5];

twoD[2] = new int[5];

twoD[3]= new int[5];

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

// Резервирование памяти вручную для массива с различными // размерами второго измерения,

class TwoDAgam {

public static void main(String args[]) {


int twoD[][] = new int[4][];

twoD[0] = new mt[l];


twoD[l] = new int[2];

twoD[2] = new int[3];

twoD[3] = new int[4];

int i, j, к = 0;

for(i=0; i< 4; i + +)


for(j = 0; j < i +1; j++) {

twoD[i][j] = k;

k++;


}

for(i=0; i< 4; i++) {

for(j = 0; j < i +1; j++)

System.out.print(twoD[i][j] + " " );

System.out.println();

Эта программа создает следующий вывод.

1 2

3 4 5

6 7 8 9

Использование неоднородных (или нерегулярных) массивов может быть не при­менимо во многих приложениях, поскольку их поведение отличается от обычного поведения многомерных массивов. Однако в некоторых ситуациях нерегулярные массивы могут оказаться весьма эффективными. Например, нерегулярный массив может быть идеальным решением, если требуется очень большой двухмерный раз­реженный массив (т.е. массив, в котором будут использоваться не все элементы).

Многомерные массивы можно инициализировать. Для этого достаточно за­ключить инициализатор каждого измерения в отдельный набор фигурных скобок. Следующая программа создает матрицу, в которой каждый элемент содержит про­изведение индексов строки и столбца. Обратите также внимание на то, что внутри инициализаторов массивов можно применять как литеральное значение, так и вы­ражения.

// Инициализация двухмерного массива, class Matrix {

public static void main(String args[]) {

double m[][] = {

{ 0*0, 1*0, 2*0, 3*0 },

{ 0*1, 1*1, 2*1, 3*1 },

{ 0*2, 1*2, 2*2, 3*2 },

{ 0*3, 1*3, 2*3, 3*3}

};

int i, j;


for(i=0; i<



4; i + +) { for(j=0; j < 4; j++)


 

System.out.print(m[i][j ] + " " );

System.out.println();

}

}

}

При выполнении эта программа создает следующий вывод.

0.0 0.0 0.0 0.0
0.0 1.0 2.0 3.0
0.0 2.0 4.0 6.0
0.0 3.0 6.0 9.0

Как видите, каждая строка массива инициализируется в соответствии со значе­ниями, указанными в списках инициализации.

Альтернативный синтаксис объявления массивов

Для объявления массивов можно использовать и вторую форму.

тип[] имя_переменной;

В этой форме квадратные скобки следуют за указателем типа, а не за именем переменной массива. Например, следующие два объявления эквивалентны.

int al[] = new int[3]; int[] a2 = new int[3];

Приведенные ниже два объявления также эквивалентны.

char twodl[][] = new char[3][4]; char[][] twod2 = new char[3][4];

Вторая форма объявления удобна для одновременного объявления нескольких массивов. Например, объявление

int[] nums, nums2, nums3; // создание трех массивов

создает три переменные массивов типа int. Оно эквивалентно следующему объявлению.

int nums[], nums2[], nums3[]; // создание трех массивов

Альтернативная форма объявления удобна также при указании массива в качестве возвращаемого типа метода. В этой книге используются обе формы объявлений.


Поделиться:



Популярное:

Последнее изменение этой страницы: 2016-07-14; Просмотров: 588; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.145 с.)
Главная | Случайная страница | Обратная связь