— Приветствую, Амиго! Говорят, ты уже неплохо разобрался в методах?
— Привет, Риша. Я уже просёк эту учительскую фишечку. Я скажу, что неплохо, а ты мне такой: “а вот и нет, ни в чём ты не разобрался”.
— Ты явно переобщался с некоторыми учителями, вероятно, с Диего. Ну да ладно. Я всё-таки надеюсь, ты разобрался в методах достаточно хорошо. Ведь сегодня я научу тебя волшебным словам, которые помогают методам распределить сферы влияния.
— Звучит интригующе.
— На самом деле всё просто. Перед каждым методом программист может указать так называемые модификаторы доступа. К ним относятся ключевые слова: public
, protected
, private
.
— Эти «модификаторы доступа» позволяют ограничивать доступ к методу из других классов.
— Например, если перед объявлением метода написать ключевое слово private
, этот метод можно будет вызывать только из того же класса, в котором он объявлен. Ключевое слово public
разрешает обращение к помеченному методу из любого метода любого класса.
Всего таких модификаторов 3, а типов доступа к методу — 4, ведь отсутствие модификатора доступа тоже что-то значит. Вот тебе полная табличка:
Доступ из... | ||||
---|---|---|---|---|
Модификаторы | Любого класса | Класса-наследника | Своего пакета | Своего класса |
public |
Есть | Есть | Есть | Есть |
protected |
Нет | Есть | Есть | Есть |
без модификатора | Нет | Нет | Есть | Есть |
private |
Нет | Нет | Нет | Есть |
— А вот — полная расшифровка модификаторов доступа:
1. Модификатор public
.
К методу (переменной или классу), помеченному модификатором public
, можно обращаться из любого места программы. Это самая высокая степень открытости – никаких ограничений нет.
2. Модификатор private
.
К методу (переменной или классу), помеченному модификатором private
, можно обращаться только из того же класса, где он объявлен. Для всех остальных классов помеченный метод (или переменная) – невидимы и «как бы не существуют». Это самая высокая степень закрытости — только свой класс.
3. Без модификатора (модификатор по умолчанию).
Если метод (или переменная) не помечены никаким модификатором, считается, что они помечены «модификатором по умолчанию». Переменные или методы с таким модификатором (т.е. вообще без какого-нибудь) видны всем классам пакета, в котором они объявлены. И только им. Этот модификатор еще иногда называют package
, намекая, что доступ к переменным и методам открыт для всего пакета, в котором находится их класс
4. Модификатор protected
.
Если метод помечен модификатором protected
, к нему можно обращаться из того же класса, того же пакета и классов наследников (классов, унаследованных от класса, в котором объявлен метод). Эту тему разберем подробнее в квесте Java Core.
— Интересно, но я не уверен, что я смогу сходу правильно расставлять модификаторы.
— Ты до этого постепенно дойдёшь, не волнуйся раньше времени. До конца квеста Java Syntax можешь для всех своих методов (а также классов и переменных класса) указывать модификатор public
. Другие модификаторы тебе понадобятся тогда, когда мы начнем активно изучать ООП.
— А можешь подробнее объяснить, зачем нужны модификаторы доступа?
— Все дело в больших проектах, которые пишут десятки и сотни программистов одновременно.
— Иногда бывают ситуации, когда программист хочет разделить слишком большой метод своего класса на части и вынести часть кода во вспомогательные методы. Но вместе с тем он не хочет, чтобы другие программисты вызывали эти вспомогательные методы, т.к. тогда код его класса может работать неправильно.
— Вот и придумали такие модификаторы доступа. Пометил вспомогательный метод словом private, и никакой код кроме вашего класса не сможет увидеть ваш вспомогательный метод.
— Думаю, что понял.
Ключевое слово static
— Есть ещё одно интересное ключевое слово. Это static
. Оно превращает метод в статический.
— Что это значит?
— Я расскажу тебе об этом позднее, не переживай. Пока просто постарайся запомнить парочку фактов о статических методах.
Факт 1. Статический метод не привязан ни к какому объекту, но относится к классу, в котором объявлен. Чтобы вызвать статический метод, нужно написать:
ИмяКласса.имяМетода()
Примеры статических методов:
Имя класса | Имя статического метода | |
---|---|---|
Thread.sleep()
|
Thread |
sleep() |
Math.abs()
|
Math |
abs() |
Arrays.sort()
|
Arrays |
sort() |
Имя класса перед именем статического метода можно не писать, если вы вызываете статический метод изнутри — из того же класса. Именно поэтому вам не нужно каждый раз писать Solution
перед именами вызываемых статических методов.
Факт 2. Статический метод не может обращаться к нестатическим методам его же класса. Статический метод может обращаться только к статическим методам. Поэтому все методы, которые мы хотим вызвать из метода main
, мы объявляем статическими.
— Почему так?
— Ты ответишь на этот вопрос сам, когда начнешь изучать ООП и поймешь, как устроены статические методы. А пока — просто поверь.
Ключевое слово throws
— Есть еще одно ключевое слово, которое ты, вероятно, видел рядом с объявлением метода — это слово throws
. Оно, в отличие от модификаторов доступа и ключевого слова static
, размещается после параметров метода:
public static тип имя(параметры) throws Exception
{
код метода
}
— И что оно значит?
— И снова я вынужден тебе сказать, что его истинное предназначение ты узнаешь позднее, когда мы будем изучать исключения (15-й уровень).
Но если поверхностно коснуться его, можно сказать, что в методе, помеченном словом throws
, могут возникать ошибки (исключения) типа Exception
(и унаследованных от него классов). Если в классе могут возникнуть ошибки нескольких типов, нужно перечислить все типы через запятую.
— Звучит загадочно и непонятно! Придётся ждать 15-го уровня.
Метод main
— Давай теперь внимательнее присмотримся к главному методу. ты уже понял, что строка, в которой объявляется метод со всеми модификаторами, будет влиять на то, как этот метод будет вызываться из других классов и методов. А ещё — результат какого типа он будет возвращать и какие возможны ошибки при его работе.
— Такая строка называется объявлением метода и имеет общий вид:
модификаторы доступа static тип имя(параметры) throws исключения
Где модификаторы доступа
— это public
, protected
, private
или ничего;
static
ставится, если метод статический (отсутствует для нестатических методов)
тип
— тип результата функции (void
если результат отсутствует)
— Теперь ты уже гораздо лучше понимаешь, что значат все эти слова при объявлении метода main
:
public static void main(String[] args) throws Exception
— Ну, я понял, что доступ к методу main()
возможен из любого класса, об этом говорит слово public
. Метод статический (его можно явно вызвать в виде Solution.main()
).
— А какой результат возвращает main()
?
— А никакой! Тип результата — void
. Вроде как пустой тип, заглушка.
— А что в скобках у main()
?
— Хм… Получается, метод main
принимает параметры(!). И это массив строк.
— Всё верно. И название args
намекает на «аргументы программы». При запуске программы в нее можно передать параметры — массив строк. Они и будут содержаться в массиве args
метода main()
.
— Ничего себе! Я об этом сначала задумывался, когда увидел, а потом - привык и писал эти параметры на автомате.
— Все мы там были. Наконец, в методе main()
могут возникать необработанные ошибки типа Exception
(или его наследники). О чём говорит throws Exception
.
— Спасибо, Риша. Хоть я и не всё понял, но это было интересно.
— Пожалуйста. Постепенно ты во всех этих тонкостях разберешься, я уверен.
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