Ильдар Хабибуллин - Java 7 [Наиболее полное руководство]
- Название:Java 7 [Наиболее полное руководство]
- Автор:
- Жанр:
- Издательство:БХВ-Петербург
- Год:2012
- ISBN:978-5-9775-0735-6
- Рейтинг:
- Избранное:Добавить в избранное
-
Отзывы:
-
Ваша оценка:
Ильдар Хабибуллин - Java 7 [Наиболее полное руководство] краткое содержание
Java 7 [Наиболее полное руководство] - читать онлайн бесплатно ознакомительный отрывок
Интервал:
Закладка:
Вообще говоря, сложность программы не может быть меньше сложности задачи, которую она решает. Надо только постараться, чтобы сложность программы не превысила сложность задачи. Стандартную задачу надо решать стандартными методами, используя стандартные конструкции языка. Нестандартную задачу тоже лучше решить стандартными методами, и только если это не получается, вводить сложные конструкции.
Каждый язык программирования устанавливает свой стиль. Стиль всякого объектноориентированного языка программирования — следование принципам ООП и использование стандартных библиотек классов. Язык Java очень хорошо приспособлен для выражения этого стиля. На нем легко писать программы, следующие стилю ООП.
При изучении языка программирования важно усвоить его стиль и следовать этому стилю в своих программах. Удивительно, но правильный стиль программирования очень помогает в написании правильных эффективных программ.
1. Опишите в виде объекта строительный подъемный кран.
2. Опишите в виде объекта игровой автомат.
3. Смоделируйте в виде объекта сотовый телефон.
Как описать класс и подкласс?
Итак, описание класса начинается со слова class, после которого записывается имя класса. Соглашения "Code Conventions" рекомендуют начинать имя класса с заглавной буквы.
Перед словом class можно записать модификаторы класса (class modifiers). Это одно из слов public, abstract, final, strictfp. Перед именем вложенного класса можно поставить также модификаторы protected, private, static. Модификаторы класса мы будем вводить по мере изучения языка.
Тело класса, в котором в любом порядке перечисляются поля, методы, конструкторы, вложенные классы и интерфейсы, заключается в фигурные скобки.
При описании поля указывается его тип, затем, через пробел, имя и, может быть, начальное значение после знака равенства, которое допустимо записать константным выражением. Все это уже обсуждалось в главе 1.
Описание поля может начинаться с одного или нескольких необязательных модификаторов public, protected, private, static, final, transient, volatile. Если надо поставить несколько модификаторов, то перечислять их JLS рекомендует в указанном порядке, поскольку некоторые компиляторы требуют определенного порядка записи модификаторов. С модификаторами мы будем знакомиться по мере необходимости.
При описании метода указывается тип возвращаемого им значения или слово void, затем, через пробел, имя метода, потом, в скобках, список параметров. После этого в фигурных скобках расписывается выполняемый метод.
Описание метода может начинаться с модификаторов public, protected, private, abstract,
static, final, synchronized, native, strictfp. Мы будем вводить их по необходимости.
В списке параметров через запятую перечисляются тип и имя каждого параметра. Перед типом какого-либо параметра может стоять модификатор final. Такой параметр нельзя изменять внутри метода. Список параметров может отсутствовать, но скобки сохраняются.
Перед началом работы метода для каждого параметра выделяется ячейка оперативной памяти, в которую копируется значение параметра, заданное при обращении к методу. Такой способ называется передачей параметров по значению. Конкретные значения параметров, переданные методу при обращении к нему, называются аргументами метода. Типы аргументов метода должны быть согласованы с типами соответствующих параметров метода.
В листинге 2.1 показано, как можно оформить метод деления пополам для нахождения корня нелинейного уравнения из листинга 1.5.
class Bisection2{
private static double final EPS = 1e-8; // Константа класса.
private double a = 0.0, b = 1.5, root; // Закрытые поля экземпляра.
public double getRoot(){return root;} // Метод доступа к полю root.
private double f(double x){
return x*x*x — 3*x*x + 3; // Можно вернуть и что-нибудь другое.
}
private void bisect(){ // Параметров у метода нет —
// метод работает с полями экземпляра. double y = 0.0; // Локальная переменная — не поле.
do{
root = 0.5 *(a + b); y = f(root);
if (Math.abs(y) < EPS) break;
// Корень найден. Выходим из цикла.
// Если на концах отрезка [a; root] функция имеет разные знаки: if (f(a) * y < 0.0) b = root;
// значит, корень здесь, и мы переносим точку b в точку root.
// В противном случае: else a = root;
// переносим точку a в точку root
// Продолжаем до тех пор, пока [a; b] не станет мал.
} while(Math.abs(b-a) >= EPS);
}
public static void main(String[] args){
Bisection2 b2 = new Bisection2(); b2.bisect();
System.out.println("x = " +
b2.getRoot() + // Обращаемся к корню через метод доступа.
", f() = " +b2.f(b2.getRoot()));
}
}
В описании метода f () сохранен старый процедурный стиль: метод получает аргумент, скопированный в параметр x, обрабатывает его и возвращает результат. Описание метода bisect () выполнено в духе ООП: метод активен, он сам обращается к полям экземпляра b 2и сам заносит результат в нужное поле. Метод bisect () — это внутренний механизм класса Bisection2, поэтому он закрыт (private).
При обращении к методу создаются локальные переменные для хранения параметров метода на время его работы. Под них выделяются ячейки оперативной памяти, в которые копируются аргументы метода, заданные при обращении к нему. Локальные переменные-параметры существуют только во время выполнения метода, по окончании его работы переменные уничтожаются и память освобождается.
Теория программирования знает несколько способов передачи аргументов в метод. Чаще всего применяются два способа: передача по значению и передача по ссылке.
Если аргумент передается по значению, то он копируется в локальную переменную-параметр метода, созданную во время выполнения метода и существующую только на время его работы. Сам аргумент при этом остается недоступным для метода и, следовательно, не изменяется им.
При передаче по ссылке в метод поступает не сам аргумент, а его адрес. Метод работает не с копией, а непосредственно с аргументом, обращаясь к нему по адресу, переданному в локальную переменную, и изменяет сам аргумент.
В языке Java, как и в языке С, реализован только один способ — передача аргументов по значению. Например, выполнив следующую программу:
class Dummy1{
private static void f(int a){ a = 5;
}
public static void main(String[] args){
int x = 7;
System.out.println( ,,До: " + x); f(x);
System.out.println("После: " + x);
}
}
вы увидите значение 7 и до и после выполнения метода f(), потому что он менял локальную переменную a, а не переменную-аргумент x.
Очень часто у метода встречаются параметры ссылочного типа. В этом случае в локальную переменную-параметр копируется значение аргумента-ссылки, которое, среди прочего, содержит адрес, по которому хранится значение переменной. После этого метод будет работать непосредственно с объектом, на который ссылается аргумент, при помощи локальной копии аргумента-ссылки. Следующий пример поясняет это.
Читать дальшеИнтервал:
Закладка: