# Was ist "default package" in Eclipse konkret?



## ernst (20. Nov 2007)

Hallo allerseits,
1) Wenn man in Eclipse ein package erzeugt, z.B. mypack1, wird automatisch in der erste Zeile der java-Datei erzeugt:
package mypack1

2) Wenn man in Eclipse _kein_ package erzeugt (anlegt), wird ein sogenanntes "default package" erzeugt.
Aber wo wird dann dieses package bezeichnet?
Oben bei 1) wird es mypack1 bezeichnet, aber wie heißt es bei "default package"?

mfg
Ernst


----------



## Tobias (20. Nov 2007)

"default package" enthält alle Klassen OHNE package-Anweisung.

mpG
Tobias


----------



## ernst (20. Nov 2007)

Danke für deinen Beitrag.
1) Was meinst du mit 
"default package" enthält alle Klassen OHNE package-Anweisung?
Ich kann mir darunter nichts vorstellen. was ist "default package" konkret (ein Ordner, oder was).
Eine java-Datei kann Klassen enthaten, aber wie "default package" ?

2) Angenommen, mein mit Eclipse angelegtes Projekt (Verzeichnis) heißt Test und darunter sind die von Eclipse angelgten Verzeichnisse: 
bin und src
Angenommen darunter gibt es die java-Datei maintest.java. Dort gibt es keine package-Anweisung in der ersten Zeile.
Kannst du mir daran (an diesem Szenario) erklären was du meinst?

mfg
Ernst


----------



## ms (20. Nov 2007)

Wenn eine Klasse keine package-Angabe als erste Anweisung hat, dann liegt sie direkt im src-Verzeichnis. Das heist, sie befindet sich in keinem package. Und dieses "kein package" zeigt eclipse als "default package" an.

ms


----------



## Tobias (20. Nov 2007)

"bin" ist einfach ein Ordner. Darunter beginnen die Packages, die vom derzeitigen Standard-Classloader auf Verzeichnisse abgebildet werden, dass aber nicht sein müssen - du kannst dir jederzeit einen Classloader schreiben, der Packages anders abbildet. Packages sind lediglich Ordnungsmittel (man kann sie sich auch als Namensräume vorstellen). Eine Klasse, die nicht in einem Package liegt, befindet sich im "Default Package", dass ist der Ort, an dem der Classloader standardmäßig Klassen sucht. Beim Standard-Classloader ist das das Verzeichnis, das man ihm beim Aufruf übergeben hat (in Eclipse eben "bin").

Der Standard-Classloader geht in etwa so vor:

Ordner entgegen nehmen, in dem gesucht wird ("bin" in Eclipse)
qualifizierten Klassennamen entgegen nehmen (package-Name + Klassenname, also etwa java.lang.Object)
qualifizierten Klassennamen aufsplitten in Package und Klassenname
Wenn Package-Name nicht leer, Package-Namen nach Subpackages hin aufsplitten ("java", "lang")
Für jedes Subpackage einen entsprechend benannten Ordner unterhalb des Ordners des Oberpackages suchen, beginnend mit dem übergegebenen Verzeichnis ("bin")
Im untersten Package-Ordner muss eine Datei mit dem selben Namen wie die Klasse und der Endung ".class" liegen
Datei einlesen und interpretieren.

Für das Default-Package entfällt der ganze Ordner-suchen-Krams, hier wird die Datei direkt im übergebenen Ordner gesucht ("bin").

mpG
Tobias


----------



## ernst (20. Nov 2007)

