Che cosa & # 8216; valore semantica & # 8217; e & # 8216; semantica puntatore & # 8217; significare?
-
03-07-2019 - |
Domanda
Cosa si intende per & # 8216; semantica di valore & # 8217; e cosa si intende per & # 8216; semantica puntatore implicito & # 8217 ;?
Soluzione
Java utilizza la semantica puntatore implicito per i tipi di oggetto e la semantica del valore per le primitive.
La semantica dei valori significa che hai a che fare direttamente con i valori e che le copie vengono passate. Il punto qui è che quando hai un valore, puoi fidarti che non cambierà alle tue spalle.
Con la semantica del puntatore, non hai un valore, hai un 'indirizzo'. Qualcun altro potrebbe modificare ciò che è lì, non puoi saperlo.
Semantica puntatore in C ++:
void foo(Bar * b) ...
... b->bar() ...
È necessario un * per richiedere la semantica del puntatore e - > per chiamare metodi sulla punta.
Semantica implicita del puntatore in Java:
void foo(Bar b) ...
... b.bar() ...
Dato che non hai la scelta di usare la semantica del valore, * non è necessario né la distinzione tra - > e., quindi l'implicito.
Altri suggerimenti
Fondamentalmente, la semantica del valore significa che l'assegnazione di un valore a un altro crea una copia:
int x = 1;
int y = x;
x = 2; // y remains the same!
Un caso speciale è una chiamata di funzione alla quale viene passato un argomento:
void f(int x) {
x = 5;
}
int a = 1;
f(a);
// a is still 1
Questo è in realtà lo stesso per Java e C ++. Tuttavia, Java conosce solo alcuni tipi primitivi, tra cui int
, double
, boolean
e char
, insieme a enum che si comportano in questo modo. Tutti gli altri tipi usano la semantica di riferimento, il che significa che un'assegnazione di un valore a un altro reindirizza effettivamente un puntatore invece di copiare il valore sottostante:
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.
Tuttavia, ci sono alcuni avvertimenti. Ad esempio, molti tipi di riferimento ( String
, Integer
...) sono in realtà immutabili. Il loro valore non può essere modificato e qualsiasi assegnazione ad essi sovrascrive il vecchio valore.
Inoltre, gli argomenti vengono comunque passati per valore. Ciò significa che il valore di un oggetto passato a una funzione può essere modificato ma il suo riferimento non può:
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 è passato per valore. Il C ++ può usare sia la semantica di valore, sia quella di riferimento.
Java utilizza semantica puntatore implicito
su accesso variabile (non è possibile modificare direttamente il riferimento, viene automaticamente risolto (implicito) nell'oggetto all'accesso) e utilizza anche Semantica pass-by-value
sul passaggio dei parametri del metodo .
Leggi Semantica pass-by-value nelle applicazioni Java :
Nelle applicazioni Java, quando un oggetto il riferimento è un parametro per un metodo, stai passando una copia del file riferimento (passa per valore), non il riferimento stesso. Si noti che il riferimento all'oggetto del metodo chiamante e la copia punta allo stesso oggetto. Questo è importante distinzione. Un'applicazione Java fa niente di diverso al passaggio parametri di vario tipo come C ++ lo fa. Le applicazioni Java passano tutte parametri per valore, creando così copie di tutti i parametri indipendentemente da tipo.
Breve: tutti i parametri in Java vengono passati per valore. Ma ciò non significa che un oggetto venga copiato (come quello predefinito in PHP4), ma il riferimento a quell'oggetto viene copiato.
Vedrai tutte le spiegazioni e gli esempi approfonditi su Semantica pass-by-value nelle applicazioni Java