Как передать параметр в метод java
Перейти к содержимому

Как передать параметр в метод java

  • автор:

Как передать метод в качестве параметра java

Передать метод в качестве параметра можно разными способами. Рассмотрим некоторые из них.

1) Воспользуемся функциональным интерфейсом Predicate :

import java.util.List; import java.util.function.Predicate; import java.util.stream.Collectors; public class App  public static void main(String[] args)  ListString> list1 = List.of("1", "22", "333", "4444"); ListString> filteredList1 = filterList(list1, x -> x.length() >= 3); System.out.println(filteredList1); // => [333, 4444] ListInteger> list2 = List.of(1, 2, 3, 4); ListInteger> filteredList2 = filterList(list2, x -> x >= 3); System.out.println(filteredList2); // => [3, 4] > public static T> ListT> filterList(ListT> list, PredicateT> rool)  return list.stream() .filter(x -> rool.test(x)) .collect(Collectors.toList()); > > 

2) Воспользуемся готовым функциональным интерфейсом UnaryOperator :

public static void superMethod(UnaryOperatorString> method)  String str = "Hexlet"; String result = method.apply(str); System.out.println(result); > // вызов с передачей методов public class App  public static void main(String[] args) throws Exception  // передадим стандартный метод superMethod(String::toUpperCase); // => HEXLET // передадим лямбда-функцию superMethod(s -> s + "!"); // => hexlet! // передадим собственный метод superMethod(App::reverse); // => telxeh > public static String reverse(String str)  StringBuilder builder = new StringBuilder(); builder.append(str); return builder.reverse().toString(); > > 

3) Создадим собственный интерфейс и передадим объект этого типа в нашу функцию :

interface MyInterface  int count(int a, int b, int c); > public static void superMethodInterface(MyInterface method)  int a = 5, b = 10, c = 20; int result = method.count(a, b, c); System.out.println(result); > // вызов с передачей методов public class App  public static void main(String[] args) throws Exception  MyInterface count = new MyInterface()  @Override public int count(int a, int b, int c)  return a + b + c; > >; superMethodInterface(count); // => 35 superMethodInterface((a,b,c) -> a * b * c); // => 1000 superMethodInterface((a,b,c) -> a + b - c); // => -5 > > 

4) Получим метод с помощью рефлексии и передадим его :

public static void superMethodReflection(Object object, Method method) throws Exception  int a = 10; int b = 20; int result = (int) method.invoke(object, a, b); System.out.println(result); > // вызов с передачей методов public class App  public static void main(String[] args) throws Exception  // передадим стандартный метод Method method = Integer.class.getDeclaredMethod("max", int.class, int.class); superMethodReflection(0, method); // => 20 method = Integer.class.getDeclaredMethod("sum", int.class, int.class); superMethodReflection(0, method); // => 30 // передадим собственный метод method = App.class.getDeclaredMethod("concate", int.class, int.class); superMethodReflection(new App(), method); // => 1020 > public static int concate(int a, int b)  return Integer.parseInt("" + a + b); > > 

Java: передача по значению или по ссылке?

Часто встречается заблуждение о том, что Java использует передачу по ссылке. Возможно, это происходит из-за некоторых особенностей языка, которые могут вводить в заблуждение. Давайте разберемся подробнее.

Передача по значению и передача по ссылке

В программировании существуют два основных способа передачи данных между функциями или методами: передача по значению и передача по ссылке.

Передача по значению означает, что когда мы передаем переменную в функцию, фактически передается копия значения этой переменной. Это означает, что изменения, которые происходят с переменной внутри функции, не влияют на исходное значение.

void updateValue(int value) < value = 50; >public static void main(String[] args) < int value = 30; updateValue(value); System.out.println(value); // Выводит: 30 >

Передача по ссылке, наоборот, означает, что передается ссылка на переменную, а не ее значение. Изменения, которые происходят с переменной внутри функции, влияют на исходное значение.

void updateValue(int[] value) < value[0] = 50; >public static void main(String[] args) < int[] value = ; updateValue(value); System.out.println(value[0]); // Выводит: 50 >

