O método chamado por é um termo de ciência da computação padrão. As chamadas de método são divididas em chamadas de valor (chamada por referência) e chamadas de referência (chamada por valor) de acordo com a situação de passagem de parâmetros. Existem muitas definições desses dois tipos de chamadas no mundo. O ditado mais comum é que o valor é a chamada de valor e o endereço é a chamada de referência. Isso é realmente muito inapropriado. Essas declarações podem facilmente nos lembrar que a passagem do parâmetro de objeto de Java é uma chamada de referência. De fato, a passagem do parâmetro de objeto de Java ainda é uma chamada de valor.
Vamos primeiro usar um pedaço de código para confirmar por que a passagem do parâmetro de objeto Java é uma chamada de valor.
Public classe funcionário {public string name = null; funcionário público (string n) {this.name = n; } // Troque dois objetos de funcionários Public Static Void Swap (funcionário E1, funcionário E2) {TEMP do funcionário = E1; e1 = e2; e2 = temp; System.out.println (e1.name+""+e2.name); // Resultado da impressão: li si zhang san} // função principal public static void main (string [] args) {funcionário trabalhador = novo funcionário ("zhang san"); Gerente de funcionários = novo funcionário ("li si"); troca (trabalhador, gerente); System.out.println (trabalhador.name+""+gerente.name); // O resultado da impressão ainda é: Zhang San Li Si}}O resultado acima é muito decepcionante. Embora o conteúdo dos objetos de parâmetro formal E1 e E2 tenha sido trocado, os objetos de parâmetro reais e gerente não trocavam conteúdo. A razão mais importante aqui é que os parâmetros formais E1 e E2 são as cópias de endereço dos parâmetros reais trabalhadores e gerentes.
Como todos sabemos, em Java, os nomes da variável de objeto realmente representam o endereço do objeto no heap (o termo profissional é chamado de referência de objeto). Quando o método Java é chamado, os parâmetros passam uma referência ao objeto. É importante ressaltar que os endereços de memória ocupados por parâmetros formais e parâmetros reais não são os mesmos. O conteúdo dos parâmetros formais é apenas uma cópia da referência de objeto armazenada nos parâmetros reais.
Se você entender a área variável local da pilha Java no gerenciamento de memória da JVM (consulte "Java Virtual Machine Architecture"), você entenderá muito bem a frase acima. Quando a JVM executa o programa acima, a execução do método principal e o método de troca empurrará dois espaços de memória chamados quadros de pilha na pilha Java. Há uma peça de memória chamada área variável local no quadro da pilha principal para armazenar referências aos objetos de parâmetros reais Trabalhador e gerente. A área variável local na pilha de troca armazena referências aos objetos de parâmetros formais E1 e E2. Embora os valores de referência de E1 e E2 sejam os mesmos que os trabalhadores e gerentes, eles ocupam espaço de memória diferente. Quando as referências entre E1 e E2 são trocadas, a figura abaixo mostra claramente que não afetará os valores de referência do trabalhador e do gerente.
A passagem do parâmetro do objeto Java ainda é uma chamada de valor, embora o endereço (referência) seja aprovado. É hora de fornecer a chamada de referência e o valor de uma definição precisa.
Chamada por valor: Durante o processo de passagem de parâmetros, parâmetros formais e parâmetros reais ocupam dois espaços de memória completamente diferentes. O conteúdo armazenado pelo parâmetro formal é uma cópia do conteúdo armazenado pelo parâmetro real. De fato, a passagem dos objetos Java atende a essa definição, exceto que o conteúdo armazenado por parâmetros formais e parâmetros reais não é o valor variável no sentido convencional, mas o endereço da variável. Bem, pense: não é o endereço de uma variável também um valor?
Chamada por referência: Durante o processo de passagem de parâmetros, parâmetros formais e parâmetros reais são completamente o mesmo espaço de memória, e os dois não são distinguidos um do outro. De fato, nomes formais de parâmetros e nomes reais de parâmetros são apenas símbolos diferentes na programação. Durante a operação do programa, o espaço armazenado na memória é a coisa mais importante. Diferentes nomes de variáveis não indicam o espaço de armazenamento de memória ocupado de maneira diferente.
De um modo geral, o básico das duas chamadas não é se o valor ou o endereço são aprovados (afinal, o endereço também é um valor), mas se os parâmetros formais e os parâmetros reais ocupam o mesmo espaço de memória. De fato, o parâmetro de ponteiro que passa em C/C ++ também é uma chamada de valor. Se você não acredita, tente o seguinte código 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); troca (a, b); printf (" %d %d/n",*a,*b); retornar 0; }Mas C/C ++ possui chamadas de referência, que é um método de declaração variável chamado referência int a; int & ra = a; onde RA é um pseudônimo de a. Não há diferença entre os dois na memória e ocupar o mesmo espaço de memória. Os parâmetros de passagem por meio de referência (alias) estão alinhados com as características das chamadas de referência. Você pode experimentar os resultados em execução da troca de vazios (Int & A1, Int & B1);
Através deste artigo, você deve saber se os parâmetros do método Java são chamados de referência ou valor.