2016-04-19 23 views
9

La classe oggetto è la classe base di ogni classe, vale a dire che ogni classe estende la classe Object. Esiste un metodo String toString() pubblico nella classe Object e lo stesso metodo è presente anche nella classe String. Ora, la classe String estende anche la classe Object e il metodo toString restituisce un tipo String.Com'è compilato il metodo toString() della classe Object in java?

La mia domanda è: Durante la compilazione della classe Object, cercherà String.class e la classe String cercherà Object.class creando un tipo di interdipendenza. Come viene risolta questa dipendenza? Come funziona il meccanismo di compilazione? Per favore correggimi se sbaglio da qualche parte.

+0

Non so come acquistare Java supporta questo tipo di ciclo di riferimento in qualsiasi classe. Ecco perché non è possibile compilare un file java senza classpath. Il compilatore ispeziona altre classi quando necessario. – aalku

+0

in java non c'è niente di sbagliato nell'avere una classe A di importazione B; e un'importazione A di classe B; (e in altre lingue ci sono dichiarazioni in avanti) – Exceptyon

+0

È lo stesso che compilare altre due classi che si richiamano l'una con l'altra. – SomeJavaGuy

risposta

4

Il compilatore Java è un Multi-Pass Compiler. Ciò significa che ci sono passi incrementali nella procedura di compilazione. Durante la compilazione di Object, utilizza una rappresentazione temporanea di String in modo da consentire la compilazione di Object.

È possibile confrontare la rappresentazione temporanea con una sorta di interfaccia nascosta. Il compilatore compila su quell'interfaccia. Solo a runtime le parti compilate si uniscono - il compilatore non ha bisogno di una classe completamente compilata per compilare un'altra classe, solo un'astrazione di essa.

+0

Anche se non si adatta perfettamente, si potrebbe aggiungere un riferimento ai passaggi di compilazione e [collegamento] (https://en.wikipedia.org/wiki/Linker_%28computing%29) che viene fatto per altre lingue. Il compilatore "presuppone" di avere tutto ciò di cui ha bisogno. Il linker in realtà "risolverà i collegamenti" (e riverserà tutti questi * errori di riferimento * non definiti) – Marco13

2

In realtà, mentre si scrive tali codici:

public class Class1 
{ 
public Class2 giveClass2() 
{ 
    return new Class2(); 
} 
} 
public class Class2 : Class1 { } 

Compila correttamente perché non istanziare nulla. Il compilatore controlla solo se i tipi che usi sono definiti o meno.

Tuttavia, se si scrive come qui sotto:

public class Class1 
    { 
     public Class1(){ 
      aClass2 = new Class2(); 
     } 
     public Class2 aClass2; 
    } 

    public class Class2 : Class1 
    { 

    } 

questo riceverà anche compilato, ma provoca stack overflow in fase di esecuzione, perché poi il ciclico impatto dipendenze.

Problemi correlati