Java и передача параметров

Теперь, когда мы разобрались с основами, давайте обратимся к Java. Несмотря на то, что при работе с объектами в Java используются ссылки, сам язык все равно использует передачу по значению.

Когда мы передаем объект в метод, Java передает значение ссылки на этот объект, а не саму ссылку. Это означает, что метод работает с копией ссылки, а не с оригинальной ссылкой. Изменения, которые происходят с объектом, влияют на исходный объект, потому что копия ссылки все равно указывает на тот же объект. Однако если мы попытаемся изменить саму ссылку (например, присвоить ей новый объект), эти изменения не будут видны за пределами метода.

void updateObject(Foo foo) < foo.setValue(50); foo = new Foo(100); >public static void main(String[] args) < Foo foo = new Foo(30); updateObject(foo); System.out.println(foo.getValue()); // Выводит: 50 >

Таким образом, можно сказать, что Java использует «передачу по значению ссылки», что в некотором смысле является комбинацией передачи по значению и передачи по ссылке.

Передача параметров в Java

Java-университет

Переменная в Java — это контейнер, со значением в нем. Так что значит «передать» переменную? И какова разница между примитивными и ссылочными типами данных.

Передача параметров в Java - 1

Мы доберемся до этого позже. Давайте сначала начнем с простого присваивания. Что делает данный код:

 int х = 3; int у = х; 

В строке 1 создается переменная x типа int и ей присваивается значение 3. В строке 2, создается переменная y типа int и ей присвается значение переменной x. В дальнейшем переменная x никак не влияет на y. Java копирует значение х (3) и помещает эту копию в у. Это передача параметра по значению. Вы не записываете одну переменную в другую. Значение копируется и присваивается новой переменной. Выражение у = х; НЕ означает «записать x в y«. Оно означает «скопировать значение внутри х и записать эту копию в у«. Если позже я изменю y:

 у = 34; 

Повлияет ли это на x? Конечно нет. x по прежнему имеет значение 3. Если позже я изменю х:

 х = 90; 

Как это отразится на y? Никак. Они никак не связаны после того, как было сделано присвоение (КОПИРОВАНИЕ значения). А что насчет ссылочных типов? Как они работают? Не так уж сложно, на самом деле это правило то же самое. Ссылки делают тоже самое — вы получаете копию ссылки. Так что, если я говорю:

 Cat A = new Cat (); Cat B = A; 

Ссылка А копируется в ссылку B. К объекту это не относится — у вас по прежнему всего один объект. Но теперь у вас есть две различных ссылки, контролирующие один и тот же объект Cat. Теперь давайте рассмотрим передачу параметров в методы. Java передает параметры по значению. Всегда. Это означает — «скопировать значение и передать копию.» Для примитивных типов это легко:

 int х = 5; doStuff (х); / / Передать копию х (значение 5) в метод doStuff 

Метод doStuff выглядит следующим образом:

 void doStuff (int у) < / / Действия с 'y' >

Копия значения x, тоесть 5, передается в метод doStuff (). Метод doStuff () имеет свою собственную переменную, которая называется y. Переменная y — новая, другая переменная. С копией того, что было в х на момент передачи его в метод. С этого момента, у и х не влияют друг на друга. При изменении у, вы не затрагиваете х.

 void doStuff (int у) < у = 27; / / Это не влияет на 'х' >

И наоборот — при изменении х, вы не измените y. Единственное что сделал x в этом деле это скопировал свое значение и передал его в метод doStuff(). Как «передача по значению» работает со ссылками? Слишком многие люди говорят, «Java передает примитивные типы по значению, а объекты по ссылке». Это не так как говорят. Java передает все по значению. С примитивами, вы получаете копию содержимого. Со ссылками вы тоже получаете копию содержимого. Но что такое содержимое ссылки? Пульт дистанционного управления. Средства для управления / доступа к объекту. Когда вы передаете ссылку на объект в метод, вы передаете копию ссылки. Клон пульта дистанционного управления. Объект все еще сидит в куче где был создан, ожидая кого-то, чтобы использовали пульт. Объект не волнует сколько пультов «запрограммированы» чтобы контролировать его. Это волнует только сборщика мусора и вас, программиста. Поэтому, когда вы говорите:

 Cat A = new Cat (); doStuff (А); void doStuff (Cat B) < / / Использование B >

