Ist es möglich, umfangreiche Java-Programme ohne eine einzige import
-Anweisung zu schreiben?
Ja, Imports sind immer optional, da man auch den voll qualifizierten Namen von Referenztypen verwenden kann.
import java.util.Arrays.sort; int[] a = {4,1,3}; sort(a);
Fügen Sie ein Schlüsselwort an der richtigen Stelle ein, damit der Code funktioniert.
Eine import
-Anweisung muss immer wo stehen?
Ganz am Anfang der Quellcodedatei (aber unter der package
-Deklaration).
In den Fragen zu vorherigen Kapiteln haben wir immer java.awt.Point
als Typ verwendet statt Point
. Weshalb haben wir das gemacht und was muss man tun, um einfach direkt Point
schreiben zu können?
Wir haben java.awt.Point
nicht importiert (um eine Zeile zu sparen), deshalb mussten wir den voll qualifizierten Klassennamen angeben. Wenn man den import import java.awt.Point;
schreibt, kann man danach auch einfach Point
schreiben.
Warum ist import
ein irreführender Name? Tatsächlich organisiert man über import
nur ___räume!
Es geht um Namensräume.
import java.awt.Point; class Point { int x,y,z; } Point p = new Point();
Problem?
Point
ist an dieser Stelle mehrdeutig, da es eine lokale Klasse und eine importierte Klasse gibt.
import java.awt.*; Point p;
Geht das gut?
Ja, da Point
in dem Paket java.awt
definiert ist und der *
alle Klassen (und Interfaces und Enums) in dem Paket importiert.
Hinweis: Der importiert *keine Klassen die in Unterpaketen des angegebenen Pakets liegen, also z.B. in
java.awt.color
.
Was ist der Unterschied von import de.thm.mni;
und import de.thm.mni.*;
?
Im ersten Fall soll eine Klasse namens mni
aus dem Paket de.thm
importiert werden, der zweite Ausdruck importiert alle Klassen in de.thm.mni
.
import static java.awt.Color.*
Jetzt darf ich Color c = new Color(0,0,0);
deklarieren, richtig?
Nein, weil der Import nur alle öffentlichen Member der Klasse Color
importiert, nicht aber die Klasse selbst.
Wozu braucht man auf S.372 oben am Anfang die Codezeile import java.awt.Color;
wenn unten darunter import static java.awt.Color.*;
steht?
Der erste import
importiert die Klasse Color
. Der zweite import
ist static
und importiert die statischen Members von Color
.
Was muss man tun, damit man die Methoden der Klasse Math
direkt ohne den Anteil Math.
in seinem Code verwenden kann?
import static java.lang.Math.*;
Kann ich die Klasse java.awt.Color
und eine Klasse de.thm.mni.Color
zusammen im gleichen Stück Code verwenden?
Ja, man darf aber nur eine dieser Klassen importieren. Die andere muss man über den voll qualifizierten Namen ansprechen.
Man kann import static java.lang.System.out;
schreiben. Dann geht doch auch import static java.lang.System.out.println;
, oder?
Nein, das geht nicht, weil out
ein Objekt ist. Man kann keine Methoden aus einem Objekt importieren.
Was ist der Unterschied von import de.thm.mni.OOP;
zu import static de.thm.mni.OOP;
Der erste import importiert die Klasse OOP
aus dem Paket de.thm.mni
. Der zweite importiert etwas mit Namen OOP
aus der Klasse mni
im Paket de.thm
.
Sie schreiben ein Programm im Fachbereich MNI der THM im Kurs OOP. Sie definieren ein Paket für Ihr Programm. Wie sollte der Paketname anfangen?
de.thm.mni.oop
Die Option -cp
bei java
bzw. javac
steht für welches Java-Konzept?
Diese Option steht für den Classpath, in dem die JVM nach .class
-Files sucht.
Welche Argumente müssen sie an java
übergeben, wenn sie eine eigene Klasse main.Main
ausführen wollen, die das Paket somePackage.jar
verwendet? In welchen Ordnern sucht die JVM dabei nach der .class
-Datei von main.Main
und der Datei somePackage.jar
?
java -cp somePackage.jar:. main.Main
Die JVM sucht nach main.Main
sowohl als ./main/Main.class
als auch als somePackage.jar!main/Main.class
(das !
steht dafür, dass das JAR-Archiv geöffnet und betreten wird). Die Datei somePackage.jar
wird dabei im current working directory gesucht, in dem man sich auf der Konsole gerade befindet.
Wenn somePackage.jar
in einem Unterordner libs
liegen würde, müsste der Aufruf wie folgt aussehen: java -cp libs/somePackage.jar:. main.Main
.
Herr Kofler macht zusätzlich Anführungszeichen um den Ausdruck hinter -cp
. Das ist immer möglich aber nur dann nötig, wenn sich im übergebenen Klassenpfad ein Leerzeichen befindet.