Java-Vorlesung6

Werbung
Institut für Kartographie und Geoinformation
Prof. Dr. Lutz Plümer, Dr. Gerhard Gröger, Dipl.-Ing. Dirk Dörschlag
Einführung in die
Programmierung mit Java
6. Vorlesung WS 2003/2004
Übersicht
• Methoden
–
–
–
–
–
–
Deklaration
Aufruf
Parameterübergabe
Rückgabewert
Lokale Variablen
Konstruktoren
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
2
Hausaufgabe
• Entwerft analog zur Definition von Rechtecken die
Klassendefinitionen für Dreiecke, Ellipsen und
Trapeze. Erzeugt mindestens eine Instanz jeder
Klasse und weist ihnen sinnvolle Werte zu.
• Hinweis: Die Lösung umfasst mehrere .java-Dateien.
In jedem der Dateinamen (und auch Klassennamen)
muss Euer Nachname auftauchen (z.B.
SchmitzDreieck.java)
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
3
Hausaufgabe: Lösung
class Dreieck {
//in Datei Dreieck.java
double Seite1, Seite2, Seite3;
}
class Ellipse{
//in Datei Ellipse.java
double radius1, radius2;
}
class Trapez{
//in Datei Trapez.java
double LangeSeiteUnten, KurzeSeiteOben, Winkel, rechteSeite;
}
//Erzeugen von Instanzen (in der main einer anderen Datei):
Dreieck d = new Dreieck();
d.Seite1 = 5.4;
d.Seite2 = 6.2;
d.Seite3 = 9.3;
Ellipse e = new Ellipse();
e.radius1 = 6.5;
e.radius2 = 2.1;
Trapez t = new Trapez();
t.LangeSeiteUnten = 12.9;
t.KurzeSeiteOben = 4.9;
t.Winkel = 70.0;
t.rechteSeite = 8.2;
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
4
Wdh.: Klassen und Objekte
• Klassen definieren allgemeine Eigenschaften
(z.B. Definition geometrischer Figuren oder den
Bauplan für ein Haus)
• Von einer Klasse können Objekte (Instanzen)
erzeugt werden
(konkrete Ausprägung einer Klasse,
z.B.: Rechteck mit Seitenlängen 10 und 7.5; oder das
Beethoven-Haus)
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
5
Wdh.: Klassen und Objekte
• Klassen haben
• Attribute, z.B. int seitenlaenge
• Methoden, z.B. double flaecheninhalt(){...}
• Objekte (Instanzen)
• werden mit new erzeugt, z.B.
Rechteck r = new Rechteck();
• haben Attributwerte, z.B. seitenlaenge = 7
• Methoden können für ein Objekt aufgerufen werden, z.B.
double f = r.flaecheninhalt();
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
6
Unterscheidung Deklaration - Benutzung
• Deklaration
– class <Klassenname> {//Deklaration von Attributen u. Methoden}
– in Datei <Klassenname>.java
– nur einmal pro Klasse
• Benutzung/Aufruf
– kann "überall" und mehrmals erfolgen:
• in Methode main
• in Methode einer (anderen) Klasse
– zuerst Erzeugung einer Instanz
<Klassenname> r = new <Klassenname>();
– dann Zugriff auf Attribute
• r.<Attribut> = ....
– oder Aufruf von Methoden
• r.<Methode>();
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
7
Methoden
• Klassen bestehen aus Attributen und Methoden
• Attribute speichern Werte einer Instanz
– z.B. Seitenlänge = 3.5 bei einem Rechteck
• Methoden werden für eine Instanz aufgerufen
• Methoden führen Berechnungen auf der Instanz aus
–
–
–
–
–
greifen auf Attributwerte der Instanz zu
geben diese z.B. aus
berechnen z.B. den Flächeninhalt eines Rechtecks
ändern z.B. Attributwerte
.....
• Methoden realisieren das Prinzip der Kapselung
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
8
Methodendefinition
• Syntax:
class Klassenname {
Typ1 Variablenname1;
...
Rückgabetyp Methodenname (Parameterliste) {
//Programmcode der Methode
}
}
• Beispiel:
class Rechteck {
double breite, hoehe;
double flaeche () {
double flaecheninhalt = breite * hoehe;
return flaecheninhalt;
}
}
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
9
Beispiele für Methodendefinitionen
class Rechteck {
double breite, hoehe;
// Attribute
// Methode zur Berechnung des Umfangs
double umfang () {
// keine Parameter; Rückgabetyp double
double umfang;
// lokale Variable (ex. nur in der Methode)
umfang = 2*breite + 2*hoehe; // Berechnung anhand der Attributwerte
return umfang;
// Rückgabe des berechneten Wertes
}
//Methode zum Ändern der breite:
void aendereBreite(double neueBreite){
breite = neueBreite;
}
// Methode zur Ausgabe des Objekts (als Text)
void ausgeben() {
// keine Parameter; kein Rückgabewert
System.out.println("Dieses Rechteck hat folgende Eigenschaften:");
System.out.print("Breite: " + breite + "Höhe: " + hoehe);
System.out.print("Umfang: " + umfang());
//Methodenaufruf!
}
}
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
10
Aufruf von Methoden
Syntax:
// Methode ohne Rückgabewert (void)
objektvariable.methode1(Parameterliste);
...
// Methode mit Rückgabewert
variable = objektvariable.methode2(Parameterliste);
Beispiel:
myRechteck.ausgeben();
double flaecheninhalt;
flaecheninhalt = myRechteck.flaeche();
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
11
Beispiele für Methodenaufrufe
class Rechteck {
double breite, hoehe;
// Attribute
// Methode zur Berechnung des Umfangs
double umfang () {
// keine Parameter; Rückgabetyp double
double umfang;
// lokale Variable (ex. nur in der Methode)
umfang = 2*breite + 2*hoehe; // Berechnung anhand der Attributwerte
return umfang;
// Rückgabe des berechneten Wertes
}
//Methode zum Ändern der breite:
void aendereBreite(double neueBreite){
breite = neueBreite;
}
// Methode zur Ausgabe des Objekts (als Text)
void ausgeben() {
// keine Parameter; kein Rückgabewert
System.out.println("Dieses Rechteck hat folgende Eigenschaften:");
System.out.print("Breite: " + breite + "Höhe: " + hoehe);
System.out.print("Umfang: " + umfang());
//Methodenaufruf!
}
}
//Aufruf (dies steht in einer anderen Datei...)
Rechteck r = new Rechteck();
r.aendereBreite(5.2);
r.ausgeben();
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
12
Methoden mit und ohne Rückgabewert
Ohne Rückgabewert
• Deklaration:
void methode(){
.....
Mit Rückgabewert
• Deklaration:
double methode(){
...
return double_Wert;
}
•
•
}
Aufruf
instanz.methode();
Methode muss kein „return“
haben
• Aufruf:
double d = instanz.methode()
• Methode muss
„return Wert“ haben;
• Typ des Wertes = Rückgabetyp
• Zweck: Liefert Ergebnis nach
Außen
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
13
Methoden mit Rückgabewert
• „return“ beendet Ausführung der Methode
• Methode mir Rückgabewert darf nie ohne return beendet
werden
• Gegenbeispiel:
boolean methode1(){
if(Bedingung1) return true;
if(Bedingung2) return false;
}
Ende ohne „return“ wenn
Bedingung1 falsch und
Bedingung2 falsch
• Richtig:
boolean methode2(){
if(Bedingung3) return true;
else return false;
}
Ende immer mit
„return“
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
14
Übungsaufgabe
• Programmiert zwei Methoden der Klasse „Kreis“, die
den Flächeninhalt und den Umfang eines Kreises
berechnen und zurückgeben. Berechnet den
Flächeninhalt und Umfang für eine Instanz und gebt sie
aus.
• Hinweis: Die Zahl pi erhält man durch Math.PI
• Syntax:
class Kreis{
double methode(){
.............
return double_Wert
}
}
Aufruf:
Kreis k = new Kreis();
double d = k.methode();
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
15
Methoden: Parameter
• dienen dazu, Werte von Außen in die Methode zu
geben
• Parameter müssen Typ haben (wie Variablen)
• Beispiel: Methode der Klasse Kreis:
void setzeMittelpunkt(double x, double y){
mittelpunktX = x;
mittelpunktY = y;
}
• Aufruf (k Referenzvariable für Klasse Kreis):
k.setzeMittelpunkt(5.2,4.3);
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
16
Methoden: Parameter
• Parameter in der Methodendeklaration:
–
–
–
–
Paare „Typ Variable“, durch Koma getrennt
z.B. void setzeMittelpunkt(double x, double y)
x,y: Formale Parameter
Parameter werden in Methode verwendet
• Parameter in Aufruf:
– konkrete Werte (einer pro Parameter), durch Komma getrennt
– z.B. k.setzeMittelpunkt(5.2,4.3);
– aktuelle Parameter
• Beim Aufruf werden formale durch aktuelle Parameter ersetzt
• Beispiel: void setzeMittelpunkt(double 5.2
x , double 4.3
y ){
mittelpunktX = x5.2 ;
mittelpunktY = y4.3 ;
}
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
17
Parameterübergabe:
neueBreite = 5.2
Abarbeitungsreihenfolge
Start
//Aufruf:
Rechteck r = new Rechteck();
void aendereBreite(double neueBreite){
breite = neueBreite;}
r.aendereBreite(5.2);
r.ausgeben();
fertig
void ausgeben() {
System.out.println("Dieses Rechteck hat folgende Eigenschaften:");
System.out.print("Breite: " + breite + "Höhe: " + hoehe);
System.out.print("Umfang: " + umfang());}
Rückgabewert:
return 12.2
double umfang () {
double umfang = 2*breite + 2*hoehe;
return umfang;}
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
18
Konstruktoren (I): Motivation
• Beispiel: Erzeugen eines Dreiecks
mit drei Attributen seite1, seite2, seite3
Dreieck d;
d = new Dreieck();
d.seite1 = 6.4;
d.seite2 = 3.1;
d.seite3 = 5.2;
• Mit Konstruktor:
Dreieck d;
d = new Dreieck(6.4 , 3.1, 5.2);
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
19
Konstruktoren (II)
• Konstruktoren sind spezielle Methoden
• Name des Konstruktors = Klassenname
• Beispiel: Konstruktor für die Klasse Punkt
(mit zwei Attributen xKoordinate und yKoordinate)
Punkt(double x, double y) {
xKoordinate = x;
yKoordinate = y;
}
• werden implizit bei der Erzeugung mit new aufgerufen:
Punkt p = new Punkt(4.9,8.5);
• kein Rückgabewert (auch kein void)
• darf fehlen (dann wird Standardkonstruktor verwendet)
• Zweck: Initialisierung der Instanz, Zuweisung von
Anfangswerten
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
20
Konstruktoren (III)
Aufruf:
kreis k = new kreis();
• Es kann mehrere Konstruktoren geben
• diese müssen sich hinsichtlich Anzahl und Typ der Parameter
unterscheiden
Aufruf:
• Beispiel:
kreis k = new kreis(56);
class kreis{
double mittelpunktX, mittelpunktY, radius;
kreis() {
mittelpunktY = 0; mittelpunktY = 0; radius = 1;}
kreis(double r){
mittelpunktX = 0; mittelpunktY = 0; radius = r;}
kreis(double r, double x, double y){
mittelpunktX = x; mittelpunktY = y; radius = r;}
}
}
Aufruf:
kreis k = new kreis(56,8,7);
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
21
Übungsaufgabe
• Programmiert drei Konstruktoren der Klasse Ellipse:
•
•
•
einen mit keinem Parameter (mit sinnvollen Default-Werten),
einen mit einem Parameter (kleinerRadius) und
einen mit vier Parametern (mittelpunktX, mittelpunktY,
kleinerRadius, grosserRadius).
• Syntax:
class Kreis{
Kreis(int i, double d){
.............
}
}
• Aufruf:
Kreis k = new Kreis(8,4.3);
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
22
Kapselung
• auf Attribute sollte von Außen nicht direkt zugegriffen
werden
• Zugriff von Außen nur über Methoden
• Mechanismen, um dies sicherzustellen, kommen
später
– private und protected statt public für Attribute
– entspricht "-" und "+" in UML-Klassendiagrammen
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
23
Wozu Kapselung?
class kreis{
double radius, mittelpunktX, mittelpunktY;
boolean setzteRadius(double neuerRadius){
if(neuerRadius > 0){
radius = neuerRadius;
return true;}
else return false;
}
}
//ohne Kapselung:
kreis k = new kreis();
k.radius = – 88;
// radius negativ!
//mit Kapselung
kreis k = new kreis();
boolean b = k.setzeRadius(– 88);
//radius nie negativ!
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
24
Auf welche Variablen darf in einer Methode
zugegriffen werden?
• auf die Attribute der Instanz, für die Methode
aufgerufen wurde
• auf die formalen Parameter (bei Aufruf durch aktuelle
ersetzt)
• auf lokale Variablen (in Methode deklariert und nur
dort existent)
• Beispiel: (für Klasse Rechteck mit laenge und breite)
double volumen(double hoehe){
double v;
v = laenge * breite * hoehe;
return v;
}
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
25
Methoden - Lokale Variablen
• Variablen, die innerhalb von Methoden deklariert
werden, heißen lokale Variablen.
• Lokale Variablen werden bei jedem Aufruf einer
Methode neu angelegt und existieren nur für die
Zeitdauer der Abarbeitung der Methode.
• Im Gegensatz: Die evtl. innerhalb einer Methode
erzeugten Objekte bestehen fort über die
Methodenabarbeitung hinaus.
– Aber: sollten alle Referenzen auf neue Objekte entfallen,
weil am Ende einer Methode alle lokalen Referenzvariablen
Aufhören zu existieren, so werden auch diese Objekte
gelöscht (automatische Garbage Collection)
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
26
Methoden - Lokale Variablen - Beispiel
• Beispiel:
void methode1(){
Punkt p = new Punkt(1.5, 6.7);
......
nichtLokal = p;
}
• p ist eine lokale Variable
• nach Beendigung von methode1
– existiert p nicht mehr
– existiert die Instanz Punkt(1.5, 6.7) zunächst noch
– wird die Instanz Punkt(1.5, 6.7) gelöscht, wenn keine weitere
Referenz darauf existiert
– wird die Instanz Punkt(1.5, 6.7) nicht gelöscht, wenn es eine
noch existierende Referenz darauf gibt
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
27
Beispiel: Klasse Punkt
class Punkt{
double xKoordinate; //Attribut
double yKoordinate; //Attribut
Punkt(){ xKoordinate = 0.0; yKoordinate = 0.0;} //Konstruktor
Punkt( double x, double y ){ xKoordinate = x; yKoordinate = y;} //Konstruktor
double x_Koordinate() {return xKoordinate;}
double y_Koordinate() {return yKoordinate;}
void verschieben(double deltaX, double deltaY){
xKoordinate = xKoordinate + deltaX;
yKoordinate = yKoordinate + deltaY; }
double abstand(Punkt p){
double a = Math.sqrt(Math.pow(xKoordinate - p.xKoordinate,2.0) +
Math.pow(yKoordinate - p.yKoordinate,2.0));
return a; //a ist lokale Variable, p ein Parameter
}
}
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
28
Beispiel: Benutzung der Klasse Punkt
Punkt p1 = new Punkt(6.0,8.0);
Punkt p2 = new Punkt(8.0,23.0);
p1.verschieben(2,12);
double abstand = p1.abstand(p2);
System.out.println("Der Abstand zwischen beiden Punkten beträgt " + abstand);
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
29
Hausaufgabe
• Definiert eine Klasse für Dreiecke, die in der Ebene
eingebettet sind (d.h. alle drei Punkte haben x- und yKoordinaten). Definiert
– einen komfortablen Konstruktor (der ein Dreieck in einem
Schritt erzeugt)
– eine Methode zur Berechnung des Umfangs,
– eine Methode zum Verschieben des Dreiecks und
– eine Methode zur textuellen Ausgabe.
G. Gröger - Einführung in die Programmierung mit Java - 1. Semester - WS 03/04
30
Herunterladen