>Eine Klasse, die nicht in einem Package liegt, befindet sich im "Default Package", dass ist der Ort, 
>an dem der Classloader standardmäßig Klassen sucht. Beim Standard-Classloader ist das das 
>Verzeichnis, das man ihm beim Aufruf übergeben hat (in Eclipse eben "bin").
>
...
>
>Für das Default-Package entfällt der ganze Ordner-suchen-Krams, hier wird die Datei direkt 
>im übergebenen Ordner gesucht ("bin").
>
Ist dann (in diesem Beispiel) das Verzeichnis bin ("ist der Ort, an dem der Classloader 
standardmäßig Klassen sucht") der classpath, also der Pfad den man bei javac mit dem 
Schalter -cp angibt?

mfg
Ernst


----------



## Tobias (nicht eingeloggt) (21. Nov 2007)

Ja.

mpG
Tobias


----------



## ernst (21. Nov 2007)

>>Ist dann (in diesem Beispiel) das Verzeichnis bin ("ist der Ort, an dem der Classloader
>>standardmäßig Klassen sucht") der classpath, also der Pfad den man bei javac mit dem
>>Schalter -cp angibt?
>
>Ja. 
>
Ich habe gelesen:
Wenn ein Member mit dem Bezeichner protected versehen ist, dann ist es erlaubt in _allen_ Klassen im gleichen package darauf zuzugreifen.

Angenommen es gibt kein package (weil keines erzeugt wurde), also nur das Pseudopackage "default package"
Gilt dann die obige Aussage für das "default package" und was heißt das dann _konkret_?

mfg
Ernst


----------



## Tobias (21. Nov 2007)

Das heißt konkret, das jede Klasse im "default package" auf die als protected gekennzeichneten Elemente aller anderen Klassen im "default package" zugreifen kann. Das ist einer der Gründe, warum das "default package" nicht benutzt werden soll.

mpG
Tobias


----------



## ms (21. Nov 2007)

Und ausserdem kannst du keine Klassen aus dem default-package in einer Klasse importieren, die sich in einem package befindet.

Also: IMMER PACKAGES VERWENDEN!

ms


----------



## ernst (22. Nov 2007)

>Das heißt konkret, das jede Klasse im "default package" auf die als protected gekennzeichneten 
>Elemente aller anderen Klassen im "default package" zugreifen kann. Das ist einer der Gründe, 
>warum das "default package" nicht benutzt werden soll.
>
Habe etwas im Internet gestöbert und bin zu folgendem Ergebnis gekommen:
Wenn eine package-Anweisung fehlt, gehört die Klasse zum sogenannten default-package.
Klassen des default-package können ohne explizite import-Anweisung verwendet werden. 
Ein Java-Compiler braucht laut Spezifikation nur ein einziges default-package zur Verfügung zu stellen. Typischerweise wird dieses Konzept aber so realisiert, dass jedes Verzeichnis (in dem java-Dateien ohne die package-Anweisung verwendet werden), ein default-package ist.
Ist das alles korrekt?

mfg
Ernst


----------



## SlaterB (22. Nov 2007)

>  Wenn eine package-Anweisung fehlt, gehört die Klasse zum sogenannten default-package. 

korrekt

> Klassen des default-package können ohne explizite import-Anweisung verwendet werden. 

von anderen Klassen im default-package, also ganz normal 
(Klassen im eigenen package können immer ohne import verwendet werden)

von anderen packages aus können diese Klassen aber GAR NICHT, nicht mal mit import, verwendet werden (soweit ich weiß)

> Ein Java-Compiler braucht  [..]

keine Ahnung 

---------

> Das heißt konkret, das jede Klasse im "default package" auf die als protected gekennzeichneten Elemente aller anderen Klassen im "default package" zugreifen kann. Das ist einer der Gründe, warum das "default package" nicht benutzt werden soll. 

finde ich nicht, das gilt für jedes andere package auch,
allgemein kann man sagen, dass man aus diesem Grunde nicht tausende Klassen in einem package definieren, sondern ruhig unterschiedliche packages zur Strukturierung verwenden sollte,
aber eine spezielle Rolle hat das default package in diesem Punkt nicht


----------



## ernst (22. Nov 2007)

> Ein Java-Compiler braucht  [..]

keine Ahnung 
---------
In Eclipse kann man doch beliebig viele default-packages erstellen (für jedes Projekt ein default-package).
Heißt das dann, dass jedes Verzeichniss (hat jetzt nichts mit Eclipse zu tun) , das eine java-Datei enthält ein default-package ist?
Das ist mir noch absout unklar.

mfg
Ernst


----------

