Действительно ли в Java существует только передача по значению?

Java задняя часть
Оригинальная ссылка

(Эта статья не является войной или диссом, просто выражаю собственное понимание, добро пожаловать на просмотр или обсуждение с позитивным настроем)

В Интернете существуют разные мнения о том, является ли Java передачей по значению или по ссылке.

1. Базовые типы или классы-оболочки базовых типов и String передаются по значению, а ссылочные типы передаются по ссылке.
2. В Java передается только значение.

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

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

Прежде чем говорить об этой проблеме, мы сначала разберемся с концепциями и явлениями передачи по значению и передаче по ссылке. Я до сих пор помню, что концепциям передачи по значению и передаче по ссылке меня научил мой учитель, когда я изучал Java в колледже. Учитель объяснил это на примере, наверное, так.

передать по значению

Пример 1:

 1public static void main(String[] args){
2    TestJavaParamPass() tjpp = new TestJavaParamPass();
3    int num = 10;
4    tjpp.change(num);
5    System.out.println("num in main():"+num);
6}
7public void change(int param){
8    param = 20;
9    System.out.println("param in change():"+param);
10}

Вывод консоли:

1param in change():20
2num in main():10

Переменная int num в методе mian() передается в метод change(), а метод change() изменяет значение на 20 после его получения. Судя по выводу консоли, значение переменной num в методе main() не изменилось.

Вывод: базовые типы передаются по значению.

Пройдено по ссылке

Пример 2:

 1public static void main(String[] args){
2    TestJavaParamPass() tjpp = new TestJavaParamPass();
3    User user = new User();
4    user.setName("Jerry");
5    tjpp.change(user);
6    System.out.println("user in mian():"+user);
7}
8public void change(User param){
9    param.setName("Tom");
10    System.out.println("param in change():"+param);
11}

Вывод консоли:

1param in change():User(name=Tom}
2user in mian():User(name=Tom}

Пользовательская переменная в методе main() передается в метод change(), а метод change() изменяет значение своего атрибута name. Глядя на вывод консоли, значение атрибута name пользовательской переменной в методе main() изменилось.

Вывод: ссылочные типы передаются по ссылке.

передача специального значения

Пример 3:

 1public static void main(String[] args){
2    TestJavaParamPass() tjpp = new TestJavaParamPass();
3    String name = "Jerry";
4    tjpp.change(name);
5    System.out.println("name in main():"+name);
6}
7public void change(String param){
8    param = "Tom";
9    System.out.println("param in change():"+param);
10}

Вывод консоли:

1param in change():Tom
2name in mian():Jerry

Строка также является типом данных ссылочного типа, почему значение не изменилось? Потому что в методе change()param = "Tom";эквивалентноparam = new String("Tom");Это эквивалентно переназначению param для указания на другой объект. Поэтому фактически типу String передается ссылка, но она переназначается другому объекту, а исходный объект не модифицируется. То есть String по-прежнему передается по ссылке по сути, а по значению по внешнему виду.

Вывод: базовые типы передаются по значению, ссылочные типы передаются по ссылке, а String — это особая передача по значению.

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

Извлечение концепции

Вместо того, чтобы называть это извлечением концепции, лучше назвать это кратким выводом.

Передать по значению:Когда переменная примитивного типа передается методу, ему передается значение переменной (то есть копирование собственного значения и передача его методу).

Пройти по ссылке:Когда переменная ссылочного типа передается методу, он передает ссылку на переменную (то есть адрес памяти, на который она указывает).

зачем говоритьСтрока является специальной передачей по значению: Это потому, что String и базовые типы показывают одинаковый результат с точки зрения внешнего вида, вероятно, потому, что результат легко запомнить. Но вы должны знать, что String также передается по ссылке, но ее ссылка переназначается, чтобы указывать на другой объект, поэтому это не повлияет на исходное значение. Таким образом, нельзя просто сказать, что String передается по значению.

Разбор оператора Java, который передается только по значению

Только аргумент передачи по значению

В интернете тоже есть поговоркаJava只有值传递. В Интернете есть статьи, демонстрирующие утверждение, что Java передает только по значению, и примеры аналогичны приведенным выше.

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

 1public static void main(String[] args){
2    TestJavaParamPass() tjpp = new TestJavaParamPass();
3    User user = new User();
4    user.setName("Jerry");
5    tjpp.change(user);
6    System.out.println("user in mian():"+user);
7}
8public void change(User param){
9    param = new User()
10    param.setName("Tom");
11    System.out.println("param in change():"+param);
12}

вывод:

1param in change():User(name=Tom}
2user in mian():User(name=Jerry}

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

Разобрать

Я думаю, что нет проблем с причиной, по которой аргументатор анализирует изменение фактических параметров параметров базового типа и ссылочного типа, но вывод ни капельки неправильный. как сказать? Пожалуйста, продолжайте читать.

