2013-06-03 1 views
5

se dico:classi importazione utilizzando i caratteri jolly

import java.awt.event.ActionListener; 

ho ottenere la classe ActionListener. Se dico:

import java.awt.event.*; 

ho la classe di eventi tra cui ActionListener? O meglio ancora:

import java.awt.*; 

ho pensato che se hai inserito una classe, come negli ultimi due esempio, che è stato importato in modo efficace quella classe e ha ereditato tutte le sue sottoclassi. Tuttavia, quando utilizzo solo l'ultima riga, ad esempio, Eclipse mostra spesso errori che dicono che non è possibile risolvere determinati elementi e suggerisce di includere sia java.awt e java.awt.event.

+4

L'uso di 'import java.awt. *' Importerà solo le classi nel pacchetto 'java.awt' (se presente). Nota che il carattere jolly '*' non è ricorsivo per pacchetti. –

+2

I tuoi ultimi due esempi non "includono classi", essi * importano pacchetti. * – EJP

risposta

5

Le importazioni "jolly" in Java funzionano solo al livello immediato in cui vengono implementate le classi.

Cioè, se si dispone di classi A, B e C, con nomi completi:

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

quindi importando com.foo.bar.* consentirà l'accesso a A e B senza ulteriori; ma C NON sarà disponibile.

Analogamente, importando com.foo.* comprenderanno facilmente avere C disponibile, ma non A e B.

Ora:

ho pensato che se hai inserito una classe, come negli ultimi due esempio, che è stato importato in modo efficace quella classe e ha ereditato tutte le sue sottoclassi.

Non funziona. Anche se B "eredita" A, se si sceglie di utilizzare l'importazione completa com.foo.bar.A, NON verrà importata automaticamente com.foo.bar.B. Dovrai importare B separatamente. Il che ha senso: nulla impone l'implementazione di un'interfaccia o di una classe astratta nello stesso pacchetto della loro interfaccia di base/classe di base, per esempio; e nello stesso progetto, potresti avere due classi chiamate B, in diversi pacchetti: cosa dovrebbe fare il compilatore?

Ora, in base alle convenzioni di stile di codifica, che si compensano o si devono rispettare nel proprio ambiente di lavoro, tali importazioni di caratteri jolly possono essere semplicemente e semplicemente vietate e sarà necessario importare A e B separatamente. Per quanto riguarda le importazioni statiche, hanno altri problemi ...

Infine, si noti che, per impostazione predefinita, è possibile utilizzare tutto java.lang.* senza dover dichiarare un'importazione.

+0

Vedo. Grazie. Ad ogni modo di importare nel senso che stavo descrivendo? – sherrellbc

+1

OK, capisco. Se, qui, B estende A, quindi 'importa com.foo.bar.A; 'NON ti darà accesso a B. Devi importare B separatamente. Il che ha senso: nulla impone l'implementazione di un'interfaccia o di una classe astratta nello stesso pacchetto della loro interfaccia di base/classe di base (fortunatamente!) (Risposta modificata di conseguenza) – fge

3

java.awt.* è diverso con java.awt.event.*, il primo sarà importare tutte le classi all'interno java.awt pacchetto, mentre il secondo potrà importare tutte le classi all'interno java.awt.event, l'importazione sarà solo classi importazione, non pacchetti.

3

Dalle Esercitazioni Java: Apparent Hierarchies of Packages

In un primo momento, i pacchetti sembrano essere gerarchica, ma non sono. Ad esempio, l'API Java include un pacchetto java.awt, un pacchetto java.awt.color, un pacchetto java.awt.font e molti altri che iniziano con java.awt. Tuttavia, il pacchetto java.awt.color, il pacchetto java.awt.font e altri pacchetti java.awt.xxxx non sono inclusi nel pacchetto java.awt. Il prefisso java.awt (Java Abstract Window Toolkit) viene utilizzato per un numero di pacchetti correlati per rendere evidente la relazione, ma non per mostrare l'inclusione.

Importazione java.awt.* importa tutti i tipi nel pacchetto java.awt, ma non importa java.awt.color, java.awt.font, o di qualsiasi altro java.awt.xxxx pacchetti. Se si prevede di utilizzare le classi e altri tipi di java.awt.color così come quelli in java.awt, è necessario importare entrambi i pacchetti con tutti i loro file:

import java.awt.*;

import java.awt.color.*;

3

ricordare che il la dichiarazione di importazione è solo per comodità. È lì per rendere possibile l'utilizzo del nome breve di una classe piuttosto che del nome completo.

La struttura del nome del pacchetto in Java corrisponde a una struttura di directory. Così si può pensare ad esso come una directory chiamata java e in quella directory ci sono diverse altre directory come AWT e io ecc

Quando si dice

import java.awt.*; 

si sono sostanzialmente dicendo che si desidera utilizzare il nome breve per tutte le classi nella directory chiamata awt all'interno della directory chiamata java. Quindi, se si utilizza un nome di classe nel codice come questo:

List mylist; 

Poi il compilatore tenterà di trovare sia una classe denominata List nel pacchetto corrente o una classe denominata java.awt.List.

Quindi, se si dispone di una directory all'interno della directory awt denominata evento e si dispone di una classe denominata ActionEvent in quella directory, il nome completo è:

java.awt.event.ActionEvent 

e l'istruzione import di cui sopra non aiutare.Di qui la ragione per bisogno di un altro istruzione import

import java.awt.event.*; 

Ora, se si utilizza la classe ActionEvent il compilatore cerca una classe denominata ActionEvent nella directory corrente, o java.awt.ActionEvent o java.awt.event.ActionEvent finché non ne trova uno.

+0

+1 Risposta piacevole. –

2

Dalla documentazione di Sun sulla Using Package Members:

In un primo momento, i pacchetti sembrano essere gerarchica, ma non lo sono. Ad esempio, l'API Java include un pacchetto java.awt, un pacchetto java.awt.color, un pacchetto java.awt.font e molti altri che iniziano con java.awt. Tuttavia, il pacchetto java.awt.color, il pacchetto java.awt.font e gli altri pacchetti java.awt.xxxx non sono inclusi nel pacchetto java.awt. Il prefisso java.awt (Java Abstract Window Toolkit) viene utilizzato per un numero di pacchetti correlati per rendere evidente la relazione, ma non per per mostrare l'inclusione.

Importazione java.awt. * Importa tutti i tipi nel pacchetto java.awt, ma non importa java.awt.Color, java.awt.font, o di qualsiasi altro pacchetti java.awt.xxxx . Se si prevede di utilizzare le classi e altri tipi a java.awt.Color così come quelli in java.awt, è necessario importare entrambi pacchetti con tutti i loro file:

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

Se avete tempo , probabilmente farai bene a leggere il the entire Packages trail dal sole che approfondisce le nozioni di base e concetti più complessi. Dalla lingua nella tua domanda, in cui ti riferisci alle second import statement che includono particolari classi, sembra che tu non stia capendo che in realtà ti stai riferendo ai pacchetti.

+0

Pacchetti di lezioni? Ho mescolato il mio gergo. Iniziato da Java, da C, pochi giorni fa. – sherrellbc

+0

"Ricevo la classe di eventi incluso ActionListener? O meglio ancora:" "Ho pensato che se si includesse una classe, come negli ultimi due esempi, si importasse effettivamente quella classe e ereditata tutte le sue sottoclassi." Se avevi mescolato il tuo gergo, va bene, ma quelle frasi hanno fatto sembrare che ti stavi riferendo inizialmente ai pacchetti come classi. – ojintoad