2008-10-03 32 views

Respuesta

11

Java está utilizando una semántica de puntero implícita para tipos de objetos y semántica de valores para primitivos.

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

Con semántica de puntero, no tiene un valor, tiene una 'dirección'. Alguien más podría alterar lo que está allí, no puedes saberlo.

Pointer Semántica en C++:

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

* Hace falta un programa para pedir la semántica puntero y -> para llamar a métodos en el pointee.

implícitos Pointer Semántica en Java:.

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

Dado que usted no tiene la opción de utilizar la semántica de valor, el * no es necesaria ni la distinción entre -> y, por lo tanto, lo implícito.

1

Java utiliza implicit pointer semantics en acceso a variables (no se puede editar directamente la referencia, se autmatically (implícita) se resuelve con el objeto de acceso) y también se utiliza en Pass-by-Value semanticsparámetros del método de pasar.

Leer Pass-by-value semantics in Java applications:

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

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

Verás todas las explicaciones y ejemplos en profundidad sobre Pass-by-value semantics in Java applications

10

Básicamente, la semántica de valor significa que la asignación de 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 a la función que se pasa una discusión:

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

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

Esto es realmente lo mismo para Java y C++. Sin embargo, Java solo conoce unos pocos tipos primitivos, entre ellos int, double, boolean y char, junto con enumeraciones que se comportan de esta manera. Todos los demás tipos usan la semántica de referencia que significa que una asignación de un valor a otro en realidad vuelve a dirigir 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. 

Hay algunas advertencias sin embargo. Por ejemplo, muchos tipos de referencia (String, Integer ...) son en realidad inmutables. Su valor no se puede cambiar y cualquier asignación a ellos anula el valor anterior.

Además, los argumentos se pasan por valor. Esto significa que el valor de un objeto pasa 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! 
+0

¿por qué el caso especial? – morbidCode

+0

@morbidCode ¿Qué caso especial? ¿Qué pasa el argumento? En realidad no es un caso especial, se comporta de forma idéntica a la asignación (simplemente * no es * una tarea sintáctica). –

+0

No estoy seguro de que lo tengo. ¿Quiere decir que cuando pasa a a f (x), se crea una copia de a, luego esa copia se asigna al valor 5, de modo que cuando el método retorna la copia se va y el valor del original a permanece igual? – morbidCode

3

Java es pase por valor. C++ puede usar semántica de valores y de referencia.

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

+2

Esa descripción es engañosa debido a los punteros ocultos de Java (incluso si los punteros son pasados ​​por value.) – finnw

+1

@finnw: Estoy de acuerdo, pero los desarrolladores de Java deben entenderlo de esa manera, porque si esperan cambiar los datos apuntados dentro de una función, se sorprenderán de que la "referencia" original no se haya tocado. esto es importante para que entiendan que sus "referencias" se copian. – paercebal

+1

Bartosz: me alegro de ver a la gente difundir mi artículo;) finnw: "Oculto" es el palabra clave allí ... Estamos hablando de cómo alguien programa en Java. La mecánica de implementación detrás de escena no cambia el hecho de que Java es estrictamente de paso por valor - lea la Especificación del lenguaje Java para verlo deletreado fuera. –