English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
Сначала скопируем вопрос из интервью/теста:
Если после того, как объект передается в метод в качестве параметра, этот метод может изменить атрибуты объекта и вернуть измененный результат, то как определить, это передача значений или передача по ссылке?
Ответ:
Это передача значений. Вызов методов на языке Java поддерживает только передачу значений параметров. Когда объект экземпляра передается в метод в качестве параметра, значение параметра - это ссылка на этот объект. Атрибуты объекта могут быть изменены в процессе вызова, но изменение ссылки на объект не влияет на вызывателя. В C++ и C# можно изменить传入ые параметры, передавая их по ссылке или передавая значения в качестве параметров вывода. В C# можно написать такой код, но это не возможно в Java.
В Java передача значений и передача по ссылке (передача по ссылке), чтобы понять эти два концепции, нужно понять передачу значений и передачу по ссылке.
Давайте рассмотрим простой пример для объяснения:
Например, если вы отправляетесь в путешествие за границу и делаете отличную фотографию, которую хотите поделиться с друзьями, то есть два способа. Первый способ - это напрямую отправить эту фотографию своему другу, то есть предоставить ему копию этой фотографии; второй способ - если вы загрузите это отличное фото на QQ (Weibo) и т.д., вы получите адрес (URL) для доступа к этой фотографии, и в этот момент вы делитесь этим URL с друзьями.
Как в примере, первый можно считать передачей по значению, а второй - передачей по адресу (по ссылке). Поняв эти концепции, давайте проведем следующее простое исследование.
Передача по значению:Только когда параметр является переменной базового типа, Java передает по этой стратегии.
Если вы делитесь фотографией, и ваш друг получает ее дубликат, изменения друга не повлияют на вашу фотографию, и ваши изменения не повлияют на фотографию, которую вы дали другу.
Передача по адресу:Только когда параметр является переменной по ссылке, Java передает по этой стратегии.
Если вы предоставляете URL другу, и у друга есть права на изменение, если он изменяет фотографию, фотография, которую он видит, будет результатом его изменений.
Ниже через код объясним этот пример:
package com.dufy.reforvalue; import java.util.Arrays; /** * Передача по значению и по адресу в Java * Передача по значению: переменные базового типа - передача по значению, передача по значению осуществляется через копирование получения дубликата параметра * Передача по адресу: переменные по ссылке - передача по адресу, передача по адресу осуществляется через передачу адреса объекта * * @author dufy * @creation 9 февраля 2017 года */ public class ReferenceOrValue { /** * Примерные типы, передача по значению * Пример: если вы делитесь фотографией с другом, ваш друг получает реальный дубликат вашей фотографии: * Вы и ваш друг выполняете операции с各自的 фотографиями, и они не влияют на фотографии друг друга! */ public static void testVal(int photo){ photo++;//Друзья могут изменить фотографию System.out.println("Мой друг видит фотографию = " + photo); } /** * Типы по ссылке: передача по адресу * Пример: если вы делитесь фотографией с другом, вы делитесь URL (адресом) фотографии, которую вы загрузили в сеть: * Вы и ваш друг можете получить доступ к фотографии через этот адрес и выполнить с ней операцию! */ public static void testRef(Photo photo){ photo.setPhoto("java Photo,Great!");//Друзья могут изменить вашу фотографию System.out.println("Мой друг видит фотографию = " + photo.getPhoto()); } /** * Типы по ссылке: передача по адресу * Потому что массив является типом по ссылке. Поэтому передается ссылка на них, поэтому互换它们的值 в методе также влияет на их исходные значения. */ public static void testArrayRef(int[] array){ for (int i = 0; i < array.length; i++) { array[i] = 0; } System.out.println("testArrayRef массив равен = "+Arrays.toString(array)); } public static void main(String[] args) { //Первый: передача по значению int photo = 10;//Определите фотографию, которую нужно отправить testVal(photo);//Отправьте фотографию другу, друг получит копию System.out.println("Мой вижу фотографию = " + photo); //Второй: передача по адресу Photo p = new Photo();//Определите объект фотографии, я сам снимаю java photo p.setPhoto("java photo"); testRef(p);//Отправьте фотографию объекта (т.е. URL-адрес) другу, друг получает должен быть URL (адрес), откройте URL, чтобы увидеть фотографию System.out.println("Мой друг видит фотографию = " + p.getPhoto()); //Третий: массив также является объектом, массив находится в куче. Ссылка находится в стоке. int array[] = {1,2,3,4,5}; testArrayRef(array); System.out.println("массив равен = "+Arrays.toString(array)); } /** * Класс фотографии */ static class Photo{ String photo; public String getPhoto() { возврат photo; } public void setPhoto(String photo) { this.photo = photo; } } }
Результат вывода следующий:
Мой друг видит фотографию = 11
Мой вижу фотографию = 10
Мой друг видит фотографию = java Photo, Отлично!
Мой друг видит фотографию = java Photo, Отлично!
testArrayRef массив равен = [0, 0, 0, 0, 0]
массив равен = [0, 0, 0, 0, 0]
Интерлюдия: у нас есть следующая задача: как должен быть написан этот метод?
public static void main(String[] args) { int a = 10; int b = 20; method(a,b);// нужно напечатать a=100,b=200 после вызова метода method(a,b), пожалуйста, напишите метод method(a,b)! System.out.println("a = " + a); System.out.println("b = " + b); }
Конечно, многие из вас, как и я, не подумав, сразу же написали следующий код:
private static void method(int a, int b) { a*=10; b*=10; }
Но после выполнения вы обнаружите, что ожидаемый результат не был напечатан!
Если вы внимательно посмотрите на上面的 описание, вам не составит труда понять, почему появился такой результат!
Предположим, что правильный результат этого упражнения может быть следующим:
private static void method(int a, int b) { System.out.println("a=100,b=200"); System.exit(0); }
Надеюсь, что то, что я рассказал вам о передаче значений и адресов в Java (чаще всего встречается на собеседованиях), поможет вам. Если у вас есть какие-либо вопросы, пожалуйста, оставьте комментарий, и я постараюсь ответить вам своевременно. Вновь хочу выразить благодарность всем, кто поддерживает сайт呐喊 руководств!
Заявление: контент этой статьи был взят из Интернета, авторские права принадлежат соответствующему автору. Контент был предоставлен пользователями Интернета в порядке самодеятельности и загружен на этот сайт. Этот сайт не обладает правами собственности, не производил ручную редактуру и не несет ответственности за связанные с этим юридические обязательства. Если вы обнаружите подозрительный контент, пожалуйста, отправьте письмо по адресу: notice#oldtoolbag.com (при отправке письма замените # на @), чтобы сообщить о нарушении авторских прав,并提供相关证据. При подтверждении факта нарушения авторских прав сайт немедленно удаляет спорный контент.