¿Qué valor & # 8216; semántica de valor & # 8217; y & # 8216; semántica de puntero & # 8217; ¿media?

StackOverflow https://stackoverflow.com/questions/166033

Pregunta

¿Qué se entiende por & # 8216; semántica de valor & # 8217 ;, y qué se entiende por & # 8216; semántica de puntero implícita & # 8217 ;?

¿Fue útil?

Solución

Java está utilizando semántica de puntero implícita para tipos de objeto y semántica de valor para primitivas.

La semántica del valor significa que usted trata directamente con los valores y que pasa las copias. El punto aquí es que cuando tienes un valor, puedes confiar en que no cambiará a tus espaldas.

Con la semántica de punteros, no tiene un valor, tiene una 'dirección'. Alguien más podría alterar lo que hay allí, no se puede saber.

Semántica de puntero en C ++:

void foo(Bar * b) ...
... b->bar() ...

Necesita un * para solicitar semántica de puntero y - > para llamar a los métodos en el pointee.

Semántica de puntero implícito en Java:

void foo(Bar b) ...
... b.bar() ...

Dado que no tiene la opción de usar semántica de valores, no se necesita el * ni la distinción entre - > y., de ahí lo implícito.

Otros consejos

Básicamente, la semántica de valor significa que asignar un valor a otro crea una copia:

int x = 1;
int y = x;
x = 2; // y remains the same!

Un caso especial es una llamada de función que pasa un argumento:

void f(int x) {
    x = 5;
}

int a = 1;
f(a);
// a is still 1

Esto es en realidad lo mismo para Java y C ++. Sin embargo, Java solo conoce algunos tipos primitivos, entre ellos int , double , boolean y char , junto con enumerados que se comportan de esta manera. Todos los demás tipos usan semántica de referencia, lo que significa que una asignación de un valor a otro en realidad redirige un puntero en lugar de copiar el valor subyacente:

class Foo {
    int x;

    public Foo(int x) { this.x = x; }
}

Foo a = new Foo(42);
Foo b = a; // b and a share the same instance!
a.x = 32;
//b.x is now also changed.

Sin embargo, hay algunas advertencias. Por ejemplo, muchos tipos de referencia ( String , Integer …) son realmente inmutables. Su valor no se puede cambiar y cualquier asignación que se les haga anula el valor anterior.

Además, los argumentos aún se pasan por valor. Esto significa que el valor de un objeto pasado a una función se puede cambiar pero su referencia no puede:

void f(Foo foo) {
    foo.x = 42;
}

void g(Foo foo) {
    foo = new Foo(42);
}

Foo a = new Foo(23);
f(a);
// a.x is now 42!

Foo b = new Foo(1);
g(b);
// b remains unchanged!

Java es pasar por valor. C ++ puede usar tanto la semántica de valor como de referencia.

http://javadude.com/articles/passbyvalue.htm

Java usa semántica de puntero implícito en acceso variable (no puede editar directamente la referencia, se resuelve automáticamente (implícito) en el Objeto al acceder) y también usa Semántica de paso por valor en parámetros de método que pasan .

Leer Semántica de paso por valor en aplicaciones Java :

  

En aplicaciones Java, cuando un objeto   la referencia es un parámetro a un método,   estas pasando una copia de la   referencia (pase por valor), no la   referencia en sí. Tenga en cuenta que el   referencia de objeto del método de llamada y   Las copias apuntan a lo mismo.   objeto. Este es un importante   distinción. Una aplicación Java hace   nada diferente al pasar   parámetros de diferentes tipos como C ++   hace. Las aplicaciones Java pasan todas   parámetros por valor, haciendo así   copias de todos los parámetros independientemente de   tipo.

Corto: todos los parámetros en Java se pasan por valor. Pero eso no significa que se copia un objeto (como el predeterminado en PHP4), sino que se copia la referencia a ese objeto.

Verá todas las explicaciones y ejemplos detallados en Semántica de paso por valor en aplicaciones Java

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top