Qualcuno potrebbe spiegare qual è la differenza tra il caricamento della classe e l'istanziazione di una classe. Quando cariciamo una classe con variabile statica, viene anche istanziata nello stesso momento in cui viene caricata la classe? Dopo tutto il codice statico fa parte della classe piuttosto che le singole istanze. Sarebbe utile se qualcuno fornisse un esempio per aiutarmi a capirlo meglio.Differenza tra caricare una classe e istanziarla
risposta
Ecco qualche bella spiegazione (con un esempio e di osservazione)
When a class is loaded and initialized in JVM - Java
quando la classe viene caricato in Java
Classe di carico è fatto da ClassLoader in Java che possono essere implementate per caricare avidamente una classe non appena un'altra classe fa riferimento a essa o caricare la classe lentamente finché non si verifica l'esigenza di inizializzazione della classe. Se la classe viene caricata prima di essere effettivamente utilizzata, può sedersi all'interno prima di essere inizializzata. Credo che questo possa variare da JVM a JVM. Mentre è garantito da JLS che una classe verrà caricata quando c'è bisogno di inizializzazione statica.
Quando una classe viene inizializzato in Java
Quando una classe viene inizializzato in Java Dopo classe di carico, l'inizializzazione di classe avviene che significa inizializzare tutti i membri statici della classe. Una classe viene inizializzato in Java quando: si crea
1) un'istanza della classe utilizzando nuovo) parola chiave o (utilizzando la riflessione utilizzando Class.forName(), che può gettare ClassNotFoundException in Java.
2) viene richiamato un metodo statico di Classe.
3) viene assegnato un campo statico di Classe .
4) viene utilizzato un campo statico di classe che non è una variabile costante .
5) se Class è una classe di livello superiore e un'asserzione asseritamente lessicata all'interno della classe viene eseguita.
Spero che questo aiuti.
sono un po 'confuso e voglio chiarire qualcosa con te. con caricamento lento intendiamo che anche quando classloader vede una dichiarazione di classe all'interno della classe corrente, non carica l'altra classe poiché non è ancora inizializzata e mentre carica caricando il classloader carica ogni classe che vede, indipendentemente dall'inizializzazione o meno e può anche spiegare come fanno i classloader pigri e desiderosi a gestire le chiamate ricorsive (caricano altre classi che incontrano). – light
Classe carico
Ogni volta che la JVM determina ha bisogno di una classe (per usare le sue variabili statiche, per creare un nuovo oggetto, di utilizzare i suoi metodi statici, ecc) che caricherà i blocchi di inizializzazione di classe e statiche verrà eseguito, le variabili statiche sono inizializzate ecc.Questo è (almeno in circostanze normali) fatto solo una volta
SomeClass.someStaticMethod(); //SomeClass is loaded (if its not already)
SomeClass.someStaticVariable; //SomeClass is loaded (if its not already)
SomeClass var=new SomeClass(); //SomeClass is BOTH loaded (if its not already) AND instantiated
Come risultato le seguenti piste (come esempio):
static Vector3d var=new Vector3d(); //static variables are initialised
static{
//static initialisation block are run
}
un'istanza di una classe
D'altra consegna instantiate a class quando si crea un'istanza della classe con la parola chiave new
; creare un'istanza di una classe sta creando un oggetto della classe.
SomeClass var=new SomeClass(); //SomeClass is instantiating (and loaded if its not already)
Di conseguenza le corse del costruttore:
public SomeClass(){
}
e
{
//initialisation block(s) also run (but these are very uncommonly used)
}
Integer.toString(123);
Per la chiamata di metodo statico superiore al lavoro, la classe Integer devono essere caricati.
Integer i = new Integer(123);
E nel codice di cui sopra, ho creato un'istanza (oggetto) della classe Integer (che deve anche essere caricato per far funzionare tutto questo, ovviamente).
Alcune classi non sono pensate per essere istanziate (come la classe Math, ad esempio, che ha solo metodi statici).
+1 Questa è la risposta più breve ma migliore, l'uso corretto dell'esempio, è qui che entra in gioco l'esperienza! – NINCOMPOOP
Una classe viene caricata quando viene referenziata (ad esempio da Class.forName()
).
Si instanciate un oggetto creando un'istanza, ad es.
Object o = new Object();
È inoltre possibile installare un oggetto utilizzando la riflessione.
static
i membri di una classe vengono instanciati quando la classe viene caricata, ad es.
public class Sample {
private static int variable = 10;
}
Quando ora carico la classe (ad esempio mediante Class.forName("Sample");
) Quindi la variabile variable
viene inizializzato con il valore 10
.
Se si sta creando una nuova istanza di una classe e non viene caricata prima che la classe venga eseguita prima (atomaticamente). Pertanto, il costrutto Class.forName()
è necessario solo in circostanze particolari (se la classe non è nota per tempo di compilazione, ad esempio).
+1 per la spiegazione completa senza postare collegamenti. – NINCOMPOOP
@TheNewIdiot Pubblicare link è una brutta cosa? Certamente una risposta dovrebbe essere in grado di "vivere senza" collegamenti, ma un riferimento aggiunge credibilità ad una risposta –
@RichardTingle Scusate, ma volevo dire ** solo link risposta ** senza spiegazione. – NINCOMPOOP
Il caricatore di classe carica effettivamente il codice di byte in JVM, esegue gli inizializzatori statici. Quando si desidera utilizzare campi statici all'interno della classe senza creare un'istanza, caricare prima la classe caricatore di classi. Il classloader predefinito in java è java.lang.ClassLoader
. il caricamento viene eseguito una sola volta.
Mentre la creazione di classi crea istanza di classe in memoria. È possibile creare un'istanza di classe utilizzando new
. L'istanza di classe può essere eseguita tutte le volte. esempio: Animal a=new Animal();
Stai dicendo che il caricatore di classi esegue gli inizializzatori statici e il caricamento viene eseguito esattamente una volta, quindi cosa succede quando un'istanza della classe modifica il valore della variabile statica? –
Quando il programma di caricamento della classe incontra la parola chiave class, controllerà se la classe è già caricata o meno. Poiché la variabile statica viene inizializzata quando viene caricata la classe, le modifiche apportate alla classe verranno riflesse quando si crea una nuova istanza di classe. – Rohan
Forse non sono chiaro. Sto chiedendo diciamo che ho creato un'istanza (oggetto) di una classe. usando questa istanza cambio il valore della variabile statica. In che modo questo cambiamento si riflette nella classe caricata? –
- 1. Come verificare se una classe eredita un'altra classe senza istanziarla?
- 2. OOP Differenza tra una classe derivata e una classe ereditata?
- 3. Differenza tra classe genitore e super classe
- 4. Qual è la differenza tra una classe e una libreria?
- 5. C'è qualche differenza tra tipo e classe?
- 6. differenza tra "classe A; classe B" e "classe A :: B"
- 7. Qual è la differenza tra una classe astratta e un'interfaccia?
- 8. Differenza tra una classe e un oggetto in JavaScript
- 9. Differenza tra Private Sub, Funzione e Classe
- 10. Differenza tra classe astratta e Trait
- 11. Differenza tra classe caso e oggetto caso?
- 12. .NET: come creare una classe tale che solo un'altra classe specifica possa istanziarla?
- 13. Qual è la differenza tra una classe statica e una classe normale?
- 14. Differenza tra una "coroutine" e una "discussione"?
- 15. Differenza tra nuovo e ignorare
- 16. differenza tra toggleclass e addclass
- 17. C'è una differenza tra RPC e IPC?
- 18. Esiste una differenza tra log4net.Config.BasicConfigurator.Configure() e log4net.Config.XmlConfigurator.Configure()?
- 19. C'è una differenza tra gluLookAt() e glFrustum()?
- 20. Javascript: differenza tra una frase e un'espressione?
- 21. Esiste una differenza tra System.Windows.Clipboard e System.Windows.Forms.Clipboard?
- 22. C'è una differenza tra (function() {...}()); e (function() {...})() ;?
- 23. C'è una differenza tra MsgBox e MessageBox.Show?
- 24. Differenza tra le specifiche e una politica?
- 25. C'è una differenza tra readonly e {get; }
- 26. C'è una differenza tra! == e! = In PHP?
- 27. C'è una differenza tra DictionarySectionHandler e NameValueSectionHandler?
- 28. differenza tra pty e una pipe
- 29. C'è una differenza tra $ (e.currentTarget) e $ (this)?
- 30. C'è una differenza tra "è" e isKindOfClass()?
può essere un sito alternativo StackExchange ha [questa risposta] (http://programmers.stackexchange.com/questions/53181/what-is-the-difference-between-instantiating- e-caricamento-a-class-in-java). È troppo ampio – NINCOMPOOP
@TheNewIdiot Non penso che la domanda sia ampia poiché ha uno scopo molto specifico e anche una risposta specifica. –
SO definisce anche ** ampio ** come * le risposte positive sarebbero troppo lunghe per questo formato. * !!! – NINCOMPOOP