O que fazer ‘semântica de valor’ e ‘ponteiro semântica’ significa?
-
03-07-2019 - |
Pergunta
O que se entende por ‘semântica de valor’, e que se entende por ‘semântica ponteiro implícitas’?
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.
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