Существует только один объект Cat. Но теперь два пульта управления (ссылки) могут получить доступ к одному и тому же объекту Cat. Так что теперь все, что B делает объекту Cat, повлияет на Cat, на который указывает A, но это не повлияет на содержимое A! Вы можете изменить Cat, используя новую ссылку B (скопированную непосредственно с А), но вы не можете изменить А. Какого черта это значит? Вы можете изменить объект, на который ссылается А, но вы не можете взять и изменить ссылку А — переадресовать её на другой объект или null. Так что если вы измените ссылку B (не сам объект Cat на который ссылается B, а само значение ссылки) вы не измените значение А. И наоборот. Так что:

 Cat A = new Cat (); doStuff (А); void doStuff (Cat B) < B = new Cat (); / / Не повлияет на ссылку A >

Это просто значит, что B указывает на другой объект. A по-прежнему счастлива. Так что повторяйте за мной: Java передает все по значению. (Хорошо, еще раз. с чувством.) Java передает все по значению. Для примитивных типов — вы передаете копию текущего значения, для ссылок на объекты — вы передаете копию ссылки (дистанционного управления). Вы никогда не передаете объект. Все объекты хранятся в куче. Всегда. Теперь заварите здоровенную чашку кофе и пишите код! Оригинал статьи.

Java. Методы. Передача параметров в методах (функциях) класса. Передача переменных простых типов и объектов в метод в качестве параметра

Методы. Передача параметров в методах (функциях) класса. Передача переменных примитивных типов и объектов в метод в качестве параметра

Поиск на других ресурсах:

1. Какие существуют способы передачи аргументов методу (функции)?

В Java существует 2 способа для передачи переменной или объекта класса в функцию:

  • передача по значению. В этом случае значение аргумента копируется в формальный параметр функции. Поскольку создается копия аргумента в функции, то все изменения над копией не повлияют на значение аргумента;
  • передача по ссылке (по адресу). В этом случае параметру передается ссылка на аргумент, который используется при вызове. По этой ссылке есть доступ к аргументу. Таким образом, все изменения, сделанные в теле функции над значением параметра, будут изменять значение аргумента который был передан в функцию.
2. Какие особенности передачи аргумента примитивного типа ?

Если методу передается аргумент примитивного типа, то происходит передача по значению. То есть, делается копия аргумента.

3. Каким образом в метод передается объект некоторого класса?

В отличие от переменных примитивных типов, объекты класса передаются по ссылке. Это значит, что изменения, сделанные в теле функции (методе) будут изменять также значения объекта, который задавался в качестве аргумента.

4. Примеры передачи переменных примитивных типов в методы (функции)

Пример 1. Реализация метода Max() , получающего два параметра примитивного типа.

static int Max(int a, int b) < if (a>b) return a;  else return b; >

Демонстрация использования метода в другом методе:

public static void main(String[] args) <  int t, x, y; x = 133; y = 68; t = Max(x, y); // t = 133 System.out.println("Max color: #0000ff;">Inc(), увеличивающего (уменьшающего) значение целочисленной величины value на значение входного аргумента step. В теле метода изменяется значение параметра value. Однако, после завершения метода значение аргумента x в функции main() остается без изменений. Это значит, что состоялась передача параметра по значению.

Реализация метода имеет следующий вид:

static int Inc(int value, int step) < value += step; return value; >

Демонстрация использования метода Inc() в методе main() :

  • внутренняя переменная month;
  • три конструктора;
  • три метода доступа.

будет существовать ссылка на память, выделенную динамично внутри метода Method() . Таким образом, для переменной-объекта varObj не нужно выделять память в вызывающем коде.

Пример. Пусть задан класс MyDay , реализующий день недели.

Связанные темы

  • Типы данных Java
  • Применение классов в программах на Java. Определение класса и объекта класса. Примеры

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *