- •1. Условный оператор if
- •If (условие)
- •2. Составной оператор
- •4. Оператор цикла for
- •5. Оператор цикла while (цикл с предусловием)
- •6. Операторы цикла do … while (цикл с постусловием)
- •7. Операторы прерывания continue, break, return, System.Exit
- •8. Оператор выбора switch
- •9. Условное выражение … ? … : …
- •If (условие) {
- •10. Ошибки при использовании вещественного счетчика цикла
- •11. Эффективная организация циклов
- •Void getFood(int food, int drink); // Кормление
- •Сборка мусора
- •Import org.Eclipse.Swt.*;
- •Import org.Eclipse.Swt.Widgets.*;
- •If (!display.ReadAndDispatch ()) display.Sleep ();
- •Import org.Eclipse.Jface.Window.ApplicationWindow;
- •Import org.Eclipse.Swt.Swt;
- •Import org.Eclipse.Swt.Widgets.*;
- •Основные элементы («теги»)
- •Гиперссылки
- •Текстовые блоки
- •Форматирование текста
- •Options
- •Клиенты
- •2.2.Простой Web проект
- •Компоненты j2ee
- •Комментарии
- •Скриптовые элементы
- •Объявления jsp
- •Выражения jsp
- •Скриплеты jsp
- •Директивы jsp
8. Оператор выбора switch
В общем случае оператор switch записывается следующим образом:
switch (выражение) {
case значение1:
операторы1;
case значение2:
операторы2;
…
…
default:
операторы;
}
Оператор выбора switch позволяет в некоторых случаях заменить ряд идущих подряд опера-
торов if на один оператор.
9. Условное выражение … ? … : …
Условное выражение представляет из себя следующую конструкцию:
условие?значение1:значение2
она унаследована Java из C. Значение условного выражения оказывается равным значени-
ю1, если условие истинно и значению2 в противном случае. В выражениях для условий и
значений можно использовать пробелы, в том числе отделять ими символы ? и : - на результат
это не влияет.
Приоритет разделителей ? и : очень низкий (ниже только приоритет операторов при-
сваивания). Так что при записи условных выражений можно обойтись без скобок. Однако
расстановка скобок часто делает условное выражение более очевидным и понятным.
Один из частных случаев использования условного выражения в виде:
переменная = условие ? значение1 : значение2;
можно представить в виде условного оператора:
If (условие) {
переменная = значение1;
} else {
переменная = значение2;
}
10. Ошибки при использовании вещественного счетчика цикла
11. Эффективная организация циклов
2. Инициализация. Классы. Объекты.
Присваивание и инициализация
После объявления переменной ее нужно явно инициализировать с помощью оператора присваивания, поскольку использовать переменную, которой не присвоено какое-нибудь значение, невозможно. Для присвоения ранее объявленной переменной определенного значения нужно указать слева ее имя, поставить знак равенства (=), а справа записать некоторое выражение на языке Java, задающее требуемое значение. К примеру:
int daysInMay; // объявление целочисленной переменной daysInMay = 31; // оператор присваивания значения этой переменной |
А вот пример присваивания символьной переменной некоторого значения:
char noChar; noChar = 'N'; |
Язык Java обладает удобной возможностью совмещать объявление и инициализацию переменной в одной строке.
int daysInMay = 31; // Пример объявления и инициализации переменной в одной строке |
Также в языке Java объявление переменной можно размещать в любом месте кода, например, приведенный ниже код работоспособен:
int daysInJune = 30; System.out.println(daysInJune); int daysInMay = 31; |
Ясное дело, что в одной области видимости невозможно объявить две переменные с одинаковыми именами.
Класс
Класс есть ключевое понятие в объектно-ориентированном программировании, под которое и заточена Java. Класс описывает содержание и поведение некой совокупности данных и действий над этими данными. Объявление класса производится с помощью ключевого слова class. Пример: class < имя_класса > {// содержимое класса}.
К примеру, если мы моделируем прямоугольную комнату классом Комната, то данными могут быть: длина, ширина и высота, двери, электророзетки, мебель. Заметим, что на уровне класса мы ещё не знаем, о которой комнате идет речь, но точно знаем, что это не ящик (который тоже имеет длину, высоту и ширину), а именно комната. Действиями могут быть: вычисление объема, помещение и изъятие мебели, открытие дверей. Чтобы вычислить объем комнаты или наклеить обои, нам не нужны ее размеры, о своих размерах каждая конкретная комната знает сама.
Объект
Object - это экземпляр класса. В нашем примере - это может быть какая-то конкретная комната с конкретными размерами, причем количество комнат не ограничено. Предположим у нас есть два экземпляра комнат: спальня и кабинет. Теперь мы можем совершенно не зная с какой комнатой имеем дело узнать ее объем, т.к. вычисление объема - это свойство которое работает для любой комнаты.
3. Управление доступом.
Способ доступа к члену класса определяется спецификатором доступа, который изменяет его объявление. В Java определен обширный набор спецификаторов доступа. Некоторые аспекты управления доступом связаны главным образом с наследованием и пакетами. (Пакет — это, по сути, группирование классов.)Спецификаторами доступа Java являются public (общедоступный), private (приватный) и protected (защищенный). Java определяет также уровень доступа, предоставляемый по умолчанию. Спецификатор protected применяется только при использовании наследования.
Когда член класса изменяется спецификатором доступа public, он становится доступным для любого другого кода. Когда член класса указан как private, он доступен только другим членам этого же класса. Теперь вам должно быть понятно, почему методу main () всегда предшествует спецификатор public. Этот метод вызывается кодом, расположенным вне данной программы — т.е. системой времени выполнения Java. При отсутствии спецификатора доступа по умолчанию член класса считается общедоступным внутри своего собственного пакета, но недоступным для кода, расположенного вне этого пакета.
Спецификатор доступа предшествует остальной спецификации типа члена. То есть оператор объявления члена должен начинаться со спецификатора доступа. Например:
public int i; private double j ; private int myMethod(int a, char, b) { //... }
Чтобы влияние использования общедоступного и приватного доступа было понятно, рассмотрим следующую программу:
/* Эта программа демонстрирует различие между спецификаторами public и private. */
class Test { int a; // доступ, определенный по умолчанию public int b; // общедоступный доступ private int с; // приватный доступ // методы доступа к с void setc(int i) { // установка значения переменной с с = i; } int getc() { // получение значения переменной с return с; class AccessTest { public static void main(String args[]) { Test ob = new Test(); // Эти операторы правильны, а и b доступны непосредственно ob.a = 10; ob.b = 20; // Этот оператор неверен и может вызвать ошибку // ob.c = 100; // Ошибка! // Доступ к объекту с должен осуществляться посредством методов его класса ob.setc(100) ; // OK System.out.println ("a, b, и с: " + ob.a + " " + ob.b + " " + ob.getcO); } }
Как видите, внутри класса Test использован метод доступа, заданный по умолчанию, что в данном примере равносильно указанию доступа public. Объект b явно указан как public. Объект с указан как приватный. Это означает, что он недоступен для кода, переделенного вне его класса. Поэтому внутри класса AccessTest объект с не может применяться непосредственно. Доступ к нему должен осуществляться посредством его общедоступных методов setc () и getc (). Удаление символа комментария из начала строки:
ob.c = 100; // Ошибка!
сделало бы компиляцию этой программы невозможной из-за нарушений правил доступа.
Управление доступом особенно важно при использовании наследования.
4. Организация принципов ООП в Java. Принципы ООП в Java:
Абстракция, Иерархия, Ответственность, Модульность, Принцип KISS
Абстракция
Описывая поведение какого-либо объекта, например автомобиля, мы строим его модель. Модель, как правило, не может описать объект полностью, реальные объекты слишком сложны. Приходится отбирать только те характеристики объекта, которые важны для решения поставленной перед нами задачи. Для описания грузоперевозок важной характеристикой будет грузоподъемность автомобиля, а для описания автомобильных гонок она не существенна. Но для моделирования гонок обязательно надо описать метод набора скорости данным автомобилем, а для грузоперевозок это не столь важно.
Мы должны абстрагироваться от некоторых конкретных деталей объекта. Очень важно выбрать правильную степень абстракции. Слишком высокая степень даст только приблизительное описание объекта, не позволит правильно моделировать его поведение. Слишком низкая степень абстракции сделает модель очень сложной, перегруженной деталями, и потому непригодной.
Например, можно совершенно точно предсказать погоду на завтра в определенном месте, но расчеты по такой модели продлятся трое суток даже на самом мощном компьютере. Зачем нужна модель, опаздывающая на два дня? Ну а точность модели, используемой синоптиками, мы все знаем сами. Зато расчеты по этой модели занимают всего несколько часов.
Описание каждой модели производится в виде одного или нескольких классов (classes). Класс можно считать проектом, слепком, чертежом, по которому затем будут создаваться конкретные объекты. Класс содержит описание переменных и констант, характеризующих объект. Они называются полями класса (class fields). Процедуры, описывающие поведение объекта, называются методами класса (class methods). Внутри класса можно описать и вложенные классы (nested classes) и вложенные интерфейсы. Поля, методы и вложенные классы первого уровня являются членами класса (class members). Разные школы объектно-ориентированного программирования предлагают разные термины, мы используем терминологию, принятую в технологии Java.
Вот набросок описания автомобиля:
class Automobile{
int maxVelocity; // Поле, содержащее наибольшую скорость автомобиля
int speed; // Поле, содержащее текущую скорость автомобиля
int weight; // Поле, содержащее вес автомобиля
// Прочие поля...
void moveTo(int x, int у){ // Метод, моделирующий перемещение
// автомобиля. Параметры х и у — не поля
int а = 1; // Локальная переменная — не поле
// Тело метода. Здесь описывается закон
// перемещения автомобиля в точку (х, у)
}
// Прочие методы. . .
}
Иерархия
Иерархия объектов давно используете для их классификации. Особенно детально она проработана в биологии. Все знакомы с семействами, родами и видами. Мы можем сделать описание своих домашних животных (pets): кошек (cats), собак (dogs), коров (cows) и прочих следующим образом:
class Pet{ // Здесь описываем общие свойства всех домашних любимцев
Master person; // Хозяин животного
int weight, age, eatTimel]; // Вес, возраст, время кормления
int eat(int food, int drink, int time){ // Процесс кормления
// Начальные действия...
if (time == eatTimefi]) person.getFood(food, drink);
// Метод потребления пищи
}
void voice(); // Звуки, издаваемые животным
// Прочее...
}
Затем создаем классы, описывающие более конкретные объекты, связывая их с общим классом:
class Cat extends Pet{ // Описываются свойства, присущие только кошкам:
int mouseCatched; // число пойманных мышей
void toMouse(); // процесс ловли мышей
// Прочие свойства
}
class Dog extends Pet{ // Свойства собак:
void preserve(); // охранять
}
Заметьте, что мы не повторяем общие свойства, описанные в классе Pet. Они наследуются автоматически. Мы можем определить объект класса Dog и использовать в нем все свойства класса Pet так, как будто они описаны в классе Dog:
Dog tuzik = new Dog(), sharik = new Dog();
После этого определения можно будет написать
tuzik.age = 3;
int p = sharik.eat (30, 10, 12);
А классификацию продолжить так:
class Pointer extends Dog{ ... } // Свойства породы Пойнтер
class Setter extends Dog{ ... } // Свойства сеттеров
Заметьте, что на каждом следующем уровне иерархии в класс добавляются новые свойства, но ни одно свойство не пропадает. Поэтому и употребляется слово extends — "расширяет" и говорят, что класс Dog — расширение (extension) класса Pet. С другой стороны, количество объектов при этом уменьшается: собак меньше, чем всех домашних животных. Поэтому часто говорят, что класс Dog — подкласс (subclass) класса Pet, а класс Pet — суперкласс (superclass) или надкласс класса Dog.
Часто используют генеалогическую терминологию: родительский класс, дочерний класс, класс-потомок, класс-предок, возникают племянники и внуки, вся беспокойная семейка вступает в отношения, достойные мексиканского сериала.
В этой терминологии говорят о наследовании (inheritance) классов, в нашем примере класс Dog наследует класс Pet.
Мы еще не определили счастливого владельца нашего домашнего зоопарка. Опишем его в классе Master. Делаем набросок:
class Master{ // Хозяин животного
String name; // Фамилия, имя
// Другие сведения
