2013-05-06 4 views
6

Ho alcune domande su Java Compiler.Ho alcune domande sul compilatore Java

La mia directory corrente è come questa.

├── Hoge.java 
├── Sample.class 
├── Sample.java 
├── pattern01 
│   └── com 
│    └── cat 
│     └── Hoge.class 
└── pattern02 
    └── com 
     └── cat 
      └── Hoge.class 

----- ----- Sample.java

import com.cat.Hoge; 

public class Sample { 

    public static void main(String[] args) { 
     System.out.println("hello!"); 
     Hoge h = new Hoge(); 
     h.call(); 
    } 
} 

----- ----- pattern01

package com.cat; 

public class Hoge { 

    public void call() { 
     System.out.println("com.cat"); 
     System.out.println("pattern01"); 
    } 
} 

----- pattern02 -----

package com.cat; 

public class Hoge { 

    public void call() { 
     System.out.println("com.cat"); 
     System.out.println("pattern02"); 
    } 
} 

Ho compilato Sample.java in questo modo.

$ javac -cp pattern01 Sample.java 

E l'eseguo in questo modo.

$ java -cp .:pattern01 Sample 
hello! 
com.cat 
pattern01 

$ java -cp .:pattern02 Sample 
hello! 
com.cat 
pattern02 

Sia pattern01 che pattern02 sono normalmente terminati.

Ma ho compilato con pattern01. Perché il programma termina normalmente con pattern02?

Cosa controlla il compilatore? Il compilatore controlla solo il nome della classe?

risposta

8

Le classi vengono risolte in fase di esecuzione. Hai compilato la tua classe client (esempio) con una versione della classe Hoge nel classpath e l'hai eseguita con un'altra versione della classe. Poiché la classe è ancora compatibile (stesso pacchetto, stesso nome, stessa firma del metodo), tutto va bene.

Questo è ciò che consente di compilare classi con una data versione di una libreria (o JDK), ma di eseguirla con un'altra versione della stessa libreria (o del JDK). Se ciò non fosse possibile, sarebbe un incubo costruire librerie riutilizzabili, poiché ogni libreria dovrebbe essere compilata su ogni versione del JDK e su ogni versione di ogni libreria dipendente.