2010-12-28 6 views
2

In Java gibt es zwei gültige Formen der import Erklärung:Was importiert eine Type-Import-on-Demand-Deklaration?

  • import java.lang.Math;
  • import java.lang.Math.*;

Bei letzterem ein Platzhalter verwendet wird. Dieses Formular wird als Typ-Import-on-Demand-Deklaration bezeichnet, aber wie unterscheidet es sich von dem vorherigen? Werden die Unterpakete von java.lang.Math importiert?

Was passiert, wenn Math wurden ein Typ (zum Beispiel, eine Klasse) — würde alle seine inneren Klassen importiert werden?

+1

'import java.lang.Math' ist redundant. Sie müssen keine Dinge in 'java.lang' importieren. – khelwood

+0

danke für deine antwort, ich bin mir bewusst, dass wir java.lang nicht importieren müssen aber meine frage ist was ist der unterschied zwischen zwei import-anweisungen –

Antwort

2

Nur sofort verschachtelte Typen werden importiert. Die Deklaration ist nicht rekursiv.

Dies funktioniert mit Typen zum Importieren innerer Klassen. Dies funktioniert auch mit statischem Import (für Importmethoden).

import static a.b.c.FooBar.*; 
1

Mit der Anweisung import java.util.ArrayList.*; Sie alle verschachtelten Klassen in ArrayList Klasse deklariert importiert.

Wenn Sie auch Methoden und const importieren möchten, zum Beispiel erklärt:

import static java.lang.Math.*; 

Dann können Sie die KonstantePI in Ihrem Code verwenden, anstatt sie durch Math.PI Referenzierung und die Verfahrencos() anstelle von Math.cos(). So zum Beispiel können Sie schreiben:

double r = cos(PI * theta); 
1

Die Aussage

import java.util.ArrayList.*; 

alle verschachtelten Klassen von Arraylist importiert, aber Arraylist selbst nicht. Da ArrayList keine (öffentlichen) verschachtelten Klassen hat, tut die Anweisung tatsächlich nichts.

Betrachten Sie jedoch die Schnittstelle Map, die die verschachtelte Klasse Map.Entry definiert. Wenn wir

import java.util.Map.*; 

am Anfang der Datei Java schreiben, können wir dann schreiben Entry<A,B> statt Map.Entry<A,B> auf diese verschachtelte Klasse zu verweisen.

Das Importieren von Membern von Klassen ist normalerweise am sinnvollsten, wenn Sie statische Importe verwenden. Dann importieren Sie keine verschachtelten Klassen, sondern statische Methoden und Variablen. Zum Beispiel

import static java.Math.*; 

werden alle statischen Konstanten und Methoden aus der Math Klasse importieren. Dann können Sie die statischen Methoden der Math Klasse verwenden, indem Sie z. sin(x) anstelle von Math.sin(x).

+0

geht es nicht nur um * verschachtelte klassen *, sondern auch * const * und * Methoden *. –

+0

@GiulioBiagini Nur wenn Sie 'import static' schreiben. Mit nur 'import' werden nur Klassen importiert. – Hoopje

+0

Aber okay, ich habe meine Antwort erweitert, obwohl das OP nicht nach statischen Importen gefragt hat. – Hoopje

3

import java.lang.Math.*;

Dadurch werden alle verschachtelten Klassen in der Math Klasse in der java.lang Paket erklärt importieren. Verweise auf verschachtelte Klassen können ohne die äußere Klasse angegeben werden (z. B. Foo für java.lang.Math.Foo).

import java.lang.Math;

Dies wird die Math Klasse im java.lang Paket importieren. Verweise auf geschachtelte Klassen müssten mit der äußeren Klasse angegeben werden (z. B. Math.Foo).

+0

Gibt es mehr Klassen innerhalb der Math-Klasse? –

+1

@bharatbhushan Nein. Es ist eine sinnlose Aussage, aber es ist syntaktisch gültig und könnte unter anderen Umständen verwendet werden. Stilistisch empfehle ich, alle Wildcard-Importe zu vermeiden. Eine moderne IDE hat eine Option, um Platzhalterimporte automatisch in einzelne Importe zu konvertieren, was sehr nützlich ist. –

4

Die documentation Zustände:

Hinweis: Eine andere, weniger verbreitete Form der Import können Sie die öffentlichen geschachtelten Klassen einer einschließenden Klasse importieren. Wenn beispielsweise die graphics.Rectangle-Klasse nützliche verschachtelte Klassen wie Rectangle.DoubleWide und Rectangle.Square enthält, können Sie Rectangle und seine verschachtelten Klassen mit den folgenden beiden Anweisungen importieren.

import graphics.Rectangle; 

import graphics.Rectangle.*; 

Beachten Sie, dass die zweite Importanweisung Rectangle nicht importiert.

import java.lang.Math.*; So importieren die Math Klasse nicht importieren.

HINWEIS: Sie können auch sehen Why is using a wild card with a Java import statement bad?

0

Grundsätzlich Math eine letzte Klasse ist, und es hat keine weiteren Unterklassen. Es gibt keinen Unterschied zwischen import java.lang.Math.* und import java.lang.Math Beide sind ein und dasselbe. Daher sehe ich hier nicht die Notwendigkeit, die erste Art von Import zu verwenden.