Warum verwenden wir nicht die Erweiterung .class mit dem Befehl "java"?

7

Warum geben wir die filename.class -Datei nicht nach java , sondern nur nach filename ?

Angenommen, wir möchten das Programm test.java kompilieren, dann führen wir javac test.java aus. Es ist in Ordnung!

Danach wird test.class file erzeugt, aber um das Programm laufen zu lassen, führen wir java test anstelle von java test.class aus. Was ist der Grund dafür?

    
anirban karak 17.07.2013, 15:06
quelle

5 Antworten

20

Weil Sie keine Datei zum Ausführen beschreiben. Sie sagen Java, welche Klasse die Hauptmethode enthält - und der Klassenname ist (in Ihrem Fall) filename , nicht filename.class .

Die Tatsache, dass der Bytecode fast immer in Dateien im Dateisystem enthalten ist, ist ein Implementierungsdetail. Der Klassenpfad, den Sie an den Befehl java übergeben, teilt ihm wo mit, nach Klassen zu suchen, und dann teilt ihm das Hauptklassenargument mit, welche Klasse verwendet werden soll.

(Für javac ist das anders, weil dieses Programm Quell- Dateien verwendet und sie in Bytecode kompiliert.)

    
Andrzej Doyle 17.07.2013 15:08
quelle
6

Sie übergeben auch keinen Dateinamen an den java-Befehl. Sie übergeben ihm einen vollständig qualifizierten Klassennamen. So etwas wie com.yourcompany.yourapp.Main . Java sucht dann nach der .class-Datei für diesen Klassennamen, indem er alle Verzeichnisse und JAR-Dateien im Klassenpfad durchsucht.

    
JB Nizet 17.07.2013 15:09
quelle
1

Es ist ein Implementierungsdetail. Das Java-Klassenladeprogramm kann um benutzerdefinierten Code erweitert werden, damit es sich anders verhält. Zum Beispiel haben einige Unternehmen verschlüsselte Klassenladeprogramme geschrieben, die in der Lage sind, verschlüsselte Klassendateien im laufenden Betrieb zu entschlüsseln und zu laden. Sie könnten hypothetisch ein ähnliches System erstellen, das eine Reihe von Klassen in etwas zusammenfasst, das einer .NET-Assembly ähnelt, anstatt einer Jar-Datei (die wirklich nur eine Zip-Datei ist).

    
Mike Thomsen 17.07.2013 15:19
quelle
0

, wenn Sie " java test.class "

ausführen

Sie erhalten entweder

  

Die Hauptklasse test.class

konnte nicht gefunden oder geladen werden

oder

  

Ausnahme im Thread "main" java.lang.NoClassDefFoundError: test / class

Dies liegt daran, dass " java " in " java test.class " jvm ist. Es sucht nach der Hauptmethode in der Klasse " class " anstelle von " test ". Punkt in " java test.class " hat eine signifikante Bedeutung. So wie jvm auf " java test.class " schaut, sucht sie in einem Paket namens " test " nach einer Java-Klasse namens " class ".

%Vor%

Hoffe das hilft !!

    
puvi 09.01.2016 00:38
quelle
-1

Der Javac Compiler erzeugt eine Datei namens Xyz.class (hier ist Xyz FileName) das enthält die Byte-Version des Programms Java Bytecode ist nichts anderes als eine Zwischenrepräsentation Ihres Programms, die Anweisungen enthält, die der Java-Interpreter ausführen wird.
Daher ist die Ausgabe von javac kein Code, der direkt ausgeführt werden kann

Kurz gesagt, das Schlüsselwort javac wird für das Programm Compile the Java verwendet Wenn wir .class mit javac verwenden (Bereits kompilierte Datei .class File) dann Wie kann compile compile bereits kompiliert werden

so gültige Syntax ist: Javac Xyz.java (Kompiliere das Java-Programm) Java Xyz (Führen Sie das Java-Programm aus)

    
Mr.Bhavadip Gothadiya 08.09.2017 10:58
quelle

Tags und Links