Universität Bayreuth
Mathematisches
Institut
Einleitung
Erste Schritte
Mail und News
Drucken
KDE
LaTeX/TeX
Linksammlung
Linuxtools
Netzwerk
Programmieren
Windows
X Window
Anträge
Kontakt
|
Java
Fragen zu Java
Hier werden einige Fragen zu Java beantwortet, die im Laufe von
verschiedenen Kursen gestellt wurden.
-
Unterschied: Arrays von Objekten
und Arrays von Standarddatentypen
Unterschied: Standarddatentypen und Klassen
Standarddatentypen (oder auch: elementare oder primitive Datentypen
genannt) sind:
boolean, char, byte, short,
int, long, float,
double
Standarddatentypen (wie z.B. int) erlauben im Gegensatz zu Klassen nicht,
objektabhängige Methoden für solche Variablen aufzurufen.
Außerdem haben solche Variablen auch keine objektabhängigen
Datenelemente. Ein Standarddatentyp kann auch keine
objektunabhängigen Datenelemente oder Methoden bereitstellen,
so dass kein Konzept der Objektorientierung (Klassen, Methoden,
Vererbung, Erben/Überschreiben von Methoden, ...) für
Standarddatentypen zur Verfügung steht.
Gemeinsames und Unterschiede beim Anlegen von Arrays
Die Festlegung der Variable als Array sowie das Festlegen der
Arraylänge geht beides Mal analog. Allerdings muss man
zusätzlich bei
einem Array von Objekten für jede Arraykomponente entweder den
Konstruktor aufrufen oder auf bereits erzeugte Objekte derselben
Klasse verweisen.
Grundsätzlich gilt bei allen Arrays, dass man die sofortige
Initialisierung durch Aufzählung mit Werten mit Hilfe von
anonymen Arrays auseinander ziehen kann.
Beispiel:
// sofortige Initialisierung durch Aufzählung
int [] zahlen = { 10, 3, 13 };
// alternativ: zuerst Datentyp als Array festlegen
int [] zahlen;
// dann mit anonymen Arrays später initialisieren
zahlen = new int[] { 10, 3, 13 };
Beispiel: Anlegen von Arrays mit Standarddatentypen bzw. Objekten
Aufgabe
|
Beispiel mit
Array von int-Werten
|
Beispiel mit
Array von Color-Werten
|
1) Variable als
Array festlegen
|
int [] zahlen;
|
Color [] farben;
|
2a) Array anlegen mit
vorgegebener Länge
|
zahlen = new int[10];
|
farben = new Color[10];
|
2b) Werte der Array-
komponenten setzen
|
for (int i = 0; i < zahlen.length; ++i)
zahlen[i] = i*10;
|
for (int i = 0; i < zahlen.length; ++i)
farben[i] = new Color(i, i+5, i+10);
|
3) Array mit vorgegebenen
Werten anlegen
|
// Arraykomponenten durch
// vordefinierte int-Werte vorbesetzt
zahlen = new int[] { 10, 3, 13 };
// oder: Arraykomponenten durch vorher
// definierte int-Variablen vorbesetzt
int n1 = 10, n2 = 3, n3 = 13;
zahlen = new int[] { n1, n2, n3 };
|
// Arraykomponenten durch
// vordefinierte Farben vorbesetzt
farben = new Color[] { Color.red, Color.blue,
Color.black };
// oder: Arraykomponenten durch
// vorher erzeugte Objekte vorbesetzt
Color f1 = new Color(10, 128, 132),
f2 = new Color(20, 99, 78),
f3 = new Color(99, 18, 13);
farben = new Color[] { f1, f2, f3 };
// oder: Kurzfassung von Darüberstehendem
farben = new Color[] { new Color(10, 128, 132),
new Color(20, 99, 78),
new Color(99, 18, 13) };
|
Sonderfall: String-Arrays
Da Strings in Java Objekte der Klasse java.lang.String
sind, geht alles im Prinzip analog wie beim Color-Array.
Allerdings hat man die Besonderheit, dass wegen der Stringkonstanten
nicht notwendigerweise ein Konstruktor von String
aufgerufen werden muss.
// 1) Variable als String-Array festlegen
String [] items;
// 2a) String-Array anlegen mit vorgegebener Länge
items = new String[10];
// 2b) Werte der Arraykomponenten setzen
/*
umständlich: mit Konstruktoraufrufen
for (int i = 0; i < items.length; ++i)
items[i] = new String("Tagungspunkt " + i + ")");
*/
/*
kürzer: mit Stringkonstanten
*/
for (int i = 0; i < items.length; ++i)
items[i] = "Tagungspunkt " + i + ")";
// 3) Array mit vorgegebenen Werten anlegen
// Arraykomponenten durch vorher definierte Stringobjekte vorbesetzt
String punkt_1 = "1. Tagungspunkt",
punkt_2 = "2. Tagungspunkt",
sonst = "Sonstiges";
items = new String[] { punkt_1, punkt_2, sonst };
// Kurzfassung: Arraykomponenten durch Stringkonstanten vorbesetzt
items = new String[] { "1. Tagungspunkt", "2. Tagungspunkt", "Sonstiges" };
vordefinierte Werte von Arrays und Arraykomponenten
Arrays oder Objekte haben als vordefinierten Wert nicht eine
Zahl 0 oder 0.0, sondern die Referenz null, also eine
Referenz/einen Verweis auf einen ungültigen Speicherplatz.
Greift man trotzdem versehentlich damit auf objektabhängige
Datenelemente oder Methoden zu, ergibt sich der berüchtigte
Laufzeitfehler "NullPointerException".
|
Beispiel mit
Array von int-Werten
|
Beispiel mit
Array von Color-Werten
|
Aufgabe
|
Sourcecode
|
Wert
|
Sourcecode
|
Wert
|
1) Variable als
Array festlegen
|
int [] zahlen;
|
Array zahlen hat den Wert null
|
Color [] farben;
|
Array farben hat den Wert null
|
2a) Array anlegen mit
vorgegebener Länge
|
zahlen = new int[10];
|
alle Arraykomponenten zahlen[i] haben den Wert
0 (Standardwert für Datentyp int)
|
farben = new Color[10];
|
alle Arraykomponenten farben[i] haben als Objekte
den Wert null (Standardwert für Objekte)
|
-
Wie kann man in Applikationen zeichnen?
Die Grundidee ist folgende: Man muss ein neues Fenster aufmachen
in der main(..)-Methode der Applikation (meist ein
JFrame-Objekt, da dieses einen Fenstertitel haben kann,
die Größe ändern kann, ... .
Zum leeren JFrame-Objekt fügt man ein
Objekt der Klasse MyCanvas (abgeleitet von der
Klasse Canvas) hinzu.
Ein Canvas-Objekt (Canvas steht für Leinwand)
ist ein GUI-Element zum Zeichnen. Zum Zeichnen muss man
also die Klasse Canvas ableiten und mit einer eigenen
paint(..)-Methode wie beim JApplet ausstatten.
Die gewünschte Größe für die Zeichnung muss man
geeignet an das Objekt der abgeleiteten Klasse MyCanvas weitergeben oder
festlegen.
1. Beispiel:
Umschreiben des Applets
"Applet_Fest.java"
mit zugehörigem HTML-File
"Applet_Fest.html"
Das Applet geht von einer festen Größe des Appletbereichs
(400 x 200 Pixel) aus, hat keine Datenelemente und nur eine
paint(..)-Methode.
Die Applikation
"Applikation_Fest.java"
verwendet die von Canvas abgeleitete Klasse MyCanvas_Fest.
Diese Größe muss als Rückgabewert der Methode
getPreferredSize() eingetragen werden. Die
paint(..)-Methode von MyCanvas_Fest wird automatisch
beim Sichtbarwerden des JFrame-Objekts gezeichnet.
Die Klasse MyCanvas_Fest
kann man im Fall fest vorgegebener Zeichengröße
wiederverwenden für eigene Applikationen, nur die
paint(..)-Methode und die Größe des Zeichenbereichs
als Rückgabewert von getPreferredSize() muss man
verändern.
2. Beispiel:
Umschreiben des Applets
"Applet_Statisch.java"
mit zugehörigem HTML-File
"Applet_Statisch.html"
Das Applet fragt die aktuelle Größe des Appletbereichs nur
in der init()-Methode ab und besitzt auch Datenelemente.
Die Applikation
"Applikation_Statisch.java"
geht wie im 1. Beispiel vor. Nur besitzt
die abgeleitete Klasse MyCanvas_Statisch diesmal
einen Konstruktor, an den man die gewünschte
Größe der Zeichnung übermittelt. Dazu muss
die Klasse MyCanvas_Statisch Datenelemente für Breite und
Höhe haben, was sie flexibler macht. Die Methoden
getWidth() und getHeight() werden
bereitgestellt (Verwendung dann wie in einem Applet),
liefern aber einfach nur die (fixen) Datenelemente. Eine
dynamische Größe der Zeichnung wird aber dadurch
ausgeschlossen (Ausweg: 3. Beispiel).
Die Datenelemente des
Applets werden einfach zu Datenelemente der Klasse
MyCanvas_Statisch. Die init()-Methode des Applets fügt
man in die Klasse MyCanvas_Statisch ein. Allerdings muss man dann
im Konstruktor dieser Klasse selbst die init()-Methode
aufrufen, da diese Methode nur bei Applets automatisch aufgerufen
wird.
Diese Klasse kann man im Fall flexibel zu ermittelnder
Anfangsgröße des Zeichenbereichs, der sich dann aber nicht
mehr ändern darf,
wiederverwenden für eigene Applikationen, nur deren
Datenelemente, die init() und die
paint(..)-Methode muss man verändern.
3. Beispiel:
Umschreiben des Applets
"Applet_Dynamisch.java"
mit zugehörigem HTML-File
"Applet_Dynamisch.html"
Das Applet fragt die aktuelle Größe des Appletbereichs
in der paint(..)-Methode ab, besitzt auch Datenelemente
und eine init()-Methode.
Die Applikation
"Applikation_Dynamisch.java"
geht wie im 2. Beispiel vor. Nur reagiert
die abgeleitete Klasse MyCanvas diesmal
auf Veränderungen ihrer Größe durch
Implememtieren des Interfaces ComponentListener
und Reaktion auf zugehörige Ereignisse der Klasse
ComponentEvent.
Ändert sich die Größe eines Objekts der
Klasse MyCanvas, passen sich dessen Datenelement
für Breite und Höhe an die aktuellen Werte an.
Damit erhält man eine dynamische Anpassungsfähigkeit.
Diese Klasse kann man im Fall dynamisch anzupassender
Größe des Zeichenbereichs
man wiederverwenden für eigene Applikationen, nur deren
Datenelemente, die init() und die
paint(..)-Methode muss man verändern.
-
Wie kann man in Java die aktuelle Uhrzeit
abrufen?
Dies funktioniert z.B. mit der Klasse
java.util.GrgeorianCalendar. Ist das Betriebssystem auf
die richtige Zeitzone (z.B. Europa/Berlin) und auf die richtige
Locale (deutsch/Deutschland) eingestellt, kann man den Defaultkonstruktor
verwenden und erhält die beim Aufruf aktuelle Uhrzeit (inkl. Datum).
Achtung: Die Uhrzeit aktualisiert sich nicht selbstständig im
Objekt. Will man die aktuelle Uhrzeit später nochmals ausgeben,
muss man wieder ein neues Objekt der Klasse GrgeorianCalendar
anlegen.
Mit einem Objekt dieser Klasse bekommt man über die
get(..)-Methode und der Angabe des richtigen Feldes
(Feldname = Konstante der Klasse java.util.Calendar)
die gewünschten Informationen (Tag, Monat, Stunde, Minute, ...).
Beispiel:
import java.util.*;
...
// in einer Methode Abfrage des aktuellen Datums mit Uhrzeit:
GregorianCalendar cal = new GregorianCalendar(); // Default-TimeZone und -Locale des Betriebssystems
int jahr = cal.get(Calendar.YEAR); // aktueller Jahr (1970-...)
int month = cal.get(Calendar.MONTH) + 1; // aktueller Monat (1-12)
int tag = cal.get(Calendar.DAY_OF_MONTH); // aktueller Tag (1-31)
int stunden = cal.get(Calendar.HOUR_OF_DAY); // aktuelle Stunde (0-24)
int minuten = cal.get(Calendar.MINUTE); // aktuelle Minuten (0-59)
int sekunden = cal.get(Calendar.SECOND); // aktuelle Sekunden (0-59)
int milli_sekunden = cal.get(Calendar.MILLISECOND); // aktuelle Millisekunden (0-999)
...
// später: nochmals aktuelle Uhrzeit abfragen
// (minuten, sekunden, milli_sekunden aktualisieren sich nicht neu,
// in cal steht vor der folgenden Zeile noch die veraltete Uhrzeit)
cal = new GregorianCalendar();
...
Hat das Betriebssystem eine andere Zeitzone oder Locale, verwendet
man besser den allgemeinen Konstruktor:
TimeZone tz = TimeZone.getTimeZone("Europe/Berlin");
Locale loc = Locale.GERMANY;
GregorianCalendar cal = new GregorianCalendar(tz, loc); // TimeZone und Locale für Deutschland
Die folgende Java-Applikation
"CmdLineUhr.java"
von Manuel Doss zeigt in der
DOS-Box bzw. in der Shell die aktuelle Uhrzeit an.
-
Kann man in Java auch C-/C++-Programme
aufrufen?
einfachere Lösung:
Man starte mit einem Runtime-Objekt
einen Prozess (hier: Executable eines C-/C++-Programmes), warte
das Ende ab in Java und fahre im Java-Programm fort. Der Datenaustausch
kann über mit Java bzw. C/C++ erzeugte Dateien passieren.
Grobidee:
Runtime rt = Runtime.getRuntime();
Prozess p = null;
int status = 0;
try
{
p = rt.exec("a.out"); // starte kompiliertes C-/C++-Programm
status = p.waitFor(); // auf das Ende des Prozesses warten,
// in "status" den exit-Status des Prozesses
// speichern
}
catch (IOException exc)
{
System.err.println("Problem beim Ausf\u00FChren von \"a.out\"!");
System.err.println(exc);
exc.printStackTrace();
System.exit(1);
}
flexiblere Lösung:
Man benutze das Native Interface von Java
(JNI), vgl. das
Java Tutorial
oder die
lokale Dokumentation zu JNI
Dazu muss man die C-/C++-Funktion als Objektfile übersetzen, es in
eine shared Library einpacken und diese dann mit der
System-Klasse durch die Methode "loadLibrary(..)"
einladen. Das JNI bietet noch weitergehende Möglichkeiten der
Interaktion von Java mit dem nativen C-/C++-Programm.
-
Was macht man, wenn der Internet Explorer
in einem Warnfenster den Hinweis 'Error: Expected ";"' beim Ansehen einer
HTML-Seite mit einem Java-Applet bringt?
Es scheint sich um ein Problem des Internet Explorers zu handeln.
Diese Meldung tritt bei anderen Browser nicht auf, denn es handelt sich
um eine JavaScript-Warnung. Oft hilft es, die Warnung zu bestätigen
und die HTML-Seite mit dem Java-Applet wird danach korrekt dargestellt.
Es handelt sich nicht um ein Java-Problem!
Die Meldung kann auch auftreten, wenn gar kein
JavaScript in der HTML-Seite mit dem Java-Applet verwendet wurde!
Abhilfe schafft (neben einem anderen Browser) das JavaScript-Debuggen
abzuschalten.
|