Pergunta

O que se entende por ‘semântica de valor’, e que se entende por ‘semântica ponteiro implícitas’?

Foi útil?

Solução

Java é utilizando a semântica ponteiro implícitas para os tipos de objetos e valores semânticos para primitivos.

Valor semântica meios que lidam diretamente com os valores e que você passar de cópias ao redor. O ponto aqui é que quando você tem um valor, você pode confiar que não vai mudar atrás das costas.

Com a semântica ponteiro, você não tem um valor, você tem um 'endereço'. Alguém poderia alterar o que está lá, você não pode saber.

Ponteiro Semântica em C ++:

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

Você precisa de um * para pedir semântica ponteiro e -.> Para chamar métodos no pointee

implícitas ponteiro Semântica em Java:

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

Uma vez que você não tem a opção de usar semântica de valor, a * não é necessário, nem a distinção entre -..> E, portanto, o implícito

Outras dicas

Basicamente, semântica valor significa que a atribuição de um valor para outro cria uma cópia:

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

Um caso especial é uma chamada de função que é passado um argumento:

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

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

Este é realmente o mesmo para Java e C ++. No entanto, Java sabe apenas alguns tipos primitivos, entre eles int, double, boolean e char, juntamente com enums que se comportam desta maneira. Todos os outros tipos usar semântica de referência o que significa que uma atribuição de um valor para outro, na verdade redireciona um ponteiro em vez de copiar o valor subjacente:

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.

Existem algumas ressalvas no entanto. Por exemplo, muitos tipos de referência (String, Integer ...) são realmente imutáveis. O seu valor não pode ser alterado e qualquer cessão a eles substitui o valor antigo.

Além disso, argumentos ainda são passadas por valor. Isto significa que o valor de um objeto passado para uma função pode ser mudado, mas sua referência não pode:

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 é passar por valor. C ++ pode usar ambos, valor e referência semântica.

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

Java usa implicit pointer semantics em acesso variável (você não pode editar diretamente a referência, ele autmatically (implícita) é resolvido ao Objeto no acesso) e também usa Pass-by-Value semantics em parâmetros do método de passagem .

Leia passagem por valor semântica em Java aplicações :

aplicações em Java, quando um objeto referência é um parâmetro para um método, você está passando uma cópia do referência (passagem por valor), não o refira-se. Note-se que o chamando referência de objeto do método e a cópia está apontando para o mesmo objeto. Este é um importante distinção. Um aplicativo Java faz nada diferente quando passagem parâmetros de diferentes tipos como C ++ faz. aplicações Java passar tudo parâmetros de valor, tornando assim cópias de todos os parâmetros, independentemente da tipo.

curta: Todos os parâmetros em Java são passados ??por valor. Mas isso não significa que um objeto é copiado (como o padrão no PHP4), mas a referência a esse objeto é copiado.

Você verá todas as explicações e em profundidade exemplos de passagem por valor semântica em aplicações Java

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top