Compreensão da transferência de valor do Java:
Código 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");Código 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");Vamos usar duas imagens para explicar o código 1 e o código 2 acima, respectivamente:
estado original
Diagrama do código 1:
Compreensão do código 2:
No código 1, a referência da cópia aponta para um novo objeto. Mas o objeto original permanece inalterado.
No código 2, a referência de cópia altera o objeto original.
Esta é a passagem por valor do Java.
A diferença entre dois tipos de transferência em C++:
Para passagem de valor C++, passagem de referência e métodos de ponteiro, use o código a seguir para entender e executar o teste você mesmo
#include <stdio.h> #include <iostream> #include <typeinfo> void ByValue(int a) { a = a + 1 } void ByRef(int& a) { a = a + 1; a) { *a = *a + 1 } int main(int argv, char** args) { int v = 1; ByRef(v); // Passa por Referência ByPointer(&v); // Passa por Valor int* vp = &vp; cout << typeid(vp).name() << std::endl; // std::cout << typeid(&vp).name() << std::endl; std::cout << "fim" << std::endl }A primeira é passada por valor e a segunda função é passada por referência, mas para as duas últimas a mesma função é chamada uma vez por Chamada por referência e uma vez por Chamada por valor.
porque:
ByPointer(vp); Se vp não for alterado, ele não poderá ser alterado. Passe por valor
ByPointer(&v); Passagem por referência (você pode dizer que o que é passado é na verdade o endereço de v, e ByPointer não pode alterar o endereço de v, então esta é chamada por valor. Isso parece autoexplicativo, mas o endereço de v são dados puros. Quando a chamada não existe no código quadrado. Para o chamador, existe apenas v, e v é de fato alterado pela função ByPointer. Este resultado é exatamente o que Call by. O comportamento de referência. Considerar o comportamento é a intenção original da estratégia de avaliação. Se tudo for abstraído em valores e o problema for considerado da perspectiva dos dados, não há necessidade de introduzir o conceito de estratégia de avaliação para confundir o público. )
nob: O entendimento acima é reconhecido. O método do ponteiro suplementar pode ser usado de duas maneiras: passagem de um ponteiro: passagem do endereço ou referência de uma variável se você usar typeid(x).name() para; view &v e vp, você descobrirá que ambos são do tipo Point, portanto, duas performances, o mesmo resultado. Você pode pensar em mim assim
PorValor(&v);
, embora a passagem de parâmetros de tipos diferentes em C++ não passe a compilação diretamente.
Resumir:
Então eu acho que se você passar por valor ou por referência, você só precisa ver como fica na memória.
Compartilhar memória significa passar uma referência, e copiar memória significa passar um valor (deixando de lado alguns casos especiais primeiro)
Nesse caso:
C/C++: passagem por valor por padrão, passagem por referência e ponteiros são entendidos separadamente (ponteiros podem ser entendidos como passagem por valor ou por referência, e os resultados são os mesmos)
JAVA: Os tipos de dados básicos são passados por valor e os objetos também são passados por valor (copie a referência deste objeto)
C#: passar valor por tipo de valor, passar por referência por tipo de referência, compreensão especial de ref/out
Strings em JAVA e C# precisam de compreensão especial. A aparência é passar por valor, mas a implementação real depende da máquina virtual.