2013-06-03 17 views
5

Jeśli powiem:importowanie klas przy użyciu symboli wieloznacznych

import java.awt.event.ActionListener; 

uzyskać klasę ActionListener. Jeśli powiem:

import java.awt.event.*; 

uzyskać klasę zdarzeń tym ActionListener? Albo jeszcze lepiej:

import java.awt.*; 

Pomyślałem, że jeśli włączone klasę, podobnie jak w dwóch ostatnich przykład, że można skutecznie importowane tej klasy i odziedziczył wszystkie jego podklasy. Ale, kiedy używam tylko ostatniego wiersza, na przykład, Eclipse często pokazuje błędy, mówiąc, że nie może rozwiązać niektórych elementów i sugeruje, aby dołączyć zarówno java.awt i java.awt.event.

+4

Użycie 'import java.awt. *' Spowoduje zaimportowanie tylko tych klas w pakiecie 'java.awt' (jeśli są dostępne). Zauważ, że '*' wieloznacznik nie jest rekursywny dla pakietów. –

+2

Twoje dwie ostatnie próbki nie zawierają "klas", one * importują pakiety. * – EJP

Odpowiedz

5

Przywóz "wieloznaczny" w Javie działa tylko na najbliższym poziomie, na którym są zaimplementowane klasy.

Oznacza to, że jeśli masz zajęcia A, B i C, w pełni kwalifikowanych nazw:

  • com.foo.bar.A;
  • com.foo.bar.B;
  • com.foo.C;

następnie importowanie com.foo.bar.* umożliwi dostęp do A i B bez dalszych ceregieli; ale C NIE będzie dostępny.

W tym samym stylu importowanie com.foo.* będzie łatwo dostępne pod numerem C, ale nie pod numerem A i B.

Teraz:

Pomyślałem, że jeśli włączone klasę, podobnie jak w dwóch ostatnich przykład, że można skutecznie importowane tej klasy i odziedziczył wszystkie jego podklasy.

Nie dotyczy. Nawet jeśli B "dziedziczy" A, jeśli zdecydujesz się użyć w pełni kwalifikowanego importu com.foo.bar.A, NIE BĘDZIE automatycznie importować com.foo.bar.B. Musisz oddzielnie zaimportować B. Co ma sens: nic nie zmusza implementacji interfejsu lub klasy abstrakcyjnej do tego samego pakietu, co ich interfejs bazowy/klasa bazowa, dla jednego; i w tym samym projekcie, możesz mieć dwie klasy o nazwie B, w różnych pakietach: co powinien zrobić kompilator?

Teraz, zgodnie z konwencjami stylu kodowania, które albo samemu sobie nadrabiamy, albo muszą być przestrzegane w środowisku pracy, takie importowanie symboli wieloznacznych może być czysto i zwyczajnie zabronione, a będziesz musiał oddzielnie zaimportować A i B. Jeśli chodzi o import statyczny, mają inne problemy ...

Należy pamiętać, że domyślnie można użyć wszystkich java.lang.* bez konieczności zadeklarowania importu.

+0

Rozumiem. Dziękuję Ci. W każdym razie importować w sensie, który opisałem? – sherrellbc

+1

OK, rozumiem. Jeśli tutaj B rozszerza A, to 'import com.foo.bar.A;' NIE da ci dostępu do B. Będziesz musiał zaimportować B osobno. Co ma sens: nic nie zmusza implementacji interfejsu lub klasy abstrakcyjnej do tego samego pakietu, co ich bazowy interfejs/klasa podstawowa (na szczęście!) (Odpowiednio zredagowana odpowiedź) – fge

3

java.awt.* różni się java.awt.event.*, pierwsza z nich będzie importować wszystkie klasy w ciągu java.awt pakietu, natomiast drugi będzie importować wszystkie klasy w ciągu java.awt.event funkcja import tylko będziesz zajęcia importu, a nie pakietów.

3

Od tutoriali Java: Apparent Hierarchies of Packages

Początkowo pakiety wydają się być hierarchiczna, ale nie są. Na przykład Java API zawiera pakiet java.awt, pakiet java.awt.color, pakiet java.awt.font i wiele innych rozpoczynających się od java.awt. Jednak pakiet java.awt.color, pakiet java.awt.font i inne pakiety java.awt.xxxx nie są zawarte w pakiecie java.awt. Przedrostek java.awt (zestaw narzędzi Java Abstract Window Toolkit) jest używany do wielu powiązanych pakietów, aby związek był widoczny, ale nie pokazywał włączenia.

