Как передать аргументы в main java
Передать аргументы можно в командной строке, указав их справа через пробел после имени программы.
Передаваемые аргументы можно получить в методе main через строковый массив args :
public class App public static void main(String[] args) for(int i = 0; i args.length; i++) System.out.println("Аргумент №" + (i+1) + "- " + args[i]); > > >
Запустим приложение в командной строке, справа через пробел указав передаваемые аргументы :
>java App.java Вася Петя Аргумент №1 - Вася Аргумент №2 - Петя >
Передача параметров в Java

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

Мы доберемся до этого позже. Давайте сначала начнем с простого присваивания. Что делает данный код:
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
Возможно я что — то не так понимаю. Но по моей логике переменная переданная в метод и дальнейшие модификации с ней должны остаться в это методе, и исчезнуть вместе с методом. Но в итоге я вижу в main измененный массив mas. Почему так происходит. Потому что в таком случае пропадает надобность в return. В Java давно, а тут такое. Видать что — то серьезное я забыл.
testA 100 testA 100 testA 100 testA 4 testA 5 test 100 test 100 test 100 test 4 test 5 Main 100 Main 100 Main 100 Main 4 Main 5
Отслеживать
51.6k 201 201 золотой знак 63 63 серебряных знака 245 245 бронзовых знаков
задан 12 янв 2018 в 13:07
user239760 user239760
В Java параметры в методы передаются по значениям и не меняются, но вот содержимое меняться может. Таким образом ссылка на сам массив (или даже на объект) измениться не может, а элементы массива (или значения полей объекта) — пожалуйста 🙂
12 янв 2018 в 13:09
Посмотрите главу «Подробное рассмотрение особенностей передачи аргументов» в полном руководстве по Java авторства Герберта Шилдта.
12 янв 2018 в 13:41
@post_zeew, У вас в доме кран протекает. Что делать? Идти в библиотеку, брать книгу и сидеть читать, как стать слесарем или позвонить сантехникам и ждать минут 30. Пока всех соседей не затопит. Было бы правильнее вам в начале помочь решить проблему, а после уже давать советы по книгам. Но в общем спасибо за книгу. А то ведь так любой может зайти в SO и писать в комментах. Чувак иди в Google там все есть
– user239760
12 янв 2018 в 13:58
Я ссылаюсь на конкретную главу книги, там даже не глава, а несколько абзацев. Книга в свободном доступе в электронном виде. В данном случае я указал именно на главу книги, так как в интернете на эту тему очень много принципиально неверной информации. В книге же все подробно расписано. И к слову: проблема большинства начинающих программистов заключается в том, что они не читают книги, в которых описываются фундаментальные вещи и не зная самых азов начинают писать что-то относительно сложное.
12 янв 2018 в 14:14
@post_zeew, или же они просто забывают что — то.
– user239760
12 янв 2018 в 15:30
2 ответа 2
Сортировка: Сброс на вариант по умолчанию
@AlexChermenin замудрено объяснили. Объекты передаются по ссылке, примитивы по значению. Массивы примитивов — это объекты, поэтому передаются также по ссылке.
Обновлено: под передачей по ссылке я имею ввиду, что объект таки передается по значению. Но в значении содержится ссылка на объект, а не копия объекта.
int number = 0; void update(int num) < num++; System.out.println(num); // 1 >update(number); System.out.println(number); // 0
int[] numbers = new int[]; void update(int[] nums) < for(int i=0; i < nums.length; i++) < nums[i] = 5-i; >> update(numbers); /** * Ага, а тут кстати вызывается toString(), чего нет у примитивов */ System.out.println(numbers); //
Отслеживать
ответ дан 12 янв 2018 в 13:23
18.1k 25 25 серебряных знаков 49 49 бронзовых знаков
Всё передаётся по значению, только для объектов ссылка и есть значение 🙂
12 янв 2018 в 13:25
У массивов тоже есть указатели, так как они выделают место в памяти. Так получается? А не имеет значение что это метод static или обычный ?
– user239760
12 янв 2018 в 13:34
@AlexChermenin под ссылкой вы имете ввиду hashCode?
– user239760
12 янв 2018 в 13:36
Массив — это объект. Изменяя элемент объекта, вы изменяете его по ссылке. Если же вы сделаете так: for(int num : nums) < num = 5; >то ничего не прокатит, потому что вы получите примитивный элемент массива, который получили уже как значение.
12 янв 2018 в 13:37
Не путайте, пожалуйста, людей. В Java все параметры передается по значению.
12 янв 2018 в 13:39
Примитивные типы передаются по значению. Объекты передаются в метод по ссылке. Поэтому все изменения ссылочного объекта влияют на переданный объект. Если переменная примитивный тип, то передается только значение переменной, то есть копия этого значения. И изменения копии никак не влияет на начальное значение.
Представьте себе ссылку, как «пульт управления переменной». Вы передаете в метод только «пульт управления» при передаче по ссылке. При выходе из метода уничтожается только «пульт управления», то есть ссылка. При передаче примитивного типа, происходит передача значения. То есть копируется значение переменной. А при выходе из метода исчезает эта копия. Исчезает значение переменной — копии.
Отслеживать
ответ дан 13 янв 2018 в 6:35
Vyacheslav Mishchenko Vyacheslav Mishchenko
537 1 1 золотой знак 5 5 серебряных знаков 13 13 бронзовых знаков
А как тогда создать клон объекта, чтобы у него был свой указатель, но значения все передались другому объекту. Короче у объекта есть 10 переменных. Чтобы через равно не передавать их все. Можно как — то одной строкой передать их все другому новому объекту? И как сделать это
– user239760
13 янв 2018 в 6:57
1. Переопределение метода clone() и реализация интерфейса Cloneable(); 2. Использование конструктора копирования; 3. Использовать для клонирования механизм сериализации Ссылка >>> habrahabr.ru/post/246993
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 использует «передачу по значению ссылки», что в некотором смысле является комбинацией передачи по значению и передачи по ссылке.