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;
}
}
Здесь мы видим, что методы не обязаны содержать одинаковый модификатор доступа (как и возвращаемый тип).
Если вызывается перегруженный метод, то из нескольких объявленных методов компилятор автоматически определяет нужный по параметрам, которые указываются при вызове.