public class TestClass{
public static void main(String []args) {
TestClass t1 = new TestClass();
t1.anything();
}
}
Questo è un codice perfettamente valido. Quando viene chiamato il metodo main
, non esiste alcuna istanza precedente di TestClass
(non è necessario, perché il metodo main
è static
).
public class Test2{
public Test2 clone(){
return new Test2();
}
}
Ciò è perfettamente valido pure. Quando crei una nuova istanza di Test2, contiene il metodo clone
, ma il metodo non viene eseguito automaticamente. Solo quando viene chiamato il metodo clone
, viene creata un'altra istanza di Test2.
public class MyLinkedList{
MyLinkedList next;
MyLinkedList(int elems){
if(elems>0){
next = new MyLinkedList(elems-1);
}else{
next = null;
}
}
}
è perfettamente valido e, anche se il costruttore crea una nuova istanza utilizzando lo stesso costruttore, perché la creazione è sorvegliata da un condizionale, in modo da creare un'istanza volte innesca una nuova creazione.
public class Fail{
public Fail(){
new Fail();
}
}
È l'unico esempio problematico qui. Il compilatore non si lamenta. È possibile convertire in byte code e può essere eseguito. Alla fase di esecuzione, tuttavia, si causa un overflow dello stack:
- un nuovo Fail allocato
- suo costruttore no-arg è chiamato
- il costruttore cerca di creare un nuovo Fail
- un nuovo Fail allocata
- suo costruttore no-arg è chiamato
- ...
Il c ompiler permette questo, perché, in generale, il compilatore non può impedire la ricorsione infinita. Il compilatore consente tutto ciò che può essere tradotto in bytecode.
Il compilatore, però, può emettere un avvertimento se rileva un metodo o una catena metodo di chiamate si incondizionatamente.
significa che tutti i metodi sono fuori dalla definizione della classe solo la variabile di classe viene creata quando viene creato un oggetto? –
@RaviKumarMistry. Non l'ho detto Solo il metodo principale può essere considerato virtualmente fuori classe. Una classe contiene anche altri metodi oltre a quello principale. Sono solo nella tua classe e una parte del tuo stato di istanza. –
@RaviKumarMistry. L'unica ragione per cui dobbiamo inserire main all'interno di una classe, è che non possiamo avere metodi al di fuori di alcuna classe in Java. –