Главная » Java, Структуры данных и алгоритмы » Методы Java

0

Метод в Java соответствует понятиям «функция» и «процедура», используемым в других языках программирования высокого уровня, и представляет собой «куски» кода, которые могут вызываться для определенного объекта (некоторого класса). Методы принимают параметры в качестве аргументов, а выполняемые методом действия зависят от обрабатываемого объекта и Значений йерейайных параметров. В Java методы описываются в теле класса. Описание метода состоит из двух частей: сигнатуры, определяющей имя, число и типы параметров метода, и тела метода, в котором описываются выполняемые действия.

Объявление метода

Описание метода происходит следующим образом:

[<method_modifiers>] <return_type> <method-name> ([<params>]) { // тело метода…

}

Вместо <param> можно через запятую задать список параметров, для описания которых используется следующий синтаксис:

<param_type> <param_name> [, <param_type> <param_name> [,..]]

Методы класса связаны с определенным экземпляром этого класса (если они не являются статичными) и могут быть использованы для изменения состояния объекта. Например:

public jvoid renameGnome (String s) {

name = s, // Переопределить поле "name" этого гнома.

}

Тип возвращаемого методом значения описывается так же, как и переменные экземпляра класса, а также имена параметров. В приведенном выше примере слово void обозначает, что метод не возвращает никакого значения. Переданные параметры могут быть данными базового типа или ссылками на объект. На эти переменные и поля класса могут ссылаться другие методы и поля внутри тела метода. Аналогично другие методы данного класса могут быть вызваны внутри тела метода. Ниже будет более подробно рассмотрен каждый компонент объявления метода.

Модификаторы метода

Так же, как и модификаторы переменных, модификаторы методов определяют сферу деятельности метода:

•             public: открытые методы, доступные отовсюду;

•             protected: защищенные методы, вызываются методами из классов того же пакета или их подклассов;

•             private: закрытые методы, могут вызываться только методами данного класса (методы подклассов не применимы);

•             если не используется ни один из указанных модификаторов, метод по умолчанию считается «дружественным». Дружественные методы вызываются для объектов всех классов одного пакета.

После указанных модификаторов могут использоваться следующие дополнительные модификаторы, ограничивающие метод:

•             abstract: метод объявляется абстрактным, в этом случае он не имеет кода. После списка параметров абстрактного метода ставится точка с запятой, и тело метода не описывается. Например:

public abstract void setHeight (double newHeight),

Абстрактные методы используются только в абстрактных классах. Более подробно применение данной структуры рассматривается в разделе 2.4.

