Методы
Класс может содержать методы — один, два, три и больше в зависимости от сложности класса. Название метода всегда завершается двумя круглыми скобками, после которых идет блок кода, обрамлённый фигурными скобками. Например, метод sayMeow() класса Cat выводит мяуканье кошки. Внутри имени метода могут быть параметры, например, sayMeow(3) — кошка мяукает три раза. Параметров может быть несколько, тогда они разделяются запятыми.
Общая форма объявления метода выглядит следующим образом:
модификатор тип имяМетода(список_параметров) < // тело метода >
Метод может не иметь параметров, в этом случае используются пустые скобки. Модификатор определяет видимость метода (public, private). Если модификатор не указан, то считается, что метод имеет модификатор private в пределах своего пакета.
Методы могут вызывать другие методы.
Каждый метод начинается со строки объявления внутри круглых скобок, которую называют сигнатурой метода:
public static void sayMeow(int count) < // здесь ваш код >
Если рассмотреть данный метод, то можно сказать следующее. Ключевое слово public означает, что метод доступен для любого класса. Ключевое слово static означает, что нам не нужно создавать экземпляр (копию) объекта Cat в памяти. Ключевое слово void означает, что метод не возвращает никаких данных. Именем метода является слово перед круглыми скобками.
Если метод возвращает какие-то данные, то в теле метода используется оператор return значение, где значение — это возвращаемое значение. Тогда вместо void нужно указать возвращаемый тип.
Вспомним наш класс Box, в котором определены высота, ширина и глубина ящика. Зная эти величины, мы вычисляли объём коробки самостоятельно. Но мы можем расширить возможности класса, чтобы он сам мог вычислить объём внутри класса и предоставить нам готовые данные. Давайте добавим в класс новый метод:
class Box < int width; // ширина коробки int height; // высота коробки int depth; // глубина коробки // вычисляем объём коробки String getVolume() < return "Объём коробки: " + (width * height * depth); >>
Теперь пробуем вычислить объём коробки с помощью готового метода, который есть в классе:
Box catBox = new Box(); catBox.width = 400; catBox.height = 200; catBox.depth = 250; mInfoTextView.setText(catBox.getVolume());
Мы уже не вычисляем объём вручную, за нас это сделает класс Box, у которого есть готовый метод для вычисления объёмов.
Обращение к методу осуществляется как и к переменной через точку. Наличие круглых скобок позволяет различать метод от имени переменной. То есть, если вы увидите запись:
cat.getVolume; // это переменная cat.getVolume(); // это метод
Выше приведён немного искусственный пример, так как опытный программист никогда не назовёт переменную именем getVolume. Существует рекомендация, что для методов в начале имени нужно использовать глагол и начинаться имя должно с маленькой буквы — переменные так называть не следует.
Использование параметров
Параметры позволяют работать с различными данными. Допустим, мы хотим вычислить площадь прямоугольника со сторонами 3 и 5 см.
int getSquare()
Метод работает, но область его применения слишком ограничена. Мы сможем вычислять площадь только одного прямоугольника с жёстко заданными размерами. Но прямоугольники бывают разными и нам нужен универсальный метод. Добиться решения задачи можно с помощью параметров. Перепишем метод следующим образом:
int getSquare(int a, int b)
Теперь мы можем вычислять площадь любого прямоугольника, зная его размеры. Возьмём тот же прямоугольник со сторонами 3 и 5 см и вычислим его площадь:
mInfoTextView.setText("Площадь прямоугольника: " + getSquare(3, 5));
В правильно написанных классах стараются избегать доступа к переменным класса напрямую. Следует использовать методы, которые позволяют избежать ошибок. В нашем классе Box использовались отдельные переменные width, height, depth. Код с использованием этих переменных слишком громоздкий, кроме того вы можете забыть про какую-нибудь переменную. Добавим в класс новый метод, который упростит наш код для вычисления объёма ящика:
package ru.alexanderklimov.test; class Box < int width; // ширина коробки int height; // высота коробки int depth; // глубина коробки // вычисляем объём коробки int getVolume() < return width * height * depth; >// устанавливаем размеры коробки void setDim(int w, int h, int d) < width = w; height = h; depth = d; >>
Пробуем класс в действии:
Box catBox = new Box(); catBox.setDim(400, 200, 250); int vol = catBox.getVolume(); mInfoTextView.setText("Объём ящика: " + vol);
Теперь мы не обращаемся к отдельным переменным класса, а вызываем метод setDim() для установки размеров ящика, после чего можно вызвать метод getVolume() для вычисления объёма. Естественно, вы можете реализовать свою логику в классе. Например, вы можете создать метод getVolume() с параметрами, которые отвечают за размеры ящика и возвращать сразу готовый результат.
Перегрузка методов
Метод — имя для действия: прыгнуть, мяукнуть, отформатировать диск. Использование имён при написании кода упрощает её понимание и модификацию. Работа разработчика схожа с работой писателя — в обоих случаях требуется донести свою мысль до читателя/приложения.
Часто одно и то же слово имеет несколько разных значений — оно перегружено. Например, мы говорим «вымыть посуду» и «вымыть кота». Было бы глупо говорить «посудовымыть посуду» или «котовымыть кота», чтобы подчеркнуть разницу. Также и с методами. Можно создавать методы с одинаковыми именами, но с разным набором аргументов.
Перегрузку (overloading) следует отличать от замещения (overriding) — иной реализации метода в подклассе первоначально определившего метод класса.
Java, как и многие языки программирования, разрешает создавать внутри одно класса несколько методов с одним именем. Главное, чтобы у них различались параметры. Параметры могут различаться типами или количеством аргументов. Будьте внимательны, если вы зададите различные типы для возвращаемого значения, то этого будет недостаточно для создания перегруженной версии метода. Когда Java встречает вызов перегруженного метода, то выбирает ту версию, параметры которой соответствуют аргументам, использованным в вызове.
Создадим класс Cat с набором перегруженных методов:
class Cat < void meow() < // параметры отсутствуют >void meow(int count) < // используется один параметр типа int >void meow(int count, int pause) < // используются два параметра типа int >long meow(long time) < // используется один параметр типа long return time; >double meow(double time) < // используется один параметр типа double return time; >>
Вы можете вызвать любой метод из класса:
Cat kitty = new Cat(); kitty.meow(); kitty.meow(3); kitty.meow(3, 2); kitty.meow(4500.25);
Если присмотреться, то можно догадаться, какая именно версия метода вызывается в каждом конкретном случае.
Аналогично, перегрузка используется и для конструкторов.
Методы с переменным числом параметров
Можно создавать методы с переменным числом параметров. В этом случае используется многоточие.
public static double getMaxValue(Object. args) < // код >
По сути, создаётся массив типа Object[].
Создадим метод, вычисляющий и возвращающий максимальное из произвольного количества значений.
public static double getMaxValue(double. values) < double largest = Double.MIN_VALUE; for(double v : values) < if (v >largest) < largest = v; >> return largest; >
double variable = getMaxValue(5.3, 39.6, -4);
До Java 5 использовался следующий способ.
static void printArray(Object[] args)
Подобный код может встречаться в старых проектах, но в Android практически не используется.
Метод toString()
Каждый класс реализует метод toString(), так как он определён в классе Object. Но использовать метод по умолчанию не слишком удобно, так как не содержит полезной информации. Разработчики предпочитают переопределять данный метод под свои нужды. Сам метод имеет форму:
String toString()
Вам остаётся возвратить объект класса String, который будет содержать полезную информацию о вашем классе. Давайте возьмём для примера класс Box, созданный выше:
class Box < int width; // ширина коробки int height; // высота коробки int depth; // глубина коробки Box(int width, int height, int depth)< this.width = width; this.height = height; this.depth = depth; >// вычисляем объём коробки String getVolume() < return "Объём коробки: " + (width * height * depth); >public String toString() < return "Коробочка для кота размером " + width + "x" + height + "x" + depth; >>
Теперь можете узнать о классе Box:
Box box = new Box(4, 5, 6); mInfoTextView.setText(box.toString());
Метод очень часто используется при создании собственных классов и вам тоже придётся прибегать к этому способу.
Как вернуть из метода больше одного значения?
Методы в Java возвращают одно значение. А если хочется сразу вернуть сразу два и более значений? Например, у нас имеется массив чисел и мы хотим написать метод, который сразу возвращает минимальное и максимальное значение из него.
Одно из решений заключается в том, что нужно «запаковать» два значения полученные в одном методе с помощью конструктора специального класса, а затем «распаковать» их в другом методе, при обращении к конструктору.
Ключевое слово void, его особенности и return [дубликат]
Выводится в консоль: 14 Не могу понять зачем нам void , если мы можем написать public **int** run(. ) Пытаюсь разобраться с void и return.
Отслеживать
задан 19 ноя 2018 в 11:49
Петровченко Иван Петровченко Иван
1,913 1 1 золотой знак 13 13 серебряных знаков 39 39 бронзовых знаков
В первом примере функция run не возвращает ничего.
19 ноя 2018 в 11:52
Вы видите одно и то же, а под капотом происходит разное. Можно вообще просто написать в методе main одну строчку System.out.println(«14»); и спрашивать, зачем нам вообще нужны какие-то функции, методы и классы, когда я просто могу вывести «14» одной строчкой кода.
19 ноя 2018 в 12:34
Вы месяц назад уже задавали такой вопрос и даже отметили один из ответов. Зачем опять задавать такой же вопрос?
19 ноя 2018 в 12:37
@Эникейщик я понял как это работает, но не пойму что использовать и как? Потому что выше 2 примера работают одинаково.
19 ноя 2018 в 12:50
@Эникейщик то есть 1 пример говорит: зачем нам return если можно сделать так (как в 1 примере)
19 ноя 2018 в 12:50
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
Весь смысл функции с типом void — это действия без отчета. Если функция не void , то она по возвращает какой-то результат и заканчивает работу.
В первом примете, если у вас, к примеру, нет доступа к консоли, вы никогда не узнаете о том, что функция выполнена.
Во втором случаи, функция отсылает «отчет» о том, что она сделала, и вы видите результат. И так, void используем для функций, которые работают независимо и мы не ждем от них «отчета».
Ключевое слово return прекращает выполнение функции. Можно использовать и в циклах ( break ), функциях.
public void count(int stop) < for(int i = 0; i < 100; i++) < System.out.println(i); if (i == stop) < return; >> >
В данном случаи мы в функцию передаем число, после которого следует прекратить вывод чисел.
Применение Java Void Reference Type: детальный разбор
Ссылочный тип Void в Java – это объектный аналог примитивного типа void . Его часто используют как заглушку в случае работы с обобщенными типами, когда нет необходимости возвращать значение. Например, Void используется в обобщенных типах, как в выражении Callable , когда задача выполняется, но не возвращает никакого результата.
Скопировать код
ExecutorService executor = Executors.newSingleThreadExecutor(); executor.submit(() -> < // Код выполняется, но ничего не возвращает return null; >);
Использование рефлексии: void в сравнении с Void
В рефлексии класс Void.TYPE представляет объект, соответствующий примитивному типу void . Это позволяет определить, действительно ли метод возвращает void .
Скопировать код
Method method = MyClass.class.getMethod("methodName"); if (method.getReturnType().equals(Void.TYPE)) < // Метод не возвращает значение. >
Ограничения обобщённых типов: использование Void как заглушки
При проектировании API и интерфейсов с использованием обобщённых типов Void удобно использовать для обозначения классов, методы которых не предполагают возврат данных.
Скопировать код
Map keysWithNoValues = new HashMap<>(); // Карта без значений, только ключи. keysWithNoValues.put("KeyA", null); // .
Конкурентное программирование
В асинхронном программировании используется Future , важной является сама подготовка к выполнению задачи, а не возвращаемый результат.
Скопировать код
Future future = executor.submit(() -> < // Выполнение задачи занимает длительное время return null; >);
Визуализация
Void можно интерпретировать как пустую коробку, которую можно передать в функцию.
Скопировать код
Void emptyBox = null; // Пустая коробка
Она может быть тихой посылкой:
Скопировать код
Function doNothingFunc = (Void v) -> < // Принимаем пустую коробку, возвращаем пустую return v; >;
Использование Void для выполнения задачи, не возвращающей значение:
Скопировать код
Callable silentTask = () -> < // Действие выполняется, результат не возвращается return null; // Возвращается пустая коробка >;
Продвинутые сценарии использования Void
Вспомогательные классы, не предназначенные для создания экземпляров
Void может служить индикатором того, что классы, такие как System и Math , не предназначены для создания экземпляров.
Указание null в интерфейсах безопасности
Используя системные интерфейсы безопасности, такие как java.security.PrivilegedAction , Void может обозначать действие, не возвращающее значение.
Обобщенные типы и типобезопасность
Void используется в обобщенных типах в качестве заполнителя типа, когда возвращать данные не требуется. Это способствует поддержанию типовой безопасности.
Полезные материалы
- Void (Java Platform SE 8) – официальная документация
- Джошуа Блох, «Эффективное использование Java», 3-е издание
- Ссылки на методы (Учебные руководства по Java™)
- Использование рефлексии и Void.TYPE
- Обобщенные типы в Java и заполнители типов
Что такое void в Java?
Ключевое слово void используется в объявлении методов для указания, что метод не возвращает никакого значения. Это означает, что метод выполняет определенные действия, но не возвращает результат, который можно было бы использовать в дальнейшем в программе.
Примеры:
- Когда метод не возвращает значения, его объявление начинается с ключевого слова void :
public void myVoidMethod() < // код метода >
- Поскольку метод с void не возвращает значение, при вызове его результат не используется:
MyClass obj = new MyClass(); obj.myVoidMethod(); // Вызов метода без использования возвращаемого значения
- void может использоваться как возвращаемый тип для методов, также как и в объявлениях переменных:
public void doSomething() < // код метода >public void anotherMethod() < // код метода >public static void main(String[] args) < // Создание объекта и вызов методов MyClass obj = new MyClass(); obj.doSomething(); obj.anotherMethod(); >