¿Qué valor & # 8216; semántica de valor & # 8217; y & # 8216; semántica de puntero & # 8217; ¿media?
-
03-07-2019 - |
Pregunta
¿Qué se entiende por & # 8216; semántica de valor & # 8217 ;, y qué se entiende por & # 8216; semántica de puntero implícita & # 8217 ;?
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.
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