2012-03-13 17 views
9

Powiedzmy, że w klasie istnieje kilka instrukcji importu. Kiedy generowany jest kod bajtowy dla tej klasy, co dzieje się z tymi instrukcjami importowania.Znaczenie kodu bajtu znacznika importu

Jeśli instrukcje importowania są ignorowane w czasie wykonywania, w jaki sposób są zależne od metod klas rozwiązanych w czasie wykonywania.

+4

Dlaczego nie przekonać się samemu? Napisz kilka wariantów klasy: jedna z poleganiem na klasach zewnętrznych, z których jedna opiera się na (na przykład) 'java.util.List' przez import, a druga opiera się na' List', ale używa jej w pełni kwalifikowanych (bez importu)). Następnie użyj 'javap -c' na każdym i zobacz, co wyjdzie. – yshavit

+1

W uzupełnieniu do komentarza @yshavit, podczas kompilacji użyj 'javac -g: none Foo.java', aby w ogóle nie generować informacji debugujących (np. Numerów linii) w plikach' .class', a następnie porównać wygenerowane '.class'es i będą one identyczne na poziomie bajtów i można to przetestować, uzyskując skrót dla każdego z nich. –

Odpowiedz

9

Celem instrukcji importowych jest ułatwienie życia czytelnikom (i autorom) kodu. Dlatego są one zastępowane przez odniesienia do w pełni kwalifikowanych nazw klas/metod w kodzie bajtowym. Niewykorzystane instrukcje importowania są ignorowane.

1

import w Javie jest tylko skrótem

tak, że jeśli import java.util.* nie trzeba pisać java.util.ArrayList w kodzie, ale można napisać ArrayList

1

import stwierdzenia są tam tylko dla kompilatora więc wie, jakie nazwy klas (lub statyczne nazwy metod) można uzyskać bez zastrzeżeń w kodzie (np. MyClass zamiast foo.bar.MyClass). Za kulisami jest to po prostu używane do rozstrzygnięcia w pełni kwalifikowanych nazw klas, które są następnie wykorzystywane w kodzie bajtowym.

+1

Służy do rozstrzygania niewykwalifikowanych nazw od * do * w pełni kwalifikowanych nazw. – EJP

+0

To właśnie miałem na myśli. Nie powinienem pisać w językach obcych, gdy jeszcze półśnie;) – Joey