Логические операторы
|| | Или | && | И |
! | Унарное отрицание |
К операторам относится также оператор определения принадлежности типу instanceof,оператор [ ]и тернарный оператор ?: (if-then-else).
Логические операции выполняются над значениями типа boolean (true или false).
// пример # 3 : битовые операторы : Operators.java
public class Operators {
public static void main(String[] args) {
System.out.println("5%1=" + 5%1 + " 5%2=" + 5%2);
int b1 = 0xe;//14 или 1110
int b2 = 0x9;//9 или 1001
int i = 0;
System.out.println(b1 + "|" + b2 + " = " + (b1|b2));
System.out.println(b1 + "&" + b2 + " = " + (b1&b2));
System.out.println(b1 + "^" + b2 + " = " + (b1^b2));
System.out.println( "~" + b2 + " = " + ~b2);
System.out.println(b1 + ">>" + ++i + " = " + (b1>>i));
System.out.println(b1 + "<<" + i + " = " + (b1<<i++));
System.out.println(b1 + ">>>" + i +" = " + (b1>>>i));
}
}
Результатом выполнения данного кода будет
5%1=0 5%2=1
14|9 = 15
14&9 = 8
14^9 = 7
~9 = -10
14>>1 = 7
14<<1 = 28
14>>>2 = 3
Тернарный оператор "?" используется в выражениях:
booleanexp? value0:value1
Если booleanexp=true, вычисляется значение value0и оно становится результатом выражения, иначе результатом является значение value1.
Оператор instanceof возвращает значение true, если объект является экземпляром данного класса, например:
Font obj = new Font("Courier", 1, 18);
if (obj instanceof java.awt.Font) {/*операторы*/}
Числовые параметры при объявлении объекта класса Font указывают на стиль и размер шрифта.
Результатом действия оператора instanceofбудет истина, если объект является объектом одного из подклассов класса, на принадлежность к которому проверяется данный объект, но не наоборот. Проверка на принадлежность объекта к классу Object всегда даст истину как результат. Результат применения этого оператора по отношению к null всегда ложь, потому что null нельзя причислить к какому-либо типу. В тоже время литерал null можно передавать в методы по ссылке на любой объектный тип и использовать в качестве возвращаемого значения.
Операторы управления
Оператор if позволяет условное выполнение оператора или условный выбор двух операторов, выполняя один или другой, но не оба сразу.
if (boolexp) { /*операторы*/}
else { /*операторы*/ }//может отсутствовать
Циклы:
1. while (boolexpr) { /*операторы*/ }
2. do { /*операторы*/ }
while(boolexp);
3. for(exp1; boolexp; exp3){ /*операторы*/ }
Циклы выполняются, пока булевское выражение boolexp равно true.
Оператор switch передает управление одному из нескольких операторов в зависимости от значения выражения.
switch(exp) {
case exp1:/*операторы, если exp==exp1*/
break;
case exp2:/*операторы, если exp==exp2*/
break;
default: /* операторы Java */
}
При совпадении условий вида exp==exp1 выполняются подряд все блоки операторов до тех пор, пока не встретится оператор break.
Расширение возможностей получили оператор прерывания цикла break и оператор прерывания итерации цикла continue, которые можно использовать с меткой, для обеспечения выхода из вложенных циклов, например:
// пример # 4 : выход за цикл, помеченный OUT : DemoLabel.java
public class DemoLabel {
public static void main(String[] a) {
int j = -3;
OUT: while (j < 10) {
if (j == 0)
break OUT;
else {
j++;
System.out.println(j);
}
}
System.out.println("end");
}
}
Здесь оператор break разрывает цикл, помеченный меткой OUT. При этом нет необходимости в использовании оператора goto для выхода из вложенных циклов.
UML как язык описания объектно-ориентированных программ
Язык UML представляет собой общецелевой язык визуального моделирования, который разработан для спецификации, визуализации, проектирования и документирования компонентов программного обеспечения, бизнес-процессов и других систем. В ООП традиционно используют рад его нотаций (различных видов схем и диаграмм). Рассмотрим обзорно наиболее часто используемую в описании программ - «Диаграмму классов».
Класс (class) в языке UML служит для обозначения множества объектов, которые обладают одинаковой структурой, поведением и отношениями с объектами из других классов. Графически класс изображается в виде прямоугольника, который дополнительно может быть разделен горизонтальными линиями на разделы или секции (рис. 5.1). В этих разделах могут указываться имя класса, атрибуты (переменные) и операции (методы).
Рис. 2. Графическое изображение класса на диаграмме классов
Обязательным элементов обозначения класса является его имя. На начальных этапах разработки диаграммы отдельные классы могут обозначаться простым прямоугольником с указанием только имени соответствующего класса (рис. 2, а). По мере проработки отдельных компонентов диаграммы описания классов дополняются атрибутами (рис. 2, б) и операциями (рис. 2, в).
Кроме внутреннего устройства или структуры классов на соответствующей диаграмме указываются различные отношения между классами. При этом совокупность типов таких отношений фиксирована в языке UML и предопределена семантикой этих типов отношений. Базовыми отношениями или связями в языке UML являются:
– Отношение зависимости (dependency relationship)
– Отношение ассоциации (association relationship)
– Отношение обобщения (generalization relationship)
– Отношение реализации (realization relationship)
Каждое из этих отношений имеет собственное графическое представление на диаграмме, которое отражает взаимосвязи между объектами соответствующих классов.
Отношение зависимости
Отношение зависимости в общем случае указывает некоторое семантическое отношение между двумя элементами модели или двумя множествами таких элементов, которое не является отношением ассоциации, обобщения или реализации. Оно касается только самих элементов модели и не требует множества отдельных примеров для пояснения своего смысла. Отношение зависимости используется в такой ситуации, когда некоторое изменение одного элемента модели может потребовать изменения другого зависимого от него элемента модели.
Отношение зависимости графически изображается пунктирной линией между соответствующими элементами со стрелкой на одном из ее концов ("—>" или "<—"). На диаграмме классов данное отношение связывает отдельные классы между собой, при этом стрелка направлена от класса-клиента зависимости к независимому классу или классу-источнику (рис. 5.3). На данном рисунке изображены два класса: Класс_А и Кяасс_Б, при этом Класс_Б является источником некоторой зависимости, а Класс_А — клиентом этой зависимости.
Рис. 5.3. Графическое изображение отношения зависимости на диаграмме классов
Для отношения зависимости предопределены ключевые слова, которые обозначают некоторые специальные виды зависимостей. Эти ключевые слова (стереотипы) записываются в кавычках рядом со стрелкой, которая соответствует данной зависимости. Примеры стереотипов для отношения зависимости представлены ниже:
– "access" — служит для обозначения доступности открытых атрибутов и операций класса-источника для классов-клиентов;
– "bind" — класс-клиент может использовать некоторый шаблон для своей последующей параметризации;
– "derive" — атрибуты класса-клиента могут быть вычислены по атрибутам класса-источника;
– "import" — открытые атрибуты и операции класса-источника становятся частью класса-клиента, как если бы они были объявлены непосредственно в нем;
– "refine" — указывает, что класс-клиент служит уточнением класса-источника в силу причин исторического характера, когда появляется дополнительная информация в ходе работы над проектом.
Отношение зависимости является наиболее общей формой отношения в языке UML. Все другие типы рассматриваемых отношений можно считать частным случаем данного отношения. Однако важность выделения специфических семантических свойств и дополнительных характеристик для других типов отношений обусловливают их самостоятельное рассмотрение при построении диаграмм.
Отношение ассоциации
Отношение ассоциации соответствует наличию некоторого отношения между классами. Данное отношение обозначается сплошной линией с дополнительными специальными символами, которые характеризуют отдельные свойства конкретной ассоциации. В качестве дополнительных специальных символов могут использоваться имя ассоциации, а также имена и кратность классов-ролей ассоциации. Имя ассоциации является необязательным элементом ее обозначения. Если оно задано, то записывается с заглавной (большой) буквы рядом с линией соответствующей ассоциации.
Ассоциация – это другая ипостась свойства класса. Значительная часть информации, которую можно указать в атрибуте, появляется в ассоциации. На рис. 3 показаны одни и те же свойства, представленные в различных обозначениях
Рис. 3. Представление ассоциаций и связь с имеющимися у класса атрибутами
Ассоциация - это непрерывная линия между двумя классами, направленная от исходного класса к целевому классу. Имя свойства (вместе с кратностью) располагается на целевом конце ассоциации. Целевой конец ассоциации указывает на класс, который является типом свойства. Большая часть информации в обоих представлениях одинакова, но некоторые элементы отличаются друг от друга. В частности, ассоциация может показывать кратность на обоих концах линии. Кратностьсвойства обозначает количество объектов, которые могут заполнять данное свойство. Чаще всего встречаются следующие кратности:
1 (на конкретный OrderLine может быть только один Order)
0..1 (Date можно указывать, а может и не указана для конкретного Order)
* (На конкретный экземпляр Date может быть несколько Order, также как и для конкретного Order может быть указано несколько экземпляров OrderLine)
Отношение агрегации
Отношение агрегации имеет место между несколькими классами в том случае, если один из классов представляет собой некоторую сущность, включающую в себя в качестве составных частей другие сущности. Данное отношение имеет фундаментальное значение для описания структуры сложных систем, поскольку применяется для представления системных взаимосвязей типа "часть-целое". Раскрывая внутреннюю структуру системы, отношение агрегации показывает, из каких компонентов состоит система и как они связаны между собой
Графически отношение агрегации изображается сплошной линией, один из концов которой представляет собой незакрашенный внутри ромб. Этот ромб указывает на тот из классов, который представляет собой "целое". Остальные классы являются его "частями" (рис. 4).
Рис. 4. Графическое изображение отношения агрегации в языке UML
Отношение композиции
Отношение композиции, как уже упоминалось ранее, является частным случаем отношения агрегации. Это отношение служит для выделения специальной формы отношения "часть-целое", при которой составляющие части в некотором смысле находятся внутри целого. Специфика взаимосвязи между ними заключается в том, что части не могут выступать в отрыве от целого, т. е. с уничтожением целого уничтожаются и все его составные части.
Графически отношение композиции изображается сплошной линией, один из концов которой представляет собой закрашенный внутри ромб. Этот ромб указывает на тот из классов, который представляет собой класс-композицию или "целое". Остальные классы являются его "частями" (рис. 5).
Рис. 5. Графическое изображение отношения композиции в языке UML
Отношение обобщения
Отношение обобщения является обычным таксономическим отношением между более общим элементом (родителем или предком) и более частным или специальным элементом (дочерним или потомком). Данное отношение может использоваться для представления взаимосвязей между пакетами, классами, вариантами использования и другими элементами языка UML.
Применительно к диаграмме классов данное отношение описывает иерархическое строение классов и наследование их свойств и поведения. При этом предполагается, что класс-потомок обладает всеми свойствами и поведением класса-предка, а также имеет свои собственные свойства и поведение, которые отсутствуют у класса-предка.
На диаграммах отношение обобщения обозначается сплошной линией с треугольной стрелкой на одном из концов (рис. 6). Стрелка указывает на более общий класс (класс-предок или суперкласс), а ее отсутствие — на более специальный класс (класс-потомок или подкласс).
Рис. 6. Графическое изображение отношения обобщения в языке UML
2. Библиотека стандарта JAVA_SE
Наследование
Один класс (подкласс) может наследовать переменные и методы другого класса (суперкласса), используя ключевое слово extends. Подкласс имеет доступ ко всем открытым переменным и методам родительского класса, как будто они находятся в подклассе. В то же время подкласс может иметь методы с тем же именем и сигнатурой, что и методы суперкласса. В этом случае подкласс переопределяет методы родительского класса. В следующем примере переопределяемый метод show() находится в двух классах Bird и Eagle. По принципу полиморфизма вызывается метод, наиболее близкий к текущему объекту.
/* пример # 1 : наследование класса и переопределение метода : BirdSample.java */
class Bird {
private float price;
private String name;
public Bird(float p, String str) { //конструктор
price = p;
name = str;
}
public float getPrice(){
return price;
}
public String getName(){
return name;
}
void show(){
System.out.println("название: " + name + ", цена: "+ price);
}
}
class Eagle extends Bird {
private boolean fly;
public Eagle(float p, String str, boolean f) {
super(p, str); //вызов конструктора суперкласса
fly = f;
}
void show(){
System.out.println("название:" + getName() + ", цена: " +
getPrice() + ", полет:" + fly);
}
}
public class BirdSample {
public static void main(String[] args) {
Bird b1 = new Bird(0.85F, "Гусь");
Bird b2 = new Eagle(10.55F, "Белый Орел", true);
b1.show(); // вызов show() класса Bird
b2.show(); // вызов show() класса Eagle
}
}
Объект b1 создается при помощи вызова конструктора класса Bird, и, соответственно, при вызове метода show(), вызывается версия метода из класса Bird. При создании объекта b2 ссылка типа Bird инициализируется объектом типа Eagle. При таком способе инициализации ссылка на суперкласс получает доступ к методам, переопределенным в подклассе.
При объявлении совпадающих по сигнатуре полей в суперклассе и подклассах их значения не переопределяются и никак не пересекаются, то есть существуют в одном объекте независимо друг от друга. В этом случае задача извлечения требуемого значения определенного поля, принадлежащего классу в цепочке наследования, ложится на программиста.
Дата добавления: 2015-04-05; просмотров: 1629;