Kapitel 3: Klassen und Objekte

Werbung
Liste P: Programmieren mit Java
WS 2001/2002
Prof. Dr. V. Turau
FH Wiesbaden
Kapitel 3: Klassen und Objekte
Folie 25 : Beispiel: Klasse Rechteck
package fhw;
public class Rechteck {
private int länge, breite;
public Rechteck(int l, int b) {
länge = l;
breite = b;
}
public int getFläche() {
return länge * breite;
}
Folie 26 : Beispiel: Klasse Rechteck (Forts.)
public static void main(String[] a) {
Rechteck r1 = new Rechteck(4,3);
Rechteck r2 = new Rechteck(2,3);
System.out.println("Fläche r1: " + r1.getFläche());
System.out.println("Fläche r2: " + r2.getFläche());
}
}
Übersetzung: javac -d classes fhw/Rechteck.java
Ausführung: java fhw.Rechteck
Fläche r1: 12
Fläche r2: 6
Folie 27 : Typen und Werte
Jede Variable hat einen Typ. Zulässige Typen sind:
Primitive Typen
Array-Typen
Klassen-Typen
Interface-Typen
Zulässige Werte sind:
Primitive Werte
Referenzen
Folie 28 : Primitive Typen
Typname Speicherplatz
Wertebereich
Default-Wert
byte
8 Bit
-128.....127
(byte)0
short
16 Bit
-215.....215-1
(short)0
int
32 Bit
-231.....231-1
0
long
64 Bit
-263.....263-1
0L
float
32 Bit
IEEE 754 floating-point 0.0f
double
64 Bit
IEEE 754 floating-point 0.0d
char
16 Bit
Unicode
’\u0000’
true, false
false
boolean
Folie 29 : Primitive Typen
Primitive Werte sind keine Objekte
Es gibt keine Referenzen auf primitive Werte
Die von C her bekannten Operatoren stehen zur Verfügung
Für jeden primitiven Typ gibt es im Paket java.lang auch eine Klasse (z.B. Integer, Float
etc.)
Beispiel: Die Klasse Float
Float.MAX_VALUE
static float parseFloat(String s)
Folie 30 : Klassenvereinbarung
Folie 31 : Instanz- und Klassenvariablen
Instanzvariablen:
Jede Instanz einer Klasse hat eigene Werte für jede Instanzvariable
Die Werte der Instanzvariablen eines Objektes beschreiben den Zustand des Objektes
Klassenvariablen:
Klassenvariablen heißen auch statische Variablen
Schlüsselwort static
Eine Instanzvariable hat pro Klasse einen Wert
Die Werte der Klassenvariablen beschreiben Eigenschaften der Klasse
Folie 32 : Instanz- und Klassenvariablen (Beispiel)
public class Mitarbeiter {
public static int anzahl;
public String name;
public Mitarbeiter(String n) {
anzahl++;
name = n;
}
public static void main(String[] a) {
Mitarbeiter m1 = new Mitarbeiter("Schmidt");
Mitarbeiter m1 = new Mitarbeiter("Bender");
// m1.anzahl==m1.anzahl=Mitarbeiter.anzahl==2
// m1.name=="Schmidt" m2.name=="Bender"
}
}
Folie 33 : Konstruktoren
Bei der Erzeugung eines Objektes werden die Instanzvariablen initialisiert
Werden keine Werte angegeben, so bekommen Variablen Defaultwerte zugewiesen (Defaultwert
für Referenzen: null)
Klassenvariablen werden schon beim Laden der Klasse initialisiert
Objekte müssen immer mit Konstruktoren erzeugt werden
Konstruktoren haben den gleichen Namen wie die Klasse
Java hat eine automatische Freispeicherverwaltung (Garbage Collection), d.h. keine Destruktoren
Folie 34 : Konstruktoren (Beispiel)
public class Rechteck {
public int länge, breite;
public static void main(String[] a) {
Rechteck r = new Rechteck();
// r.länge = r.breite = 0
}
}
Der Konstruktor ohne Argumente heißt Defaulkonstruktor
Wird kein eigener Konstruktor vereinbart, so stellt Java folgenden Defaultkonstruktor zur
Verfügung:
public Klassenanme() { super();}
Folie 35 : Konstruktoren
Benutzer können eigene Konstruktoren vereinbaren
Konstruktoren können beliebig viele Parameter haben, sie haben keinen Rückgabetyp
public class Rechteck {
public int länge, breite;
public Rechteck(int l, int b) {
länge = l;
breite = b;
}
public static void main(String[] a) {
Rechteck r = new Rechteck();
// falsch!!
}
}
Folie 36 : Konstruktoren
Konstruktoren können andere Konstruktoren der Klasse aufrufen
Konstruktoren sollten keinen redundaten Code enthalten
public class Rechteck {
public int länge, breite;
public String farbe;
public Rechteck(int l, int b, String f) {
länge = l;
breite = b;
farbe = f;
}
public Rechteck(int l, int b) {
this(l, b, "blau");
}
}
Folie 37 : Konstruktoren
Konstruktor aufrufen:
der Oberklasse: super(Parameter,..)
der eigenen Klasse: this(Parameter,..)
Diese Aufrufe müssen als erstes in einem Konstruktor erfolgen
public class Rechteck {
public int länge, breite;
public Rechteck(int l, int b, String f) {
länge = l;
super();
//falsch!!
}
}
Folie 38 : Konstruktoren
Objekte entstehen nur durch Konstruktoren
Implizite Aufrufe von Konstruktoren gibt es nicht
public class Rechteck {
public static void main(String[] s) {
Rechteck r;
//r hat keinen Wert
r.getFläche();
//falsch!!
Rechteck r2 = 3;
//falsch!!
}
}
Folie 39 : Methoden
Methoden implementieren die Funktionalität einer Klasse
Die enthaltenen Anweisungen verändern den Zustand eines Objektes
Instanzvariablen einer Klassen sollten nicht nach außen sichtbar sein
Methoden zum Lesen/Schreiben von Instanzvariablen anbieten
Zugriffsmethoden
Folie 40 : Methoden (Beispiel)
public class Rechteck {
protected int länge, breite;
public int getLänge() {
return länge;
}
public void setLänge(int länge) {
this.länge = länge;
}
public int getBreite() {
return breite;
}
...
Folie 41 : Zugriffsmethoden
Namen von Zugriffsmethoden durch Java-Namenskonventionen festgelegt
Variable name mit Typ T:
Lesemethode: public T getName()
Schreibmethode: public void setName(T name)
Boolsche-Variable name: public boolean isName()
Feldvariable name vom Typ T[]:
public T getName(int i)
public T[] getName()
public void setName(int i, T t)
Folie 42 : Aufruf von Methoden
referenz.methodenName(Param1, Param2..)
Voraussetzung:
ist Instanz einer Klasse, welche eine Methode mit Namen methodenName
implementiert, deren Parameteranzahl und -typen mit den Aufrufparametern übereinstimmt.
Signatur einer Methode
Die Anweisungen in methodenNamen werden für das Objekt referenz ausgeführt
Call-by-Value
referenz
Folie 43 : Aufruf von Methoden (Beispiel)
public class Rechteck {
public static void main(String[] a) {
setBreite(4); // falsch, wer ist Empfänger?
R r1 = new Rechteck(3,4);
R r2 = new Rechteck();
r1.setLänge(2);
r2.setLänge(r1.getLänge());
}
}
Folie 44 : Aufruf von Methoden (Beispiel)
public class Rechteck {
.....
public halbiere() {
this.setBreite(getBreite()/2);
this.setLänge(getLänge()/2);
}
//Dies ist gleichbedeutent mit:
public halbiere() {
breite /= 2;
länge /= 2;
}
Folie 45 : Aufruf von Methoden (Beispiel)
public class Rechteck {
.....
//Kürzere Schreibweise
public halbiere() {
setBreite(getBreite()/2);
setLänge(getLänge()/2);
}
Wird kein Empfänger explizit angegeben, so ist this der Empfänger
In statischen Methoden gibt es kein this!!
Folie 46 : Aufruf von Methoden (Beispiel)
package java.util;
public class Stack extends Vector {
public Object pop() {
int len = size();
Object obj = peek();
removeElementAt(len - 1);
return obj;
}
...
Folie 47 : Überladen von Methoden
Haben zwei Methoden einer Klasse den gleichen Namen, aber unterschiedliche Parameterlisten, so
heißt die Methode überladen.
Beispiel aus der Klasse java.awt.Container
Component add(Component comp)
Component add(Component comp, int i)
void add(Component comp, Object constraints)
void add(Component comp, Object constraints, int i)
Component add(String name, Component comp)
In Java können Operatoren nicht überladen werden.
Folie 48 : Klassenmethoden
Klassenmethoden werden nicht im Kontext eines Objektes ausgeführt
Sie haben Zugriff auf Klassenvariablen
Sie haben keinen Zugriff auf this
Aufruf:
Klassenname.methodenName(...)
referenz.methodenName(...) (aufgerufen
referenz)
wird die Klassenmethode der Klasse von
Folie 49 : Die Klassenmethode main
public static void main(String[] a)
Sie wird bei Programmstart von der Laufzeitungebung aufgerufen, der Parameter a enthält die
Kommandozeilenparameter
Beispiel: java fhw.Beispiel a 42 Honey
a[0] = "a", a[1] = "42", a[1] = "Honey"
Unterschied zu C:
int main(int argc, char **argv)
Was ist argv[0]?
Warum braucht man argc in Java nicht?
Folie 50 : Die Klassenmethode main
Beliebter Fehler:
public class Rechteck {
public static void main(String[] a) {
setBreite(4); // falsch, wer ist Empfänger?
}
}
In Klassenmethoden gibt es kein this, d.h. Instanzmethoden müssen explizit an Objekt geschickt
werden!
Folie 51 : Verwendung von Klassenmethoden (Beispiel)
package java.lang;
public final class Math {
public static final double E = 2.7182818284590452;
public static final double PI = 3.141592653589793;
public static int abs(int a) {
return (a < 0) ? -a : a;
}
public static native double sqrt(double a);
...
Verwendung: double w = Math.sqrt(Math.E);
Folie 52 : Felder
Felder sind in Java Objekte
Vereinbarung: int[] x;
Verwendung: x = new int[4];
Initialisierung: String[] s = {"Köln", Hamburg", "Ulm"};
Mehrdimensionale Felder
Beispiel: int arr[][] = new int[4][5];
Beispiel: Dreiecksmatrix:
int arr[][] = new int[4][];
for (int i = 0; i < 4; i++)
arr[i] = new int[i + 1];
Folie 53 : Felder
Alle Felder haben eine Instanzvariable length
Anwendung:
public static void main(String[] a) {
for (int i = 0; i < a.length; i++)
System.out.println(
"Parameter " + i + ": " + a[i]);
}
Beliebter Fehler:
String[] a = ...;
a.lenth();
String a = ...; a.length;
Herunterladen