Importowanie java.awt.* importuje wszystkich typów w pakiecie java.awt, ale to nie importuje java.awt.color, java.awt.font lub innych java.awt.xxxx pakiety. Jeśli planujesz używać klas i innych typów w java.awt.color jak również te, w java.awt, należy zaimportować oba pakiety ze wszystkich swoich plików:

import java.awt.*;

import java.awt.color.*;

3

Pamiętaj, że Instrukcja importowania służy jedynie wygodzie. Dzięki temu możesz używać krótkiej nazwy klasy, a nie pełnej nazwy.

Struktura nazwy pakietu w Javie odpowiada strukturze katalogów. Więc można myśleć o nim jako o nazwie java i katalogów w tym katalogu istnieje kilka innych katalogów, takich jak AWT i IO itp

Kiedy mówisz

import java.awt.*; 

są w zasadzie powiedzieć, że chcesz używać krótka nazwa dla wszystkich klas w katalogu o nazwie awt wewnątrz katalogu o nazwie java. Więc jeśli używasz nazwę klasy w kodzie tak:

List mylist; 

Następnie kompilator będzie próbował znaleźć zarówno klasę o nazwie Lista w obecnym opakowaniu lub klasę o nazwie java.awt.List.

Więc jeśli masz katalog wewnątrz katalogu AWT zwanego wydarzenie i masz klasę o nazwie ActionEvent w tym katalogu, pełna nazwa brzmi:

java.awt.event.ActionEvent 

oraz oświadczenie import powyżej nie pomaga.Stąd powodem konieczności kolejnego instrukcji import

import java.awt.event.*; 

Teraz, jeśli użyć klasy ActionEvent kompilator wygląda dla klasy o nazwie ActionEvent w bieżącym katalogu, lub java.awt.ActionEvent lub java.awt.event.ActionEvent dopóki go nie znajdzie.

+0

+1 Dobra odpowiedź. –

2

z dokumentacji firmy Sun na Using Package Members:

Początkowo pakiety wydają się być hierarchiczna, ale nie są. Na przykład interfejs API Java zawiera pakiet java.awt, pakiet java.awt.color, pakiet java.awt.font i wiele innych rozpoczynających się od java.awt. Jednak pakiet java.awt.color, pakiet java.awt.font i inne pakiety java.awt.xxxx nie są zawarte w pakiecie java.awt. Przedrostek java.awt (zestaw narzędzi Java Abstract Window Toolkit) jest używany do liczby powiązanych pakietów w celu zapewnienia widoczności, ale nie w celu wyświetlenia integracji, ale nie w przypadku obiektu .

Importowanie java.awt. * Importuje wszystkich typów w pakiecie java.awt, ale nie importuje java.awt.color, java.awt.font lub innych pakiety java.awt.xxxx . Jeśli masz zamiar użyć klas i innych rodzajów w java.awt.color jak i te w java.awt, trzeba importować zarówno pakiety ze wszystkich swoich plików:

import java.awt.*; 
import java.awt.color.*; 

Jeśli masz czas , prawdopodobnie dobrze zrobisz, czytając the entire Packages trail ze słońca, które dokładnie omawia podstawy i bardziej skomplikowane koncepcje. Z języka w twoim pytaniu, w którym odnosisz się do drugich instrukcji importu, jako zawierających poszczególne klasy, brzmi to tak, jakbyś nie rozumiał, że faktycznie odnosisz się do pakietów.

+0

Pakiety zajęć? Zmiksowałem mój żargon. Rozpocząłem java, od C, kilka dni temu. – sherrellbc

+0

"Otrzymuję klasę zdarzeń, w tym ActionListener, lub jeszcze lepiej:" "Pomyślałem, że jeśli włączysz klasę, tak jak w dwóch ostatnich przykładach, to skutecznie zaimportowałeś tę klasę i odziedziczyłeś wszystkie jej podklasy." Jeśli zmieszałeś swój żargon, to dobrze, ale te zdania sprawiały, że wydawało ci się, że początkowo odnosiłeś się do pakietów jako klas. – ojintoad

Powiązane problemy