Метод вызов по стандартному термину информатики. Вызовы метода делятся на вызовы значений (вызов по ссылке) и справочные вызовы (вызов по значению) в соответствии с ситуацией прохождения параметров. Есть много определений этих двух типов звонков в мире. Наиболее распространенным высказыванием является то, что значение - это вызов значения, а адрес - это справочный вызов. Это на самом деле очень неуместно. Эти утверждения могут легко напомнить нам, что передача параметров объекта Java является эталонным вызовом. На самом деле, передача параметров объекта Java по -прежнему остается вызовом значения.
Давайте сначала используем кусок кода, чтобы подтвердить, почему передача параметров объекта Java является вызовом значения.
Public Class Employee {public String name = null; Public Employee (String n) {this.name = n; } // Поменять два объекта сотрудников Public Static Void Swap (сотрудник E1, сотрудник E2) {Tempemente Temp = E1; e1 = e2; e2 = темп; System.out.println (e1.name+""+e2.name); // Результат печати: li si Zhang San} // Основная функция Public static void main (string [] args) {employee abley = new ofmentee ("Zhang San"); Менеджер сотрудника = новый сотрудник ("Li Si"); обмен (работник, менеджер); System.out.println (Worker.name+""+Manager.name); // Результат печати по -прежнему: Zhang San Li Si}}Приведенный выше результат очень разочаровывает. Хотя содержимое формальных объектов параметров E1 и E2 были обменены, фактический работник и менеджер по объектам параметров не обменивались содержимым. Самая важная причина здесь заключается в том, что формальные параметры E1 и E2 являются адресами, копирующими фактические параметры и менеджер.
Как мы все знаем, в Java имена переменных объектов фактически представляют адрес объекта в куче (профессиональный термин называется ссылкой на объект). Когда вызывается метод Java, параметры передают ссылку на объект. Важно отметить, что адреса памяти, занятые формальными параметрами и фактическими параметрами, не совпадают. Содержание в формальных параметрах представляет собой просто копию ссылки на объект, хранящейся в фактических параметрах.
Если у вас есть некоторое понимание локальной переменной области стека Java в управлении памятью JVM (см. «Архитектура виртуальной машины Java»), вы очень хорошо поймете вышеуказанное предложение. Когда JVM запускает вышеуказанную программу, запуск основного метода и метод свопа натолкнет два пространства памяти, называемые кадрами стека в стеке Java. В основном стеке есть часть памяти, называемой локальной переменной областью, чтобы хранить ссылки на фактического работника объектов параметров и менеджера. Локальная область переменной в кадре Скапа содержит ссылки на формальные объекты параметров E1 и E2. Хотя эталонные значения E1 и E2 такие же, как и у работника и менеджера, они занимают различное пространство памяти. Когда ссылки между E1 и E2 обмениваются, на рисунке ниже ясно показывается, что это вообще не повлияет на эталонные значения работника и менеджера.
Передача параметров объекта Java по -прежнему остается вызовом значения, хотя адрес (ссылка) передается. Пришло время дать справочный вызов и значение, вызывая точное определение.
Вызов по значению: во время процесса прохождения параметра формальные параметры и фактические параметры занимают два совершенно разных пространства памяти. Содержание, хранящееся формальным параметром, является копией контента, хранящегося фактическим параметром. Фактически, прохождение объектов Java соответствует этому определению, за исключением того, что содержимое, хранящееся с помощью формальных параметров и фактических параметров, не является переменным значением в обычном смысле, а адрес переменной. Что ж, подумайте: разве адрес переменной также не является значением?
Вызов по ссылке: Во время процесса прохождения параметров формальные параметры и фактические параметры являются совершенно одинаковыми пространством памяти, и они не отличаются друг от друга. Фактически, формальные имена параметров и фактические имена параметров - это просто разные символы в программировании. Во время работы программы пространство, хранящее в памяти, является наиболее важным. Различные имена переменных не указывают пространство для хранения памяти, занятое по -разному.
Вообще говоря, основы двух вызовов заключаются не в том, передается ли значение или адрес (в конце концов, адрес также является значением), а о том, занимают ли формальные параметры и фактические параметры одно и то же пространство памяти. Фактически, параметр указателя, проходящий в C/C ++, также является вызовом значения. Если вы не верите в это, попробуйте следующий C -код!
#include <stdio.h> void swap (int *a1, int *b1) {int *t = a1; a1 = b1; b1 = t; } int main () {int x1 = 100; int x2 = 200; int *a = & x1; int *b = & x2; printf (" %d %d/n",*a,*b); обмен (а, б); printf (" %d %d/n",*a,*b); возврат 0; }Но C/C ++ имеет эталонные вызовы, который является методом объявления переменной, называемой ссылкой int a; int & ra = a; где Ра - псевдоним. Нет никакой разницы между двумя в памяти и займит одно и то же пространство памяти. Передача параметров через ссылку (псевдоним) соответствует характеристикам эталонных вызовов. Вы можете попробовать результаты запуска void swap (int & a1, int & b1);
Через эту статью вы должны знать, называются ли параметры метода Java ссылкой или значением.