Метод с параметрами java
Методы в Java описание и использование
Методы Java – это место, где вы помещаете операции с данными (переменными) в свой код. Другими словами, вы группируете операции (код) внутри них. Методы должны находиться внутри класса Java.
Похожи на то, что называется функциями или процедурами в других языках программирования (например, Pascal или JavaScript). Метод – это группа операторов, которые выполняют некоторую операцию с некоторыми данными и могут возвращать или не возвращать результат.
Вот простой пример:
В приведенном выше примере определяется метод с именем writeText внутри класса с именем MyClass. Метод принимает один параметр с именем text, который используется в операторе внутри метода, и не возвращает никакого значения.
Параметры метода
Параметры метода позволяют передавать значения в метод, с которым он может работать. Объявляются в скобках после имени метода:
Метод writeText в приведенном выше примере принимает два параметра: text1 и text2. Они имеют тип String, как написано перед каждым именем параметра.
Вы можете использовать любой примитивный тип данных или встроенный класс в качестве типа данных для параметров, в том числе свои собственные классы.
Параметры против переменных
Параметр метода похож на переменную. Вы можете прочитать его значение, а также изменить:
Предупреждение: хотя можно изменить значение параметров, вы должны быть осторожны, так как это может привести к путанице в коде. Если вы думаете, что справитесь с этим, продолжайте. Если нет, создайте локальную переменную для хранения значения и оставьте значение параметра без изменений.
Вызов метода writeText() выглядит следующим образом:
Обратите внимание, как параметры метода записываются в скобках после имени метода. Когда приведенный выше код выполняется, метод writeText() будет выполнен, а параметры содержать значения «Hello» и «World».
Конечные параметры
Параметр метода может быть объявлен как final, как переменная. Значение окончательного параметра не может быть изменено. То есть, если параметр является ссылкой на объект, ссылка не может быть изменена, но значения внутри объекта все еще могут быть изменены. Вот пример:
В этом примере метода вы не можете переназначить параметры text1 и text2 на любые другие строки, кроме тех, которые были переданы в качестве параметров при вызове.
Локальные
Вы можете внутри метода объявить локальные переменные. Они могут использоваться точно так же, как любая другая переменная, но доступна только внутри области действия метода. Вот пример:
Локальные переменные также могут быть объявлены как окончательные. Если вы объявите их как final, значение не может быть изменено. Если переменная является ссылкой на объект, то ее нельзя изменить, но значения внутри ссылочного объекта все еще можно изменить.
Тип возврата метода
Метод может вернуть значение:
Этот метод добавляет два переданных ему параметра и возвращает результат.
Вы можете вернуть любой примитивный тип или любой объект из метода. Вы также можете вернуть строку, например так:
Этот метод объединяет две строки, переданные в качестве параметров, и возвращает результат.
Возвращаемые
Допустимо иметь более одного оператора возврата в методе. Тем не менее, они не могут быть выполнены оба. После выполнения оператора return больше не выполняется код в этом методе. Программа просто возвращается к коду, который вызвал его.
Вот пример с несколькими операторами возврата:
Обратите внимание на оператор if внутри метода. Он проверяет, является ли логический параметр reverseOrder истинным или ложным.
Если параметр reverseOrder имеет значение true, то метод возвращает две строки, переданные как параметры, объединенные в обратном порядке (сначала строка2, затем строка1).
Если параметр reverseOrder имеет значение false, то метод пропускает тело оператора if. Затем он продолжается до второго оператора возврата, который возвращает два параметра, соединенных в обычном порядке (строка1, затем строка2).
Модификаторы доступа к методам
Возможно, вы заметили слово public, которое помещено перед всеми примерами объявления методов в этом тексте. Это слово является модификатором доступа для метода. Он определяет, какой код может вызывать этот метод.
Объявления об исключениях
Если внутри метода возникает ошибка, метод может вызвать исключение. Исключения должны быть объявлены в объявлении метода следующим образом(выделено жирным шрифтом):
Этот метод сначала проверяет, является ли один из двух параметров string1 или string2 нулевым. Если они есть, исключение выдается. Когда генерируется исключение, метод также прекращает выполнение. Но вместо возврата туда, откуда был вызван, выполнение возобновляется внутри первого предложения catch() <>, окружающего метод, нацеленного на это исключение.
Методы вызова
Вызов методов в нескольких местах:
Обратите внимание, как метод callSum() создает переменную с именем theSum и присваивает ей значение, возвращаемое вызовом метода add(1, 3). После этого он печатает значение.
Методы могут использоваться для разбиения кода на более мелкие, более понятные и повторно используемые сегменты кода, вместо того, чтобы писать свою программу как один большой метод.
Методы
Общая форма объявления метода выглядит следующим образом:
Метод может не иметь параметров, в этом случае используются пустые скобки. Модификатор определяет видимость метода (public, private). Если модификатор не указан, то считается, что метод имеет модификатор private в пределах своего пакета.
Методы могут вызывать другие методы.
Каждый метод начинается со строки объявления внутри круглых скобок, которую называют сигнатурой метода:
Если рассмотреть данный метод, то можно сказать следующее. Ключевое слово public означает, что метод доступен для любого класса. Ключевое слово static означает, что нам не нужно создавать экземпляр (копию) объекта Cat в памяти. Ключевое слово void означает, что метод не возвращает никаких данных. Именем метода является слово перед круглыми скобками.
Вспомним наш класс Box, в котором определены высота, ширина и глубина ящика. Зная эти величины, мы вычисляли объём коробки самостоятельно. Но мы можем расширить возможности класса, чтобы он сам мог вычислить объём внутри класса и предоставить нам готовые данные. Давайте добавим в класс новый метод:
Теперь пробуем вычислить объём коробки с помощью готового метода, который есть в классе:
Мы уже не вычисляем объём вручную, за нас это сделает класс Box, у которого есть готовый метод для вычисления объёмов.
Обращение к методу осуществляется как и к переменной через точку. Наличие круглых скобок позволяет различать метод от имени переменной. То есть, если вы увидите запись:
Использование параметров
Параметры позволяют работать с различными данными. Допустим, мы хотим вычислить площадь прямоугольника со сторонами 3 и 5 см.
Метод работает, но область его применения слишком ограничена. Мы сможем вычислять площадь только одного прямоугольника с жёстко заданными размерами. Но прямоугольники бывают разными и нам нужен универсальный метод. Добиться решения задачи можно с помощью параметров. Перепишем метод следующим образом:
Теперь мы можем вычислять площадь любого прямоугольника, зная его размеры. Возьмём тот же прямоугольник со сторонами 3 и 5 см и вычислим его площадь:
В правильно написанных классах стараются избегать доступа к переменным класса напрямую. Следует использовать методы, которые позволяют избежать ошибок. В нашем классе Box использовались отдельные переменные width, height, depth. Код с использованием этих переменных слишком громоздкий, кроме того вы можете забыть про какую-нибудь переменную. Добавим в класс новый метод, который упростит наш код для вычисления объёма ящика:
Пробуем класс в действии:
Теперь мы не обращаемся к отдельным переменным класса, а вызываем метод setDim() для установки размеров ящика, после чего можно вызвать метод getVolume() для вычисления объёма. Естественно, вы можете реализовать свою логику в классе. Например, вы можете создать метод getVolume() с параметрами, которые отвечают за размеры ящика и возвращать сразу готовый результат.
Перегрузка методов
Java, как и многие языки программирования, разрешает создавать внутри одно класса несколько методов с одним именем. Главное, чтобы у них различались параметры. Параметры могут различаться типами или количеством аргументов. Будьте внимательны, если вы зададите различные типы для возвращаемого значения, то этого будет недостаточно для создания перегруженной версии метода. Когда Java встречает вызов перегруженного метода, то выбирает ту версию, параметры которой соответствуют аргументам, использованным в вызове.
Создадим класс Cat с набором перегруженных методов:
Вы можете вызвать любой метод из класса:
Если присмотреться, то можно догадаться, какая именно версия метода вызывается в каждом конкретном случае.
Аналогично, перегрузка используется и для конструкторов.
Методы с переменным числом параметров
Можно создавать методы с переменным числом параметров. В этом случае используется многоточие.
По сути, создаётся массив типа Object[].
Создадим метод, вычисляющий и возвращающий максимальное из произвольного количества значений.
До Java 5 использовался следующий способ.
Подобный код может встречаться в старых проектах, но в Android практически не используется.
Метод toString()
Каждый класс реализует метод toString(), так как он определён в классе Object. Но использовать метод по умолчанию не слишком удобно, так как не содержит полезной информации. Разработчики предпочитают переопределять данный метод под свои нужды. Сам метод имеет форму:
Вам остаётся возвратить объект класса String, который будет содержать полезную информацию о вашем классе. Давайте возьмём для примера класс Box, созданный выше:
Теперь можете узнать о классе Box:
Метод очень часто используется при создании собственных классов и вам тоже придётся прибегать к этому способу.
Как вернуть из метода больше одного значения?
Методы в Java возвращают одно значение. А если хочется сразу вернуть сразу два и более значений? Например, у нас имеется массив чисел и мы хотим написать метод, который сразу возвращает минимальное и максимальное значение из него.
Одно из решений заключается в том, что нужно «запаковать» два значения полученные в одном методе с помощью конструктора специального класса, а затем «распаковать» их в другом методе, при обращении к конструктору.
Методы
Содержание
Метод в Java — это комплекс выражений, совокупность которых позволяет выполнить определенную операцию. Так, например, при вызове метода System.out.println(), система выполняет ряд команд для выведения сообщения на консоль.
На данном этапе вы освоите технику создания собственных методов с либо без возвращаемых значений, вызова методов с указанием либо без указания параметров, и выделения методов при разработке программы.
Создание метода
Ниже рассмотрен пример, иллюстрирующий синтаксис метода, как в Java создать метод.
Синтаксис
Определение метода представлено заголовком и телом метода. То же самое мы можем наблюдать в следующем синтаксисе создания метода.
Синтаксис
Приведенный выше синтаксис включает:
Пример
Далее представлен исходный код рассмотренного выше метода, именуемого max(). Данный метод использует два параметра num1 и num2 и возвращает больший из двух.
Вызов метода
Перед использованием метода его необходимо вызвать. Существует два способа для вызова метода в Java, т.е. метод производит возврат значения либо не производит (отсутствует возвращающее значение).
Алгоритм вызова метода достаточно прост. Когда программа производит в Java вызов метода, программное управление передается вызванному методу. Данный вызванный метод затем возвращает управление вызывающему клиенту в двух случаях, если:
Метод возврата типа void производит вызов команды. Рассмотрим пример:
Метод возврата значения может быть проиллюстрирован следующим примером:
Пример ниже демонстрирует способ определения и вызова метода в Java.
Пример
В итоге будет получен следующий результат:
Ключевое слово void
Ключевое слово void в Java позволяет нам создать методы, не производящие возврат значения. В примере, расположенном далее, нами был рассмотрен метод типа void – methodRankPoints. Методы типа void в Java не производят возврат каких-либо значений. Вызов метода типа void выполняется командой, т.е. methodRankPoints(255.7);. Это java-выражение, которое оканчивается точкой с запятой, как показано в примере ниже:
Пример
В итоге будет получен следующий результат:
Передача параметров по значению в Java
При выполнении вызывающего процесса производится в Java передача аргументов. Процедура должна осуществляться согласно порядку, предусмотренному соответствующими параметрами в спецификации метода. Передача параметров может производиться по значению либо по ссылке.
В Java передача параметров по значению обозначает вызов метода с параметром. За счет этого производится передача значения аргумента параметру.
Пример
Следующая программа демонстрирует пример передачи параметра по значению. Значения аргументов остаются неизменными даже после вызова метода.
Получим следующий результат:
Перегрузка методов
Перегрузка методов в Java — случай, когда в классе присутствуют два и более метода с одинаковым именем, но различными параметрами. Данный процесс отличен от переопределения методов. При переопределении методов, метод характеризуется аналогичным именем, типом, числом параметров и т.д.
Рассмотрим пример, который был представлен выше при определении минимальных чисел целочисленного типа. Так допустим, мы хотим определить минимальное число двойного типа. В данном случае будет представлена концепция перегрузки для создания двух и более методов с одинаковым именем, но различными параметрами.
Рассмотренный пример поясняет вышесказанное.
Пример
В итоге будет получен следующий результат:
Методы перегрузки делают программу читаемой. Таким образом, представлены два метода с одинаковым именем, но различными параметрами. В результате чего мы получили минимальные int число и число double типа.
Использование аргументов командной строки
В ходе работы программы вам может понадобиться произвести передачу определенной информации. Это может быть сделано в Java за счет передачи аргументов командной строки в main().
В Java аргумент командной строки представляет информацию, которая напрямую следует за именем программы в командной строке при ее выполнении. Получение доступа к аргументам командной строки в java-программе не представляет сложности. Они хранятся в виде строки в массиве строк, переданном в main().
Пример
Программа ниже отображает все вызванные аргументы командной строки.
Попробуйте выполнить данную программу, как показано далее:
В итоге будет получен следующий результат:
Конструктор в Java
В Java конструктор инициализирует объект при его создании. Его имя аналогично имени класса, а синтаксис сходен с синтаксисом метода. Однако, в отличие от последнего, в конструкторе отсутствует возвращаемое значение.
Как правило, конструктор в Java может использоваться для присвоения исходного значения переменных экземпляра, определяемых классом, либо для выполнения каких-либо иных процедур запуска, необходимых для создания полностью сформированного объекта.
Конструкторы присутствуют во всех классах, независимо от их указания, в виду того, что Java автоматически предоставляет конструктор по умолчанию, который инициализирует все переменные членов класса до нуля. Вместе с этим, после того как вы определите собственный конструктор, конструктор по умолчанию больше не будет задействован.
Пример
В примере ниже рассмотрено использование конструктора класса без параметров.
Для инициализации объектов вам необходимо выполнить вызов конструктора согласно следующему примеру.
Параметризованный конструктор
Чаще всего вам может понадобиться конструктор, который принимает один и более параметров. Добавление параметров к конструктору аналогично их добавлению в метод, следует только внести их в круглые скобки после имени конструктора.
Пример
Далее рассмотрен простой пример использования конструктора с параметром.
С целью инициализации объектов вам понадобится вызвать конструктор согласно следующему примеру.
Получим следующий результат:
Ключевое слово this
Ключевое слово this — используется для ссылки на текущий класс с учетом метода или конструктора экземпляра. Используя this в Java, Вы можете ссылаться на экземпляры класса, такие как конструкторы, переменные и методы.
Примечание: ключевое слово this используется только в составе методов либо конструкторов экземпляра.
Как правило, ключевое слово this в Java используется для:
Пример
Далее представлен пример, в котором ключевое слово this используется для доступа к экземплярам класса. Необходимо копировать и вставить данную программу в файл с названием This_Example.java.
В итоге будет получен следующий результат:
Аргументы переменной (var-args)
JDK 1.5 и выше позволяет передавать методу переменное количество аргументов одного типа. Параметр в методе объявляется следующим образом:
При объявлении метода Вы указываете тип, за которым следует многоточие (. ). В методе может быть указан только один параметр переменной длины, и этот параметр должен быть последним параметром. Любые регулярные параметры должны предшествовать ему.
Пример
В итоге будет получен следующий результат:
Метод finalize()
Метод finalize() — метод, который будет вызываться непосредственно перед окончательным уничтожением объекта сборщиком мусора. (финализатором). В Java finalize() может быть использован для обеспечения чистого завершения объекта.
К примеру, мы можете использовать finalize() чтобы удостовериться в том, что открытый файл, принадлежащий данному объекту, был закрыт.
Для добавления финализатора в класс, вам просто следует определить метод finalize() в Java. Среда выполнения Java производит вызов данного метода непосредственно перед обработкой объекта данного класса.
В составе метода finalize(), вы указываете те действия, которые должны быть выполнены перед уничтожением объекта.
В общем виде метод finalize() выглядит следующим образом:
Здесь ключевое слово protected представляет спецификатор, предотвращающий доступ к finalize() посредством кода, определяемого вне его класса.
Это свидетельствует о том, что вы не можете знать как или даже когда будет производиться выполнение finalize(). К примеру, если ваша программа будет окончена до «сборки мусора», finalize() не будет выполняться.
Метод с параметрами java
Лямбды как параметры методов
Одним из преимуществ лямбд в java является то, что их можно передавать в качестве параметров в методы. Рассмотрим пример:
То есть в данном случае все числа должны быть четными или остаток от их деления на 2 должен быть равен 0. Затем это лямбда-выражение передается в вызов метода sum.
При этом можно не определять переменную интерфейса, а сразу передать в метод лямбда-выражение:
Ссылки на метод как параметры методов
Начиная с JDK 8 в Java можно в качестве параметра в метод передавать ссылку на другой метод. В принципе данный способ аналогичен передаче в метод лямбда-выражения.
Ссылка на метод передается в виде имя_класса::имя_статического_метода (если метод статический) или объект_класса::имя_метода (если метод нестатический). Рассмотрим на примере:
Здесь также определен функциональный интерфейс Expression, который имеет один метод. Кроме того, определен класс ExpressionHelper, который содержит два статических метода. В принципе их можно было определить и в основном классе программы, но я вынес их в отдельный класс.
При втором вызове метода sum отдельно создается объект Expression, который затем передается в метод:
Использование ссылок на методы в качестве параметров аналогично использованию лямбда-выражений.
Если нам надо вызвать нестатические методы, то в ссылке вместо имени класса применяется имя объекта этого класса:
Ссылки на конструкторы
При использовании конструкторов методы функциональных интерфейсов должны принимать тот же список параметров, что и конструкторы класса, и должны возвращать объект данного класса.
Лямбды как результат методов
Также метод в Java может возвращать лямбда-выражение. Рассмотрим следующий пример:
В данном случае определен функциональный интерфейс Operation, в котором метод execute принимает два значения типа int и возвращает значение типа int.
Метод action принимает в качестве параметра число и в зависимости от его значения возвращает то или иное лямбда-выражение. Оно может представлять либо сложение, либо вычитание, либо умножение, либо просто возвращает 0. Стоит учитывать, что формально возвращаемым типом метода action является интерфейс Operation, а возвращаемое лямбда-выражение должно соответствовать этому интерфейсу.
Либо можно сразу получить и тут же выполнить лямбда-выражение:
Java Challengers #1: Перегрузка методов в JVM
У нас уже запустился очередной поток курса «Разработчик Java», но у нас ещё осталось немного материалов, которыми бы хотели с вами поделиться.
Добро пожаловать в серию статей Java Challengers! Этот серия статей посвящена особенностям программирования на Java. Их освоение — это ваш путь к становлению высококвалифицированным программистом на Java.
Освоение техник, рассматриваемых в этой серии статей требует некоторых усилий, но они будут иметь большое значение в вашем повседневном опыте в качестве java — разработчика. Избежать ошибок проще когда вы знаете как правильно применять основные техники программирования Java и отслеживать ошибки намного проще, когда вы точно знаете, что происходит в вашем java — коде.
Готовы ли вы приступить к освоению основных концепций программирования на Java? Тогда давайте начнем с нашей первой задачки!
Термин «Перегрузка методов»
Про термин перегрузка разработчики склонны думать, что речь идет о перезагрузке системы, но это не так. В программировании, перегрузка метода означает использование одинакового имени метода с разными параметрами.
Что такое перегрузка методов?
Перегрузка методов — это приём программирования, который позволяет разработчику в одном классе для методов с разными параметрами использовать одно и то же имя. В этом случае мы говорим, что метод перегружен.
В Листинге 1 показаны методы с разными параметрами, которые различаются количеством, типом и порядком.
Листинг 1. Три варианта перегрузки методов.
Перегрузка методов и примитивные типы
Таблица 1. Примитивные типы в Java
Зачем мне использовать перегрузку методов?
Использование перегрузки делает ваш код чище и проще для чтения, а также помогает избежать ошибок в программе.
Чем перегрузка не является
Помните, что изменение имени переменной не является перегрузкой. Следующий код не скомпилируется:
Вы также не можете перегрузить метод, изменяя возвращаемое значение в сигнатуре метода. Этот код также не скомпилируется:
Перегрузка конструктора
Вы можете перегрузить конструктор таким же способом, как и метод:
Решите задачку по перегрузке методов
Готовы ли вы к первому испытанию? Давайте выясним!
Начните с внимательного изучения следующего кода.
Листинг 2. Сложная задача по перегрузке методов
Хорошо. Вы изучили код. Какой будет вывод?
Правильный ответ приведён в конце статьи.
Что сейчас произошло? Как JVM компилирует перегруженные методы
Для того чтобы понять что произошло в Листинге 2, вам нужно знать несколько вещей о том, как JVM компилирует перегруженные методы.
Прежде всего, JVM разумно ленива: она всегда будет прилагать наименьшие усилия для выполнения метода. Таким образом, когда вы думаете о том, как JVM обрабатывает перегрузку, имейте в виду три важных особенности компилятора:
Если вы никогда не сталкивались с этими техниками, то несколько примеров должны вам помочь их понять. Обратите внимание, что JVM выполняет их в том порядке, в котором они указаны.
Вот пример расширения:
Это порядок расширения примитивных типов:
(Прим. переводчика — В JLS расширение примитивов описано с большими вариациями, например, long может быть расширен во float или в double.)
Обратите внимание, что происходит за кулисами при компиляции кода:
А вот пример распаковки:
Вот что происходит за кулисами при компиляции этого кода:
И вот пример метода с аргументами переменной длины. Обратите внимание, что методы переменной длины всегда являются последними для выполнения.
Что такое аргументы переменной длины?
Аргументы переменной длины — это просто массив значений, заданный трёмя точками (. ). Мы можем передать сколько угодно чисел int этому методу.
Аргументы переменной длины (varargs) очень удобны тем, что значения могут передаваться непосредственно в метод. Если бы мы использовали массивы, нам пришлось бы создать экземпляр массива со значениями.
Расширение: практический пример
Аналогично, если мы передаём число 1.0 JVM автоматически распознает, что это double.
Распространенные ошибки с перегрузкой
К настоящему времени вы, вероятно, поняли, что с перегрузкой методов всё может быть запутано, поэтому давайте рассмотрим несколько проблем, с которыми вы, вероятно, столкнетесь.
Автоупаковка с обёртками (autoboxing with wrappers)
Java — это строго типизированный язык программирования и, когда мы используем автоупаковку с обёртками, есть несколько вещей, которые мы должны учитывать. Во-первых, следующий код не компилируется:
Автоупаковка будет работать только с типом double потому что, когда вы скомпилируете код, он будет эквивалентен этому:
Литералы чисел в коде
Как любопытный факт. Знаете ли вы, что тип char принимает числа?
Что необходимо помнить о перегрузке
Перегрузка — это очень мощная техника для случаев, когда вам нужно одинаковое имя метода с разными параметрами. Это полезная техника, потому что использование правильных имён делает код более удобным для чтения. Вместо того, чтобы дублировать имя метода и добавлять беспорядок в ваш код, вы можете просто перегрузить его.
Это позволяет сохранять код чистым и удобным для чтения, а также снижает риск того, что дублирующие методы сломают часть системы.
Что следует иметь в виду: при перегрузке метода JVM сделает наименьшее усилие из возможных.
Вот порядок самого ленивого пути к исполнению:
На этом мы закончим о роли JVM в перегрузке методов. Важно понимать, что JVM по своей сути ленива, и всегда будет следовать по самому ленивому пути.
Ответ
Ответ к Листингу 2 — Вариант 3. efce.
Подробнее о перегрузке методов в Java
Введение в классы и объекты для абсолютных новичков, включая небольшие разделы о методах и перегрузке методов.
Узнайте больше о том, почему важно, что Java является строго типизированным языком и изучите примитивные типы Java.
Изучите ограничения и недостатки перегрузки методов, а также способы их устранения путем использования пользовательских типов и объектов параметров.