Аргумент в том, что,java передается только по значению. То есть эта ссылочный тип также передается по значению, а фокус должен копировать копиюЗначение ссылочного адресаДля формальных параметров значением здесь является значение адреса ссылки (а не значение, хранящееся в памяти, на которое указывает ссылка), поэтому говорят, что оно передается по значению. Это немного надуманно? Я думаю, что это немного концепция кражи.Да, все знают, что ссылочные типы передают значение ссылки, но вы не можете сказать, что она передается по значению, потому что она передается по значению.Что еще можно передать без передачи ценность? Ссылка — это адрес памяти, разве она не должна также быть представлена ​​значением?

И традиционная поговорка:Базовые типы передаются по значению (значение, представленное чем-то, хранящимся в памяти), а ссылочные типы передаются по ссылке.Я думаю, что суть здесь в следующем: базовые типы передают копию значения, а ссылочные типы передают копию ссылки. Основное внимание уделяется тому, что передается, то, что передается базовым типом, называется значением переменной (значение, представленное самой переменной), а то, что передается ссылочным типом, называется ссылкой (значение ссылки). сама, то есть адрес памяти), а не память, на которую указывает ссылочное значение в пространстве. Так что не проблема понять, что ссылочный тип передается как ссылка.

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

В статье также говорилось

Будь то передача по значению или по ссылке, на самом деле это стратегия оценки.В стратегии оценки также естьсовместная доставка(звоните по обмену). На самом деле передача параметров в Java должна осуществляться путем совместного использования в строгом смысле.

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

Проще говоря, передача в Java — это передача значения, и это значение на самом деле является ссылкой на объект.

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

Видишь это понимаешь?

Адрес является ссылкой, так можно ли сказать, что java передается по ссылке? То, что передается, является значением ссылки. Разве не все значение находится в компьютере? Что еще может быть, если это не значение? Сказать, что оно передается по ссылке, означает, что фокус другой. Адрес, переданный в прошлое является ссылкой.

Упомянутое здесь значение не является понятием.Сказано, что базовый тип передает значение, это значение самой переменной значения, объект также является значением, значением является то, что ссылка является адресом, а объект заключается в том, что ссылка передается, фокус считается переданным адресом, указывающим на адрес внутреннего свойства, представленного объектом, и значение внутреннего свойства, представленного не-объектом, чтобы различать это от прямой передачи стоимости базового типа.

Википедия:Ссылки (программирование)

существуетИнформатикасередина,Цитировать(английский: ссылка) относится к программе, которая обеспечивает непрямой доступ кпамять компьютераили другиеустройство храненияконкретных данныхценность, данные могут бытьПеременнаяилизаписывать.
Ссылки — это не то же самое, что сами данные. Как правило, ссылка — это данные, хранящиеся в памяти или на запоминающем устройстве.Физический адрес. Поэтому ссылка также часто упоминается какуказательилиадрес.

Глядя на определение ссылки,Ссылка относится к значению данных XXX.Ну, сама ссылка является значением. Но чем еще это могло бы быть, если бы это не было ценностью? Разве это не стоит того в компьютере?

Нет ничего плохого в том, чтобы говорить «передача по значению» или «передача по ссылке», ключ в том, как вы определяете и объясняете передачу по значению, концепцию передачи по ссылке и что представляет значение.

Все в компьютере является значением.Если начать с этого момента, то это все переданное значение, но оно уточняется до java.Базовый тип передает свое значение, а ссылочный тип передает значение ссылки, а не объект Значение свойства.

Так что, если вы произвольно скажете, что передается только значение, это нормально, потому что в компьютере вы можете использовать значение только для его представления, но я думаю, что это немного конъюнктурно, так же, как сказать, что в мире есть только ***, тогда зачем различать ** и ** , причина почти та же. (Я пока не могу придумать хороший пример, ха-ха)

Это все еще предложение, которое я только что сказал, говоря, что оно передается по ссылке, основное внимание уделяется тому, что ссылка является адресом, а не внутренним значением атрибута, представленным объектом, чтобы отличить его от прямой передачи значения базового типа , который легко запомнить.

Наконец

В конце концов, достаточно, чтобы каждый понял принцип явления, не нужно так глубоко вникать в него или играть в словесные игры, чтобы докопаться до сути.

Если вас кто-то спросит, то можно сказать, что базовые типы и их классы-обертки передаются по значению, ссылочный тип передает ссылку на объект, то есть значение адреса, а проход String — тоже значение адреса, но значение адреса изменено в функции, поэтому оно не повлияет на фактические параметры, потому что производительность такая же, как и у базового типа, поэтому можно сказать, что String передается по значению, чтобы запомнить это явление. В конечном счете передаются все значения, но смысл значений разный, поэтому есть поговорка, что Java передает только по значению.

(Эта статья не является войной или диссом, просто выражаю свое понимание, добро пожаловать в обсуждение)