![Page 1: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/1.jpg)
7. Klassen, Objekte, Typen
7.1 Klassen zur Programmstrukturierung7.2 Verweise (Zeiger)7.3 Elementare Speicherverwaltung7.4 Verbundtypen7.5 Klassen und Objekte7.6 Konstruktoren
![Page 2: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/2.jpg)
hs / fub - alp2-07 2
Klassen (class) werden verwendet
1. zur Strukturierung von Programmen
2. als Typen, die als Schablone für die Erzeugung von Objekten dienen → objektorientierte Programmierung(*)
(*) nicht das einzige Merkmale für OOP, siehe unten
analog zum Modul in anderen Programmiersprachen - besonders Modula 2
![Page 3: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/3.jpg)
hs / fub - alp2-07 3
Beispiel:Class Math {
static final double PI = 3.1415926535898static double abs(double a){...}static double cos(double x){...}...static double log(double x){...}static int count; // counts number of calls of random()static {count = 0;} // explizite Initialisierugstatic double random(){
count++;... return ...;
}...}
Terminologie: (Statische) Methoden und Variablen (Felder, fields), Sammelbegriff für beide Arten: Komponenten, Mitglieder (member)
![Page 4: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/4.jpg)
hs / fub - alp2-07 4
Klassenvariablestatic int count ist wegen static eine KlassenvariableExplizite Initialisierung durch anonymen Block möglich.Klassenvariablen sind nichtlokal.Es gibt in einem Programm nur ein Exemplar der Variable. → deshalb zählen mit count im Bsp. möglich.
Gültigkeitsbereichalle vereinbarten Bezeichner sind in der gesamten Klassegültig, können aber verdeckt werden…
Verwunderlich? Bisher eher nicht…
![Page 5: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/5.jpg)
hs / fub - alp2-07 5
public class NumberCuriosity {
static int oNumber = 077;static int dNumber = 77;
public static void testeSichtbarkeit(){int oNumber = 999;NumberCuriosity.oNumber++;System.out.println(oNumber+", "+
NumberCuriosity.oNumber);}public static void main (String [] args) {System.out.println(oNumber); testeSichtbarkeit();
}} Achtung: nichtlokale Effekte (Nebeneffekte) durch Methode
![Page 6: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/6.jpg)
hs / fub - alp2-07 6
Programm.. besteht aus einer (selten!) oder mehreren (vielen!) Klassen.… Module: analog
Punktnotation zur Adressierung von Komponenten anderer Klassen
Identifier {.Identifier}0n
class MyClass{static double myFunction(double x) {
return Math.sin(x) * Math.exp(-x);}
…}
![Page 7: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/7.jpg)
hs / fub - alp2-07 7
Importe und Benennung
Vollständiger Name (fully qualified name):Paket-, Klassen- und Komponentenname in Punktnotation (*)
(*) Pakete können ferner hierarchisch in Unterpaketen organisiert sein
math.myMathPackage.Math.PI
Paketname (Konvention: klein) mit Unterpaket
Klassenname (Konvention:groß)
Komponente, hier KONSTANTE
![Page 8: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/8.jpg)
hs / fub - alp2-07 8
… Benennung von Komponenten
import <Klassenbezeichner>;- single type import -
Komponenten der Klasse können ohne Qualifizierung durchPaketbezeichner verwendet werden.
import math.myMathPackage.Math;...{ double res = Math.sin(x); …}
import math.*; ...{ double res = Math.sin(x); …}
Jetzt kann auf alle öffentlichen Klassen von math ohne Paketnamen zugegriffen werden:
![Page 9: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/9.jpg)
7. Klassen, Objekte, Typen
7.1 Klassen zur Programmstrukturierung7.2 Verweise (Zeiger)7.3 Elementare Speicherverwaltung7.4 Verbundtypen7.5 Klassen und Objekte7.6 Konstruktoren
![Page 10: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/10.jpg)
hs / fub - alp2-07 10
KlassendiagrammeGrafische Darstellung von Klassen und deren Beziehungenmit Hilfe von UML Klassendiagrammen.
aus Wikipedia
"Vererbungs-beziehung"(später)
![Page 11: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/11.jpg)
hs / fub - alp2-07 11
Bibliotheksklassen
Jedes Programmiersprachsystem besitzt Programmbibiliotheken (Modul- / Klassenbibliotheken) für häufig benutzte Standardfunktionen.
Java: besonders vielfältige Sammlung von Bibliotheksklassen.Wegen Plattformunabhängigkeit und guter Dokumentation?
Bibliotheksschnittstelle definiert die Gesamtheit aller in der Bibliothek sichtbaren Elemente (Anwendungsprogramm-schnittstelle, application programming interface, API)
![Page 12: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/12.jpg)
hs / fub - alp2-07 12siehe http://java.sun.com/j2se/1.5.0/docs/api/
![Page 13: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/13.jpg)
hs / fub - alp2-07 13
Getrenntes Übersetzen und Binden
Getrenntes Übersetzen von Programmbestandteilen Stand der Technik. Vorteil: nur geänderte Teile neu zu übersetzen
Erfordert Binden (linkage, linking) der Programmteilezu einem Ganzen
Geschieht vor Ausführung durch statischen Binder(linkage editor) oder dynamisch zur Laufzeit
![Page 14: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/14.jpg)
hs / fub - alp2-07 14
Aufgaben eines Binders
Adressumwandlung (address relocation): relative in absolute Adressen
Programmteile beginnen mit Adresse 0!
Beachte: Adressen sind Adressen im Virtuellen Adressraum,Umwandlung in absolute Speicheradressen per Hardwarebei jedem Speicherzugriff (!)
Auflösen externer Bezüge, besonders von Unterprogrammaufrufen
![Page 15: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/15.jpg)
hs / fub - alp2-07 15
Übersetzte Klassendatei
class VMcode{static int prog()
{ int i;i = 3; int j = 5;return (i+j)*(4+6);
}}
Method VMcode()0 aload_01 invokespecial #3 <Method ....(>4 return
Method int prog()0 iconst_31 istore_02 iconst_53 istore_14 iload_05 iload_16 iadd7 bipush 109 imul10 ireturn
push(3)push(5)pluspush(4)push(6)plusmul
Konstanten schonausgewertet: gut!
Lokale Variablen i und j
erhält man mit javap -c <datei>
![Page 16: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/16.jpg)
hs / fub - alp2-07 16
Die Class-Datei„offset“ hexadezimal
magic number (version d. Compilers usw
diverse Längen
iadd 0x60iload_1 0x1biconst_3 0x6erster Befehl der Methode
bipush 10
Ziffern: 0...9,A,B,C,D,E,F
![Page 17: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/17.jpg)
hs / fub - alp2-07 17
Dynamisches Binden
Binden während des Ladens des Programms (Linkage loader)
Während der Ausführung: der Maschinencode eines aufgerufenes Programm wird bei Aufruf von P geladen,nachdem die Adressanpassung (relocation) stattgefunden hat.
Source-code
javac
javac
VM-code
VM-code
zur Laufzeit
Bib
Binden/Laden
Ausführen= interpret-
ierenmit VM
java
![Page 18: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/18.jpg)
hs / fub - alp2-07 18
7.2 Verweis und Verweistypen
Verweis, Zeiger (reference, pointer) ist ein Wert, der den Bezug auf eine anonyme oder benannte Variable erlaubt. Der Wert ist eine (Speicher-) Adresse.
Verweise sind (meist) getypt: Verweistyp* (reference type)
Z.B. Modula: TYPE intPtr = POINTER TO INTEGER
z.B. C:int *intPtr Alle bisherigen Typen waren
Werttypen (value types)
![Page 19: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/19.jpg)
hs / fub - alp2-07 19
Wert- und Verweistypen
Werttyp T: der Name einer Variablen des Typs ist ein Alias für die Adresse der Variablen
int i=1;
int j=2;
j = i
Zuweisung:Kopiersemantik
![Page 20: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/20.jpg)
hs / fub - alp2-07 20
Verweistyp T: Name einer Variablen mit Verweistyp T: Alias für die Adresse der Variablen, die die Adresse eines Werts (!) des Typs enthält
TYPE iPtr = POINTER TO INTEGER
NEW(jPtr);
TYPE jPtr = POINTER TO INTEGER
NEW(iPtr);
jPtr = iPtr;Zuweisung:Referenzsemantik
INTEGER-Werte nochundefiniert (!)
![Page 21: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/21.jpg)
hs / fub - alp2-07 21
Referenzierung und Dereferenzierung
Modula2: Zeiger ermöglichen Erzeugung und Nutzung von anonymen Variablen.
VAR i,j: INTEGER;VAR p1,p2: POINTER TO INTEGER; NEW(p1); erzeugt anonyme Variable π und speichertNEW(p2); deren Adresse in p1.i := 4; p2^ := i; ^ ist Dereferenzierungsoperator, p1 := p2;j := p1^; bezeichnet Wert an der entsprechenden Adresse
![Page 22: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/22.jpg)
hs / fub - alp2-07 22
Nach Ausführung der Anweisungen:
p1 p2
4 4
i jπ
NEW(p1)
p1=p2
Hier muss dem Programm dynamisch Speicher zugewiesen werden (später)
4
NEW(p1)
![Page 23: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/23.jpg)
hs / fub - alp2-07 23
Verweise und Adressen in C
Ein Unterschied: benannten Variablen können mit Zeigern adressiert werden.
Adressoperator & liefert Adresse:int i; int *ip; Dereferenzierungsoperator *ip = &i; Adressoperator &
In der Vereinbarung spielt * die Rolle von POINTER TO in Modula2.
![Page 24: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/24.jpg)
hs / fub - alp2-07 24
int x = 1, y=2;int *ip1,*ip2;ip1 = &x; ip1 enthält Adresse von x x = 4; ip2 = ip1; ip2 enthält Wert von ip1 = Adresse von x*ip2 = 3; Variable, dessen Adresse ip2 enthält,
erhält Wert 3y = *ip1; Variable j erhält Wert der Adresse, auf die
ip1 zeigt.
Damit: ip1 == &x, ip2==&x, x==3, y==3⇒ *ip1 ==3, *ip2==3
Analoges Beispiel in C:
![Page 25: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/25.jpg)
hs / fub - alp2-07 25
(Typ-)Sicherheit
Adressierung von benannten Objekten gefährlich. int x = 1, y=2;int *ip1,*ip2;ip1 = &x;y = ip1; Jetzt enthält y eine Adresse!
Nicht erlaubt: Zuweisung ohne Initialisierungint *ip;
*ip1 = 100;
Ausschließlich Adressierung anonymer Objekte ist sicherer.
![Page 26: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/26.jpg)
hs / fub - alp2-07 26
Verweise Java (Details später)
Zur Erinnerung:
boolean[] isPrime;isPrime = new boolean[max + 1];
erzeugt ein Feld mit dem Namen isPrime. Tatsächlich handelt es sich bei isPrime um einen Verweistyp!
Es gibt keinen Dereferenzierungs- oder Adressoperator in Java!isPrime[n] dereferenziert implizit !
![Page 27: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/27.jpg)
hs / fub - alp2-07 27
Parameterübergabe
Wenn eine Sprache (wie C oder Java) nur Wertparameter kennt,kann man mit Verweisen ähnliche Effekte erzielen wie mitVAR Parametern:
swap (x,y)int x,y;{ int tmp;
tmp=x;x=y;y=tmp;
}…swap(a,b);
Achtung:C-Code, ohne Wirkung swap (px,py)
int *px,*py;{ int tmp;
tmp=*px;*px=*py;*py=tmp;
}…swap(&a,&b);
Besser, wenn auch nicht schön.
![Page 28: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/28.jpg)
hs / fub - alp2-07 28
7.3 Elementare Speicherverwaltung
Vereinbarung einer static Variable veranlasst den Übersetzer Speicher in der durch den Typ festgelegten Größe zu reservieren.
class A{static int i=1;…i++; ..}
..add 0xf124, 1…0xf124 0xf128
Programm
Daten
Übersetzer
Die Variable i ist während der Lebensdauer dieser Klasse gültig.
![Page 29: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/29.jpg)
hs / fub - alp2-07 29
Automatische dynamische Speicherzuweisung
if (…) {…}else {int i =1while (i>0) {int j = i+1;…}i++;}
Speicherplatz für i und j wird dynamisch, d.h. zur Laufzeit (!)),und automatisch, auf dem Stapel, einem speziellen Speicherbereich im Hauptspeicher, angelegt – und wieder frei gegeben. (C Terminologie: automatic storage)
ij
Stapel(stack)
![Page 30: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/30.jpg)
hs / fub - alp2-07 30
Dynamische (programmierte) Speicherzuteilung
VAR p1 : POINTER TO INTEGER; ...NEW(p1);
Was passiert hier?
VAR p1…: Übersetzer legt Speicherplatz für einenZeiger (Verweis) an (!), ggf. auf Stapel.
Die Ausführung des Befehls NEW(p1) legt dynamisch Speicher fürein Objekt des Typs (hier INTEGER) an, auf das p1 zeigt und p1hat diese Adresse als Wert.
p1? NEW (p1) Speicherhalde
(heap)
![Page 31: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/31.jpg)
hs / fub - alp2-07 31
Freigeben von Speicher
Dynamisch zugewiesener ("allozierter")(*) Speicher sollte / mussfreigegeben werden, wenn er nicht mehr gebraucht wird.
Freigabeoperation: DISPOSE (p)Gibt den Speicher frei, der mit NEW(p) zugewiesen wurde.Die Größe des freizugebenden Speichers ergibt sich ausdem Verweistyp.
p1DISPOSE(p1)
"hängender Zeiger"(dangling pointer)
NULL
(*) storage allocation
![Page 32: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/32.jpg)
hs / fub - alp2-07 32
Operationen zur dynamischen Speicherzuweisung / -freigabenicht notwendig als Befehle der Sprache.
Wegen enger Verbindung zur Betriebssystem: (unverzichtbare) Bibliotheksfunktionen. C, C++: malloc(),free()
Programmierte Speicherzuweisung
Programmierte Speicherzuweisung gefährlich!Ohne korrekte Rückgabe Gefahr des Speicherlecks – immer weniger verfügbarer Speicher.
![Page 33: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/33.jpg)
hs / fub - alp2-07 33
Automatische Freigabe des Speichers(garbage collection)
• Bei modernen Sprachen wie Java, C# üblich.• Reduziert Fehleranfälligkeit signifikant.• Algorithmen nichttrivial und…• … zeitintensiv• Inakzeptabel: Unterbrechung der Programmausführung undDurchkämmen des Speichers auf freizugebende Speicherbereiche.
• Deshalb: Aufsammeln der freien Bereiche als Hintergrund-aktivität. (Algorithmen in Alp3)
![Page 34: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/34.jpg)
hs / fub - alp2-07 34
7.4 Verbundtypen
Bisher: Variable eines Typs kann einen Wert enthalten.
Ausnahme: Feld (array) als Folge fester Länge von Elementen gleichen Typs.
boolean [] prime = new int[MAX];
Verbundtyp (Produkttyp,Tupeltyp) (structure, record type,…) T: Wert wT von T setzt sich aus Werten von n Basistypen T1, …, Tn zusammen.d.h.: wT ∈ T1 ¥ T2 ¥ ... ¥ Tn
(Deshalb auch Tupeltyp)
![Page 35: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/35.jpg)
hs / fub - alp2-07 35
Werte von Verbundtypen:
Datensatz, Verbund, Tupel (record*, tuple**, structure)
Verbundtypen (fast) immer mit benannten Komponenten
Modula2:TYPE MesswertT RECORD Versuchsnr: INTEGER,
Wert: REAL; VAR Messwert: MesswertT;
C:typedef struct{int versuchsnr; double wert;} ;vTyp d1,d2;
(*) NICHT: Rekord (!),(**) besonders in Relationalen Datenbanken
Typname
vTyp
![Page 36: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/36.jpg)
hs / fub - alp2-07 36
Adressierung von Verbundkomponenten
Variablen.Komponentenname
IF (Messwert.Versuchsnr > 10) THEN…
Selektor
if (d1.versuchsnr == 100) {…}
![Page 37: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/37.jpg)
hs / fub - alp2-07 37
Verbunde: dynamisch oder automatisch?
Beides!
VAR x : RECORDTYP; VAR recPtr: POINTER TO RECORDTYP;NEW(recPtr);
Speicher aufdem Stapel.
Speicher aufder Halde.
Analog in C
Dagegen C# (!):Verbunde werden aus Verbundtypen mit dem Operatornew auf dem Stapel erzeugt ⇒ Gültigkeit auf Block begrenzt, ⇒ automatische Speicherbereinigung.
![Page 38: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/38.jpg)
hs / fub - alp2-07 38
7.5 Klassen und Objekte
Klassen (class type) sind Verbundtypen!
aber; Class MyComplex {
static double re,im;} ??
Klassenvariable unzureichend: nur eine komplexe Zahlmodelliert!
Dagegen i Class Complex {
double re,im;}
Klassentyp: Verbundtyp, ausdem sich beliebig vieleObjekte erzeugen lassen.
![Page 39: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/39.jpg)
hs / fub - alp2-07 39
Objekte sind Verweistypen!
Complex c1,c2;
erzeut einen getypten Verweis, der Objekte des Typs Complex referenzieren kann. erzeugt kein Objekt.Anfangswert: null , d.h. undefinierter Verweis
Erzeugung von Objektenc1 = new Complex();
Vorbelegung: c1.re und c1.im haben Standardwert (int: 0)
Java
Erzeugt wird ein Objekt (Exemplar, instance *) der Klasseinstance [engl.] != Instanz !!
![Page 40: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/40.jpg)
hs / fub - alp2-07 40
Zugriff auf Komponenten
Variablen, die einen Klassentyp besitzen, sind in Java (und C#) immer Verweistypen!
Es gibt keinen Dereferenzierungsoperator.
Unterschied zu Modula2,C u.a. !
Deshalb: c1.re = 2.0; Implizite Dereferenzierung bei jedem
Zugriff auf ein Objekt mit Hilfe einerVariablen vom (Klassen-)typ des Objekts.
Java kennt nur diese Verweise.
![Page 41: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/41.jpg)
hs / fub - alp2-07 41
Klassen und Objekten: ein Beispiel
Point p1,p2;//p1.x = 20; // null point exceptionPoint q1 = new Point();q1.x=100; q1.y=100;p1 = new Point();p2 = new Point();p1 = q1;
class Point { int x,y;void translate(int dx, int dy) {x+=dx; y+=dy;}double distance(Point q) {…}
}
Programm-abbruch!
p1.x==100 & p1.y==100 & p1==q1
Verbundtyp mit Methoden !
![Page 42: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/42.jpg)
hs / fub - alp2-07 42
Objekte und Methoden
Methodenaufruf:p1.translate (10,-5);
wendet die Methode auf das Objekt p1 an und bewirktfür dieses Objekt einen Effekt: // p1.x ==110// p1.y == 95
Objekte als Argumente:double d = p1.distance (q1);
soll euklidischen Abstand bestimmen. Angenommen: {…; q1.x=20; q1=null; return abstand;}ändert q1 nicht (Wertparameter), aber das Attribut x von q1 !
mehr zur Programmierungmit Objekten in Abschnitt 8
![Page 43: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/43.jpg)
hs / fub - alp2-07 43
Dualität Klassentyp – Modul
Java: Klasse ist Typschablone zur Erzeugung von Objektenund Modul, in dem Variablen, Konstanten, Funktionenzusammengefasst sind.Statische Komponenten sind unabhängig vom Zustand(eines Objekts)Initialisierung beim Laden der Klasse (class loader)
Class Math {
static final double PI = 3.1415926535898static double abs(double a){...}..}
Math: nurstatische Elemente
![Page 44: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/44.jpg)
hs / fub - alp2-07 44
Objekte besitzen Zustand
Objektzustand gegeben durch Werte der nichtstatischenAttribute
Methoden m() können Zustand lesen und / oder verändern. Falls kein Bezug auf Objektzustand, m() statisch vereinbaren.Beispiel: Anzahl erzeugter Punktobjekte!Offensichtlich unabhängig vom Zustand eines Objekts.
class Point { int x,y;void translate(int dx, int dy) {x+=dx; y+=dy;}double distance(Point q) {…}
}
![Page 45: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/45.jpg)
hs / fub - alp2-07 45
Dualität einer Klasse (Java)
class MyPoint {static private int count=0; static public int getCount(){return count;}private int x,y;void translate(int dx, int dy) {x+=dx; y+=dy;}double distance(MyPoint q) {…}
}
Zugriff auf dynamische Komponenten durch Objektvariablen:MyPoint p = new MyPoint();if(p.x > 0) {...}
Zugriff auf statische Komponenten: Klassennameif(MyPoint.count > 1000) {...} // wg. private nur eingeschränkt
Am Rande: Bei Einhalten Groß-/Kleinkonvention static/dynamic erkennbar
![Page 46: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/46.jpg)
hs / fub - alp2-07 46
Objekt und Klasse
p1 = new MyPoint(100,100);p1.translate(10,-10);p1.count++; // Manchmal sinnvoll
// meist gefährlich, hier fehlerhaftMyPoint.count++; MyPoint.translate(5,15); // Fehler
Zugriff auf Klassenattribute durch Methode erlaubt.
Keine Ausführung vonnicht-statischen Methodenunabhängig von einemObjekt.
Auch: Definition statischer Methoden, die dynamische Attribute verwenden, verboten.
class MyPoint {…static void nullify(){
if(count>MAX){x=0; y=0;} //Fehler. }}
![Page 47: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/47.jpg)
hs / fub - alp2-07 47
Gleichheit und Ungleichheit
MyPoint p = new MyPoint(1,1);MyPoint q = new MyPoint(p)
aber:p != q
Gleichheit von Objektena) Identität (der Verweise)
q = p;
b) Gleichheit der Komponentenwerteboolean equal(Point p){
return(x==p.x && y==p.y && count==p.count);}
if (p1.equal(p2){...};
![Page 48: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/48.jpg)
hs / fub - alp2-07 48
Zusammenfassung: Verweistypen und Verbunde in Programmiersprachen
Automatisch(GarbageColl., stack)
manuellDISPOSE
manuellfree()
Automatisch(Garbage Coll.)
Speicher-verwaltung
class: Halde,struct: Stapel
(stack)
HaldeALLOCATE
Kontextabhg.,malloc(): heap
Halde (heap)Speicher-allokation
implizit<var>^=....=<var>^
*<var>=....=*<var>
implizitDereferenz-ierung
Objektvar.,struct-Expl., nicht zwingend
Alle TypenPOINTER TO..
Alle Typen<var> *<type>
Objektvariablemit Klassentyp
Verweistyp
class undstruct
SatztypRECORD
Strukturstruct
Klasseclass
Verbundtyp
C#Modula2C (*)Java
(*) gilt auch für C++, dort zusätzlich Klassen, Objekte
![Page 49: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/49.jpg)
hs / fub - alp2-07 49
7.5 Konstruktoren
• erzeugt (*) ein Objekt vom Klassentyp Point mit vordefinier-ten Werten (Java: int mit 0).
• Point() ist der Standardkonstruktor.
• Jede Klasse besitzt Standardkonstruktor, der nicht vereinbart wird.
• Andere Konstruktoren mit eigenen Initialisierungen und überladenem Namen können definiert werden.
Point q1 = new Point();
(*) nicht: 'instantiiert' oder 'instanziiert'!!
Point (int i, int j){x=i; y=j;}Point p = new Point(70,100);
![Page 50: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/50.jpg)
hs / fub - alp2-07 50
Technischer Ablauf der Objektkonstruktion
MyName myVar = new MyName(…)
(1) Objekt auf der Halde erzeugen.
(2) Angegebenen Konstruktor ausführen.
(3) Adresse des Objekts zurückgeben und den Wert der Variable des Typs der Klasse zuweisen.
Beachte: wenn es keine Variable (mehr) gibt, die auf ein Objektverweist, ist es für immer verloren! ⇒ Garbage Collection
Point p = new Point(10,15);p = null;
Dieses Objekt verschwindetauf Nimmerwiedersehen.
![Page 51: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/51.jpg)
hs / fub - alp2-07 51
Initialisierung von Objekten
Vier Möglichkeiten:
1. Implizit mit Voreinstellung int x,y; //x==0; y==0
2. Explizite direkte Initialisierungint x=100,y=100;
3. Explizite Initialisierung mit anonymem Blockint x,y;{x=50; y=70;}
4. Initialisierung durch Konstruktor (am häufigsten)Foo p = new Foo(10,20)
class Foo{int x,y;}
![Page 52: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/52.jpg)
hs / fub - alp2-07 52
Regeln im Umgang mit Konstruktoren
(1) <Klassenname>() ist der Standardkonstruktor einer Klasse. Falls kein anderer Konstruktor <Klassenname>(<parameterliste>) definiert wird, wird er automatisch generiert. (Sonst nicht !)
(2) Kein return in Konstruktor, kein Ergebnistyp, auch nicht void.
(3) Methode darf keinen Konstruktor aufrufen – aber umgekehrt.
![Page 53: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/53.jpg)
hs / fub - alp2-07 53
Regeln (2)(4) Konstruktor darf anderen Konstruktor aufrufen, aber nur
als erste Anweisung in der Form this(…)
this: generische Bezeichnung für das aktuelle Objekt
class MyPoint {static int count=0; int x,y;MyPoint(int i, int j){this.x=i; this.y=j;MyPoint.count++;
}MyPoint(MyPoint p){this(p.x, p.y);
}..}
Dieser Konstruktor wird aufgerufen!
![Page 54: 7. Klassen, Objekte, Typen · 7. Klassen, Objekte, Typen 7.1 Klassen zur Programmstrukturierung 7.2 Verweise (Zeiger) 7.3 Elementare Speicherverwaltung 7.4 Verbundtypen](https://reader030.vdocuments.pub/reader030/viewer/2022020101/5e1b971e91e8b6538a688475/html5/thumbnails/54.jpg)
hs / fub - alp2-07 54
Beachte die Feinheiten!class MyPoint {
static int count=0; int x,y;MyPoint(int i, int j){this.x=i; this.y=j;MyPoint.count++;
}MyPoint(MyPoint p){
this(p.x, p.y);}..}
count++; Doppelt gezählt
Was liefert..? Point p1=new Point(10,15);p2=new MyPoint(p1);boolean b = p1.equal(p2); Kopie anlegen