Java 7 - [29]

Шрифт
Интервал

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

Описание метода может начинаться с модификаторов public, protected, private, abstract,

static, final, synchronized, native, strictfp. Мы будем вводить их по необходимости.

В списке параметров через запятую перечисляются тип и имя каждого параметра. Перед типом какого-либо параметра может стоять модификатор final. Такой параметр нельзя изменять внутри метода. Список параметров может отсутствовать, но скобки сохраняются.

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

В листинге 2.1 показано, как можно оформить метод деления пополам для нахождения корня нелинейного уравнения из листинга 1.5.

Листинг 2.1. Нахождение корня нелинейного уравнения методом бисекции

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);

}

}

вы увидите значение 7 и до и после выполнения метода f(), потому что он менял локальную переменную a, а не переменную-аргумент x.

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

class Dummy2{

private static void f(int[] a){ a[0] = 5;

}

public static void main(String[] args){ int[] x = {7};

System.out.println("До: " + x[0]); f (x);

System.out.println("После: " + x[0]);

}

}

Теперь переменная x — это ссылка на массив, которая копируется в локальную переменную, созданную для параметра a. Ссылка a направляется на тот же массив, что и ссылка x. Она меняет нулевой элемент массива, и мы получаем "До: 7", "После: 5". По-прежнему сделана передача аргумента по значению, но теперь аргумент — это ссылка, и в метод f () передается ссылка, а не объект, на который она направлена.


Рекомендуем почитать
Pro Git

Разработчику часто требуется много сторонних инструментов, чтобы создавать и поддерживать проект. Система Git — один из таких инструментов и используется для контроля промежуточных версий вашего приложения, позволяя вам исправлять ошибки, откатывать к старой версии, разрабатывать проект в команде и сливать его потом. В книге вы узнаете об основах работы с Git: установка, ключевые команды, gitHub и многое другое.В книге рассматриваются следующие темы:основы Git;ветвление в Git;Git на сервере;распределённый Git;GitHub;инструменты Git;настройка Git;Git и другие системы контроля версий.


DirectX 8. Начинаем работу с DirectX Graphics

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


MFC и OpenGL

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


Симуляция частичной специализации

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


Обработка событий в С++

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


Питон — модули, пакеты, классы, экземпляры

Python - объектно-ориентированный язык сверхвысокого уровня. Python, в отличии от Java, не требует исключительно объектной ориентированности, но классы в Python так просто изучить и так удобно использовать, что даже новые и неискушенные пользователи быстро переходят на ОО-подход.