В Java приложение состоит из классов. Классы, в свою очередь, состоят из переменных. Они отвечают за хранение данных и методов, которые отвечают за поведение класса: иначе говоря, логику, которую он может предоставлять (например, обработку некоторых данных, вызов других методов, и т. д.).
Говорить о таких составляющих как переменные можно долго, но мы сегодня не для этого собрались. Давайте лучше поговорим о такой составляющей класса как метод.
Метод — это именованный блок кода, объявляемый внутри класса. Он содержит некоторую законченную последовательность действий (инструкций), направленных на решение отдельной задачи, который можно многократно использовать.
Иными словами, метод — это некоторая функция: что-то, что умеет делать ваш класс. В других языках тоже присутствуют функции. Только в Java они являются членами классов и, согласно терминологии ООП, называются методами.
Но прежде чем продолжить, давайте рассмотрим небольшой пример:
public String constructHelloSentence(String name) {
String resultSentence = "Hello world! My name is " + name;
System.out.println(resultSentence);
return resultSentence;
}
Тут ничего сложного: метод Java, задача которого сформировать строку приветствия, с именем, которое мы ему передаем. Как например — Hello world! My name is Bobby
Давайте как следует разберемся с построением метода, рассмотрев каждое ключевое слово в объявлении метода (слева направо).
Наше первое ключевое слово — public, и оно обозначает модификатор доступа:
Модификаторы доступа
Указывают допустимую область видимости для членов класса, то есть ограничение мест, в которых разрешается использовать какую-то переменную или метод.
В языке Java применяют такие модификаторы доступа:
public: публичный. Методы или поля с этим модификатором общедоступны, видимы другим классам (а точнее, их методам и полям) из текущего пакета и из внешних пакетов. Это самый широкий уровень доступа из известных;
protected: к методам или переменным с этим модификатором есть доступ из любого места в текущем классе или пакете, или в классах, наследующих данный, а заодно — и методы или поля, даже если они находятся в других пакетах
protected String constructHelloSentence(String name) {...}Модификатор по умолчанию. Если у поля или метода класса нет модификатора, применяется модификатор по умолчанию. В таком случае поля или методы видны всем классам в текущем пакете (как protected, только с отсутствием видимости при наследовании).
String constructHelloSentence(String name) {...}private: антипод модификатора public. Метод или переменная с таким модификатором доступны исключительно в классе, в котором они объявлены.
private String constructHelloSentence(String name) {...}
String в сигнатуре метода (первая строка метода, описывающая его свойства).
Возвращаемое значение
Возвращаемое значение — это данные (некий результат выполнения метода), которые приходят на его место после вызова. Каждый метод имеет возвращаемое значение. Или нет?Методы с возвращаемым значением
Это значение может быть данными любого вида: как переменной простого типа, так и ссылочного. В рассматриваемом примере мы указываем, что метод должен вернуть объект типаString, что как мы помним, является классом, описывающим строку.
Второй момент здесь — слово return. Оно имеет прямое отношение к возвращаемому значению: значение, стоящее после него, будет отправлено назад, на место вызова метода, а сам же метод после return закроется. Это слово обычно идёт в последней строке метода (кроме методов с различными ветвлениями типа if, else...).
Если написать код в следующей строке после return:
private String constructHelloSentence(String name) {
String resultSentence = "Hello world! My name is " + name;
return resultSentence;
System.out.println(resultSentence);
}
то мы получим ругательства компилятора, что не очень хорошо (компилятор ерунду не посоветует).
Также нужно помнить, что тип данных после с должен совпадать с объявленным в сигнатуре метода.
Подробнее о return читайте здесь.
void
Для каких служитvoid в Java? Не у всех методов есть возвращаемое значение. Некоторым или нечего, или не нужно ничего возвращать. Что же тогда делать? Тогда в сигнатуре метода на место возвращаемого значения мы пишем void.
Как бы выглядел наш метод без возвращаемого значения?
protected void constructHelloSentence(String name) {
String resultSentence = "Hello world! My name is " + name;
System.out.println(resultSentence);
}
Вы наверняка заметили, что вместе с возвращаемым значением у нас исчезло слово return Так и есть, ведь наш метод и не должен ничего возвращать. Тем не менее, его можно тут поставить, но без какого-то значения, просто return; в последней строке. Это в целом бесполезно, поэтому в методах с void он необязателен. Тем не менее, его можно применять с пользой в void методах, например, при ветвлениях или циклах, когда нужно немедленно выйти из метода.
Далее в объявлении метода у нас шло constructHelloSentence.
Названия методов
constructHelloSentence — название метода, отличительная особенность, по которой мы сможем отличать тот или иной метод. И, соответственно, вызывать тот или иной метод.
Названия методов должны начинаться с маленькой буквы, но и использовать верблюжий стиль (CamelCase, верблюжий регистр): т.е. каждое следующее слово в названии стоит впритык к предыдущему и пишется с большой буквы.
Наименования методов должны описывать метод (лучший комментарий — правильное именование). Для этого используйте глаголы или сочетания с глаголами: getCat, delete, createCar, и так далее.
В пределах одного класса имена методов должны быть уникальными (не считая перегрузки методов, о чем поговорим немного ниже).
Смотрим дальше разбираемый нами метод и видим (String name)
Параметры метода
Методы могут иметь (или не иметь) определенные данные, которые будут поступать снаружи, а именно — с места, где и был вызван метод. В нашем случае мы видим, что приходит объект типаString с именем name и в дальнейшем мы используем эту переменную в нашем методе.
В методе можно использовать неограниченное количество параметров, но больше 7 — не рекомендуется.
Когда мы не знаем точное количество элементов, но все эти элементы нужны для одной цели и будут одного типа (например, String), используется многоточие:
public void constructHelloSentence(String...name) {
...
}
Обращение к каждому элементу будет такого вида: name[0]
Ничего не напоминает? Верно, массив! Ничего не изменится, если мы напишем:
protected void constructHelloSentence(String[] name) {
...
}
Обращение к элементам также будет вида: name[1]
И ещё кое что. Аргументы метода могут быть final:
public String constructHelloSentence(final String name) {
...
}
Это значит, что ссылка name привязана к конкретному объекту String, и переопределить её нельзя.
Про работу с ссылочными переменными и их взаимодействие с зарезервированным словом final можно прочитать в материале “Ссылочные типы данных в Java”.
Вызов методов
Итак, с созданием методов разобрались, теперь давайте поговорим об их использовании. Как вызвать метод в Java?
Каждый метод в Java находится в классе. Чтобы разобраться, как устроен вызов методов в Java, возьмем класс:
public class StringConstructor {
public String constructHelloSentence(String name) {
String resultSentence = "Hello world! My name is " + name;
System.out.println(resultSentence);
return resultSentence;
}
}
Так как у нас метод не является статическим (это отдельная тема для разговора, выходящая за рамки сегодняшней статьи), для его вызова нужно сперва создать объект, и уже у него вызвать метод:
class Application{
public static void main(String[] args) {
StringConstructor stringConstructor = new StringConstructor();
stringConstructor.constructHelloSentence("Den");
}
}
В аргументы нашего метода мы передали строку (имя), которую хотим видеть в результирующей строке, выведенной на экран:
Hello world! My name is Den
Также стоит напомнить, что методы можно переиспользовать то количество раз, сколько нам потребуется — ограничений нет.
this
Часто в коде можно увидеть ключевое словоthis, как например в сеттерах:
public void setValue(Long value) {
this.value = value;
}
И что же оно значит?
this в Java — это ссылка на текущий объект данного класса. Например, если мы создали объект:
StringConstructor stringConstructor = new StringConstructor();
то this внутри объекта stringConstructor будет ссылкой на этот же объект.
this используется как для ссылки на переменную объекта (как в сеттере выше), так и для вызова некоторого метода.
Мы можем немного переписать наш класс:
public class StringConstructor {
public String constructHelloSentence(String name) {
String resultSentence = this.getSentence() + name;
System.out.println(resultSentence);
return resultSentence;
}
private String getSentence() {
return "Hello world! My name is ";
}
}
Через this мы вызываем метод данного объекта, для взятия необходимой строки.
Но всё же как правило для методов this почти не используется, так как и без него идёт ссылка на метод данного объекта, в основном он используется для на переменную объекта.
Перегрузка методов
Предположим нам понадобился метод, выполняющий по сути ту же самую логику, но в предложенииHello world! вместо world мы хотим вставить своё слово (строку). Но ведь у нас уже есть метод constructHelloSentence. Значит, нам нужно придумать новое название для метода, который выполняет по сути тот же функционал? Как бы не так: в этот момент на помощь нам приходит перегрузка методов.
Перегрузка методов — это использование одного и того же имени метода несколько раз при его объявлении в классе. С точки зрения синтаксиса языка, не может быть двух одинаковых имен в некотором локальном пространстве. Но при этом допускается объявление методов с одинаковыми именами но отличающимися аргументами. Иными словами, класс содержит в себе перегруженные, когда есть два и более методов с одинаковыми названиями, но различными входными данными:
public class Constructor {
public String constructHelloSentence(String name) {
String resultSentence = "Hello world! My name is " + name;
System.out.println(resultSentence);
return resultSentence;
}
protected String constructHelloSentence(String firstName, String secondName) {
String resultSentence = "Hello " + firstName + "! My name is " + secondName;
System.out.println(resultSentence);
return resultSentence;
}
}
Здесь мы видим, что методы не обязаны содержать одинаковый модификатор доступа (как и возвращаемый тип).
Если вызывается перегруженный метод, то из нескольких объявленных методов компилятор автоматически определяет нужный по параметрам, которые указываются при вызове.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