(

•   final: этот метод не может быть переопределен в подклассах;

•       static: метод относится ко всему классу, а не к определенному экземпляру класса. Кроме того, статические методы используются при работе со статическими переменными класса (если эти переменные не помечены модификатором final).

Типы возвращаемого значения

В описании метода должен быть указан тип возвращаемого методом значения. Если метод не возвращает никакого значения, то вместо типа возвращаемого значения записывается слово void, в этом случае метод представляет собой процедуру:; в противном случае метод называется функцией. Для обозначения возвращаемого значения в Java в теле метода используется слово return (тип результата должен соответствовать типу значения, возвращаемого методом). Ниже приводится пример метода (внутри класса Gnome), который является функцией:

public boolean isMagical () { return magical;

}

В Java выполнение метода прекращается после того, как функция возвращает определенное значение.

В Java функция возвращает только одно значение. Чтобы получить несколько значений, необходимо объединить их в один сложный объект, поля которого содержат все возвращаемые значения. Метод в данном случае возвращает ссылку на этот сложный объект. Кроме того, чтобы метод «возвращал» несколько значений, можно изменить внутреннее состояние объекта, обрабатываемого этим методом.

Параметры

- Параметры метода записываются после его имени в круглых скобках через запятую. Параметры состоят из двух частей — тип параметра и имя параметра. Если параметры не заданы, в круглых скобках ничего не указывается.

В Java все параметры передаются значением, то есть при передаче параметра в метод создается его копия, которая и используется внутри тела метода. Итак, если в метод передается переменная int, копируется числовое значение этой переменной. Метод может изменять копию, но не оригинал. Если в качестве параметра в метод передается ссылка, то копия делается и для ссылки. Заметим, что несколько переменных могут ссылаться на один объект. При изменении ссылок внутри метода переданная ссылка не изменяется. Например, если в качестве параметра h методу передана ссылка g на объект класса Gnome, то метод может соотнести ссылку h другому объекту, но g будет относиться к первоначальному объекту. Безусловно, ссылка h может быть использована для изменения внутреннего состояния объекта, что приведет к изменению объекта, на который ссылается g (так как изначально hug ссылаются на один объект).

Методы конструктора

Конструктор — это особый вид метода, который служит для инициализации созданных объектов. В Java описание и вызов конструктора осуществляются специальным образом. Вначале рассмотрим описание конструктора:

[constructor_modifiers] <constructor_name> ([<params>]) { // Тело конструктора…

}

Итак, правила описания конструктора в сущности аналогичны любому методу. Однако имя конструктора должно совпадать с именем класса. Таким образом, если имя класса Fish, то имя конструктора также Fish. Кроме того, конструктор не возвращает никакого значения. То есть тип возвращаемого им значения — всегда void. Перед именем конструктора, как и перед другими методами, можно использовать модификаторы, однако в данном случае не кюгут быть использованы модификаторы abstract, static или final.

Например:

public Fish (int w, String n) { weight = w, name = n;

}

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

Вызов конструктора происходит особым образом — с помощью оператора new. Итак, при обращении к конструктору создается новый экземпляр данного класса, после чего конструктор выполняется, осуществляя инициализацию полей и прочих установочных заданий. Рассмотрим вызов следующего конструктора (одновременно происходит объявление переменной my Fish):

Fish myFish = new Fish (7, "Wally");

В классе может быть несколько конструкторов, которые обладают различными сигнатурами, при этом конструкторы должны отличаться типом и количеством параметров’.

Метод main

В Java некоторые классы предназначены для использования другими классами, а ряд классов представляют собой независимые программы. Классы, описывающие независимые программы (приложения), должны обязательно содержать особый метод с именем main. Для выполнения Java-приложения необходимо указать имя класса, описывающего эту программу, например, с помощью следующей команды (в DOS или UNIX):

Java Aquarium

В этом случае исполняющая Java-система находит скомпилированную версию класса Aquarium, после чего вызывается метод main из этого класса. Объявление метода main происходит следующим образом:

public static void main(String[] args) {

// Тело метода…

}

Аргументы, передаваемые (при запуске программы) в метод main как параметр args, перечисляются в строке вызова. Переменная args является массивом строк, то есть совокупностью индексированных строк, причем в первой строке’записывается args[0], во второй — args [1] и так далее (более подробно массивы будут рассмотрены в разделе 1.5). Например, при описании программы Aquarium можно задать дополнительный аргумент, который определяет количество рыбок в аквариуме. В этом случае запуск программы осуществляется набором следующей строки:

Java Aquarium 45

которая показывает, что необходим аквариум с 45 рыбками. В данном случае args [0] содержит строку с содержимым "45". Отличительная особенность метода main состоит в том, что благодаря ему каждый класс может описывать автономную программу, и кроме того, метод может использоваться для проверки работы всех методов класса. Таким образом, метод main может применяться как эффективное средство отладки совокупностей Java-KJiaccoB.

Блоки операторов и локальные переменные

Тело метода представляет соббй блок операторов, то есть последовательность операторов и переменных, записанных в фигурных скобках «{» и «}». Тело метода и прочие блоки операторов могут содержать вложенные блоки операторов. Блоки операторов состоят из операторов, выполняющих определенные действия, например, вызывающих метод для некоторого объекта, но, кроме того, в них могут объявляться локальные переменные. Эти переменные объявляются внутри тела оператора, как правило, в его начале (внутри скобок «{» и «}»). Локальные переменные аналогичны переменным экземпляра класса, однако существуют только во время выполнения этого блока операторов. Когда алгоритм управления выходит из данного блока, локальные переменные уже не могут использоваться. Локальные переменные бывают базового rhuna (например, int, float или double) либо же являются ссылками на экземпляры некоего класса. Отдельные операторы и переменные в Java разделяются точкой с запятой «;».

Локальные переменные объявляются следующим образом:

<variable_type> <variable_name> [= <initial_value>];

Правила задания типа, имени и начального значения этих переменных аналогичны правилам, используемым для переменных объекта. Ниже приводится несколько примеров объявления локальных переменных:

{

double г;

Point р1 = new Point (3, 4); Point р2 = new Point (8, 2); int i = 512; double e = 2.71828;

}

Следует отметить, что при объявлении переменной можно присвоить первоначальное значение.

Фрагмент кода 1.1 является законченным призером описания класса Gnome.

public class Gnome {

// Переменные экземпляра класса* protected String name; protected int age; protected Gnome gnome-buddy; private boolean magical = false; public double height = 2,6; // в футах

public static final int MAX-HEIGHT = 3; // максимальная высота

// Конструкторы

Gnome(String nm, int ag. Gnome bud, double hgt) { // пряностью параметризован name = nm; age = ag;

gnome-buddy = bud; height = hgt;

}

Gnome() { // Конструктор по умолчанию name = "Rumple"; age = 204; gnome_buddy = null; height =2.1;

}

// Методы:

public static void makeKing (Gnome h) { h.name = "King" + h.getRealNameQ; h.magical = true; // является полем класса Gnome.

}

public void makeMeKing () {

name = "King" + getRealName(); magical = true;

}

public boolean isMagicalQ { return magical; }

public void setHeight(int new/Height) { height = new/Height; }

public String getNameQ { return "I won’t tell!"; }

public String getRealNarpeQ { return name; }

public void renameGnome(String s) { name = s, }

}

Фрагмент кода 1.1. Класс Gnome

Источник: Гудрич М.Т. Г93 Структуры данных и алгоритмы в Java / М.Т. Гудрич, Р. Тамассия; Пер. с англ. A.M. Чернухо. — Мн.: Новое знание, 2003. — 671 е.: ил.

По теме:

  • Комментарии