Понимание передачи стоимости Java:
Код 1:
public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer buffer = new StringBuffer("colin"); public static void SChange (StringBuffer str) {str = new StringBuffer("huang" } });Код 2:
public class Test { /** * @param args */ public static void main(String[] args) { StringBuffer buffer = new StringBuffer("colin"); public static void SChange (StringBuffer str) { //str= new StringBuffer("huang");Давайте воспользуемся двумя картинками, чтобы объяснить приведенные выше код 1 и код 2 соответственно:
исходное состояние
Схема кода 1:
Понимание кода 2:
В коде 1 ссылка на копию указывает на новый объект. Но исходный объект остается неизменным.
В коде 2 ссылка на копию изменяет исходный объект.
Это передача Java по значению.
Разница между двумя видами передачи в C++:
Для передачи значений C++, передачи ссылок и методов указателей используйте следующий код, чтобы понять и запустить тест самостоятельно.
#include <stdio.h> #include <iostream> #include <typeinfo> void ByValue(int a) { a = a + 1; } void ByRef(int& a) { a = a + 1 } void ByPointer(int*; а) { *a = *a + 1; } int main(int argv, char** args) { int v = 1; ByRef(v); // Передача по ссылке ByPointer(&v); // Передача по значению int* vp = &v; std::cout << v << std::endl; // std:: cout << typeid(vp).name() << std::endl // std::cout << typeid(&vp).name() << std::endl; std::cout << "конец" << std::endl };Первая передается по значению, а вторая функция передается по ссылке, но для последних двух одна и та же функция вызывается один раз вызовом по ссылке и один раз вызовом по значению.
потому что:
ByPointer(vp); Если vp не изменен, его нельзя изменить. Передача по значению
ByPointer(&v); изменяет v. Передача по ссылке (вы можете сказать, что на самом деле передается адрес v, а ByPointer не может изменить адрес v, поэтому это вызов по значению. Это звучит самоочевидно, но адрес v — это чистые данные. Когда вызов не существует в квадратном коде. Для вызывающего объекта существует только v, и v действительно изменяется функцией ByPointer. Этот результат соответствует тому, что вызывает Call. Эталонное поведение. Рассмотрение поведения является первоначальным намерением стратегии оценки. Если все абстрагировано на ценности и проблема рассматривается с точки зрения данных, нет необходимости вводить концепцию стратегии оценки, чтобы запутать аудиторию. )
nob: Приведенное выше понимание учитывается. Дополнительный метод указателя можно использовать двумя способами: передача значения: передача указателя; передача ссылки: передача адреса или ссылки на переменную, если вы используете typeid(x).name(); просмотрев &v и vp, вы обнаружите, что оба относятся к типу Point, поэтому два исполнения — один и тот же результат. Вы можете думать обо мне так
ПоЗначению(&v); //ошибка
, хотя передача параметров разных типов в C++ не приведет к прямой компиляции.
Подведите итог:
Поэтому я думаю, что если вы передаете по значению или по ссылке, вам просто нужно посмотреть, как это происходит в памяти.
Совместное использование памяти означает передачу ссылки, а копирование памяти означает передачу значения (сначала оставляя в стороне некоторые особые случаи).
В этом случае:
C/C++: передача по значению по умолчанию, передача по ссылке и указатели понимаются отдельно (указатели можно понимать как передачу по значению или по ссылке, и результаты одинаковы)
JAVA: базовые типы данных передаются по значению, а объекты также передаются по значению (скопируйте ссылку на этот объект)
C#: передача значения по типу значения, передача по ссылке по ссылочному типу, особое понимание ref/out
Строки в JAVA и C# требуют особого понимания. Внешний вид должен передаваться по значению, но фактическая реализация зависит от виртуальной машины.