2015-11-23 25 views
5

Non riesco a capire le due affermazioni nel metodo principale (new my_class();).Cosa fa la nuova parola chiave qui?

Non ho mai visto questa istruzione tranne nella definizione dell'oggetto. So che la nuova parola chiave alloca memoria per un oggetto e assegna un indirizzo di riferimento, ma ciò che sta accadendo in questo caso è totalmente ambiguo; allocare memoria per cosa?

Cosa fa la nuova parola chiave qui? Qualunque cosa sia usando questa affermazione, posso chiamare esplicitamente il costruttore dal metodo principale. Non sono riuscito a trovare una frase simile in un libro di testo o su Internet.

+2

questo è chiamato "scrittura di codice errato" ... Questo utilizza gli effetti collaterali del costruttore per visualizzare qualcosa sulla console! – ParkerHalo

+2

@ParkerHalo true e vedi anche [this] (http://stackoverflow.com/questions/7019754/what-does-the-new-keyword-actually-do-in-java-and-should-i-avoid-creating -nuovo) – Neijwiert

+2

Niente di sbagliato in questa domanda. L'equivalente in VB6 e VBA non è consentito. La logica da sola non affronta questo IMO. – Bathsheba

risposta

6

new my_class() crea un nuovo oggetto di tipo my_class. Non è assegnato; quindi è scartato.

Ma prima di essere scartato, l'oggetto è comunque costruito; il costruttore viene eseguito e stampa il valore dell'attributo a dell'oggetto. 8.

2

Queste due linee creano oggetti di my_class e allocano memoria in heap. Ma non è possibile fare riferimento a tali oggetti successivamente poiché non si sta memorizzando il riferimento da nessuna parte.

2

new my_class(); non solo chiamate il costruttore predefinito di my_class, ma restituisce anche un riferimento all'oggetto appena creato.

Si è, naturalmente, liberi di scartare tale riferimento.

Questo è ciò che sta accadendo qui. Nel non mantenere un riferimento, l'oggetto creato potrebbe essere immediatamente idoneo per la garbage collection.

0

Questo codice crea 2 oggetti di my_class, ma questi oggetti non sono associati con alcun riferimento, quindi verranno eliminati a breve da GC. Questo è simile a chiamare come esempio.

int Check() { } 

e può essere chiamato

object.Check(); 

e si lavora.

Problemi correlati