— Приветствую, Амиго! Говорят, ты уже неплохо разобрался в методах?

— Привет, Риша. Я уже просёк эту учительскую фишечку. Я скажу, что неплохо, а ты мне такой: “а вот и нет, ни в чём ты не разобрался”.

— Ты явно переобщался с некоторыми учителями, вероятно, с Диего. Ну да ладно. Я всё-таки надеюсь, ты разобрался в методах достаточно хорошо. Ведь сегодня я научу тебя волшебным словам, которые помогают методам распределить сферы влияния.

— Звучит интригующе.

— На самом деле всё просто. Перед каждым методом программист может указать так называемые модификаторы доступа. К ним относятся ключевые слова: 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, и никакой код кроме вашего класса не сможет увидеть ваш вспомогательный метод.

— Думаю, что понял.

undefined
7
Задача
Java Syntax Pro, 7 уровень, 5 лекция
Недоступна
У всего есть корень
Метод printSqrt(int[] array) должен выводить корень квадратный для каждого элемента переданного массива. Но этого не происходит из-за конфликта имен переменных. Исправь имена переменных так, чтобы код компилировался. В результате работы программа должна выводить в консоли соответствующую строку для

Ключевое слово static

— Есть ещё одно интересное ключевое слово. Это static. Оно превращает метод в статический.

— Что это значит?

— Я расскажу тебе об этом позднее, не переживай. Пока просто постарайся запомнить парочку фактов о статических методах.

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

ИмяКласса.имяМетода()

Примеры статических методов:

Имя класса Имя статического метода
Thread.sleep() Thread sleep()
Math.abs() Math abs()
Arrays.sort() Arrays sort()

Имя класса перед именем статического метода можно не писать, если вы вызываете статический метод изнутри — из того же класса. Именно поэтому вам не нужно каждый раз писать Solution перед именами вызываемых статических методов.

Факт 2. Статический метод не может обращаться к нестатическим методам его же класса. Статический метод может обращаться только к статическим методам. Поэтому все методы, которые мы хотим вызвать из метода main, мы объявляем статическими.

— Почему так?

— Ты ответишь на этот вопрос сам, когда начнешь изучать ООП и поймешь, как устроены статические методы. А пока — просто поверь.

undefined
7
Задача
Java Syntax Pro, 7 уровень, 5 лекция
Недоступна
Города-гиганты
Программа должна выводить количество населения самых крупных городов мира и сравнивать их с самым большим городом — Токио. Но алгоритм программы немного нарушен. Для исправления ошибки тебе необходимо сделать, так чтобы в строке с выводом информации о самом крупном городе мира использовались статиче

Ключевое слово 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

— Ну, я понял, что доступ к методу main() возможен из любого класса, об этом говорит слово public. Метод статический (его можно явно вызвать в виде Solution.main()).

— А какой результат возвращает main()?

— А никакой! Тип результата — void. Вроде как пустой тип, заглушка.

— А что в скобках у main()?

— Хм… Получается, метод main принимает параметры(!). И это массив строк.

— Всё верно. И название args намекает на «аргументы программы». При запуске программы в нее можно передать параметры — массив строк. Они и будут содержаться в массиве args метода main().

— Ничего себе! Я об этом сначала задумывался, когда увидел, а потом - привык и писал эти параметры на автомате.

— Все мы там были. Наконец, в методе main() могут возникать необработанные ошибки типа Exception (или его наследники). О чём говорит throws Exception.

— Спасибо, Риша. Хоть я и не всё понял, но это было интересно.

— Пожалуйста. Постепенно ты во всех этих тонкостях разберешься, я уверен.