Передать методу переменную 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() :

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

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

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

Источник

Как передать в метод ссылку на переменную

При передачи в метод переменной через аргументы, передается ее значение, то есть создается новый ее экземпляр. Изменение этого экземпляра никак не влияет на переменную, которую передали. Можно ли передать именно ссылку на переменную (чтобы изменение переменной, поступившей через аргументы, влекло за собой изменение переменной, переданной через аргументы) и, если да, то как? Пример:

class Main < int a = 0; public static void main(String args[]) < myMethod(a); >void myMethod(int b) < b++; >> 

5 ответов 5

Оберните ее во что-нибудь, Например:

передаете этот контейнер, function(Container c) и меняете там значение спокойно.

Но вообще это плохая практика. Все должно быть иммутабельно.

Гораздо лучше если вы делаете так:

public int myFunction(int arg) < int result = . //совершаем действия с arg return result; >

@bukashka101 старайтесь держать функции чистыми (без сайд эффектов). Сэкономите себе кучу времени потом в отладке и тестировании.

Можно, к примеру, использовать универсальный дженерик.

class Main < Referencea = new Reference<>(0); public static void main(String args[]) < myMethod(a); >void myMethod(Reference ref) < ref.set(ref.get() + 1); >> public class Reference  < private T referent; public Reference(T initialValue) < referent = initialValue; >public void set(T newVal) < referent = newVal; >public T get() < return referent; >> 

Фактически @Dmitry V. уже писал об этом - не хочу забирать чужую славу и сделал ответ общим. Хотелось бы немного расширить.

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

В Java все аргументы передаются по значению

Что делать в ситуации, аналогичной ситуации в вопросе, когда требуется из метода влиять на глобальные переменные.
Сразу обратим внимание, что оборачивание в контейнеры и дженерики хоть и решают задачу, но реализиют ее излишне сложно и не очевидно при чтении кода третьими лицами, без явной необходимости именно в таком решении от него следует отказаться.

Между тем есть простой "канонический" способ этого действия - возврат значения методом:

class Main < int a = 0; public static void main(String args[]) < a = myMethod(a); >int myMethod(int b) < return b++; >> 

Кроме того, если в душе вы индус, то можно вообще положить на каноны и условности и работать в методе напрямую с глобальной переменной:

помимо попертых "общекультурных" ценностей языка мы так же видим и очевидные недостатки - метод не универсален и работает только с одной глобальной переменной, но таково быть индусом.
Однако стоит заметить, что данный сарказм будет не уместен при использовании глобальной переменной по ее прямому назначению - доступность во всех методах класса. При таком использовании значение глобальной переменной вполне можно менять в методах напрямую, особенно если ее изменение - не цель работы метода и возвращать метод должен другое значение (код в данном вопросе не относится к такому типу использования, поэтому предпочтителен первый вариант).

Источник

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

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

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

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

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

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

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

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

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

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

И наоборот — при изменении х, вы не измените 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 передает все по значению. Для примитивных типов — вы передаете копию текущего значения, для ссылок на объекты — вы передаете копию ссылки (дистанционного управления). Вы никогда не передаете объект. Все объекты хранятся в куче. Всегда. Теперь заварите здоровенную чашку кофе и пишите код! Оригинал статьи.

Источник

Читайте также:  My Page
Оцените статью