Che cosa & # 8216; valore semantica & # 8217; e & # 8216; semantica puntatore & # 8217; significare?

StackOverflow https://stackoverflow.com/questions/166033

Domanda

Cosa si intende per & # 8216; semantica di valore & # 8217; e cosa si intende per & # 8216; semantica puntatore implicito & # 8217 ;?

È stato utile?

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.

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

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top