Тело класса, в котором в любом порядке перечисляются поля, методы, конструкторы, вложенные классы и интерфейсы, заключается в фигурные скобки.
При описании поля указывается его тип, затем, через пробел, имя и, может быть, начальное значение после знака равенства, которое допустимо записать константным выражением. Все это уже обсуждалось в
Описание поля может начинаться с одного или нескольких необязательных модификаторов 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 () выполнено в духе ООП: метод активен, он сам обращается к полям экземпляра b2 и сам заносит результат в нужное поле. Метод 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);
}
}