2013-07-17 10 views
7

Dlaczego nie podajemy pliku filename.class po komendzie java, zamiast tylko filename?Dlaczego nie używamy rozszerzenia .class z komendą "java"?

Załóżmy, że chcemy skompilować program test.java, a następnie uruchomimy javac test.java. Jest dobrze!

Po tym zostanie wyprodukowany plik test.class, ale aby uruchomić program, uruchomimy java test zamiast java test.class. Jaki jest tego powód?

+2

ostatecznie, bo tak właśnie jest ono przeznaczone. Mógł zostać zaprojektowany inaczej, ale, jak sugerują poniższe odpowiedzi, sczepianie na ".class" pomyliloby parsowanie nazwy paczki i bez wątpienia kilka innych rzeczy. Dla takich rzeczy nigdy nie ma "logicznego" projektu, tylko niektóre projekty, które są mniej nielogiczne niż inne. –

Odpowiedz

20

Ponieważ użytkownik nie opisuje pliku , aby uruchomić plik. Mówisz Javie, która klasa zawiera główną metodę - a nazwa klasy to (w twoim przypadku) filename, a nie filename.class.

Fakt, że kod bajtowy jest prawie zawsze zawarty w plikach w systemie plików, jest szczegółem implementacji. Ścieżka klas przekazywana do komendy java mówi, aby gdzie klasa szukała klas, a następnie argument głównej klasy określa, której klasy użyć.

(Jest inna dla javac, ponieważ ten program specjalnie bierze source plików i zestawia je do kodu bajtowego.)

+0

Warto wspomnieć, że kod może znajdować się w pliku JAR lub w innym miejscu w ścieżce klas. – bstempi

6

Nie przekazać nazwę pliku do polecenia java albo. Podajesz mu w pełni kwalifikowaną nazwę klasy. Coś w rodzaju com.yourcompany.yourapp.Main. Java następnie znajduje plik .class dla tej nazwy klasy, przeglądając wszystkie katalogi i pliki jar w ścieżce klas.

1

To szczegół implementacji. System ładujący klasy Java może zostać rozszerzony o niestandardowy kod, aby działał inaczej. Na przykład niektóre firmy napisały zaszyfrowane programy ładujące klasy, które mogą odszyfrowywać i ładować zaszyfrowane pliki klas w locie. Można hipotetycznie stworzyć podobny system, który łączy kilka klas razem w coś przypominającego zespół .NET zamiast pliku Jar (który jest tak naprawdę tylko plikiem zip).

0

podczas wykonywania "java test.class"

dostać albo

Could not find or load main class test.class

lub

Exception in thread "main" java.lang.NoClassDefFoundError: test/class

To dlatego "java" w "java test.class" jest jvm. Wyszukuje główną metodę w klasie o nazwie "class" zamiast "test". Kropka w "java test.class" ma znaczące znaczenie. Tak więc, jak wygląda jvm na "java test.class", w pakiecie o nazwie "test", szuka klasy języka Java o nazwie "class".

*test.class* 

*test* - package name 

*class* - java filename 

Mam nadzieję, że to pomoże!

-1

Javac kompilator tworzy plik o nazwie Xyz.class (Tutaj XYZ FileName) że zawiera wersję bajtowy programu Java Bytecode jest niczym innym jak pośrednim reprezentacja programu, który zawiera instrukcje interpreter Javy będzie wykonywał.
zatem wyjście javac nie jest kod, który może być wykonywany bezpośrednio

w skrócie kluczowe javac służy do kompilowania programu Java jeśli używamy .class z javac (już skompilowanego pliku .class pliku), a następnie Jak można skompilować już skompilować plik

więc prawidłowa składnia jest: Javac Xyz.java (skompilować program Java) java xyz (uruchomić program Java)

+0

To nie odpowiada na pytanie. Po prostu brakuje punktu, w którym 'java' nie jest wywoływany, aby uruchomić PLIK, ale KLASĄ. A nazwy klas nie zawierają rozszerzenia nazw plików .class. – GhostCat

Powiązane problemy