• Keine Ergebnisse gefunden

Programmierkurs Java i S

N/A
N/A
Protected

Academic year: 2021

Aktie "Programmierkurs Java i S"

Copied!
13
0
0

Wird geladen.... (Jetzt Volltext ansehen)

Volltext

(1)

i S

Programmierkurs Java

UE 18 – Dynamisches Binden

(2)

i S

Gliederung

– Definition – Prinzip

– Beispiel Graphik – Instanz-Methoden

– private Instanz-Methoden – Klassen-Methoden

– Attribute – Vorteile – Beispiel

– Zusammenfassung

(3)

i S

Definition

Dynamisches Binden:

– Zuordnung eines Methodenrumpfes zu einem Methodenaufruf erst zur Laufzeit

– beim Aufruf einer Instanz-Methode über eine Objektvariable wird diejenige Methode ausgeführt, die der Klasse des referenzierten Objektes zugeordnet ist ( überschriebene Methode)

– Relevanz: Laufzeit

– statisches Binden: Zuordnung eines Methodenrumpfes zu einem

Methodenaufruf bereits zur Compilierzeit

(4)

i S

Prinzip

class Tier {

void gibLaut() { ... } }

class Hund extends Tier {

void gibLaut() { ... } // überschriebene Methode }

Tier t = new Hund(); // Polymorphie

t.gibLaut(); // dyn. Binden

static void aergern(Tier tier) { tier.gibLaut(); ...

}

aergern(new Tier()); // Aufruf von gibLaut der Klasse Tier aergern(new Hund()); // Aufruf von gibLaut der Klasse Hund

(5)

i S

Beispiel Graphik (1)

class Graphik { void draw() {

IO.println("Graphik draw");

} }

class Rectangle extends Graphik { void draw() {

IO.println("Rectangle draw");

} }

class Square extends Rectangle { void draw() {

IO.println("Square draw");

} }

class Circle extends Graphik { void draw() {

IO.println("Circle draw");

} }

(6)

i S

Beispiel Graphik (2)

class GraphikSet { Graphik[] elemente;

int next;

GraphikSet(int groesse) {

this.elemente = new Graphik[groesse]; this.next = 0;

}

void add(Graphik obj) {

this.elemente[this.next++] = obj;

} void drawAll() {

for (int i=0; i<this.next; i++)

this.elemente[i].draw(); // dynamisches Binden!

} } class GraphikProgramm {

public static void main(String[] args) { GraphikSet menge = new GraphikSet(100);

menge.add(new Circle()); // Polymorphie!

menge.add(new Square());

menge.drawAll(); // Ausgabe: Circle draw // Square draw } }

(7)

i S

Instanz-Methoden

 Instanz-Methoden werden dynamisch gebunden

class X {

void print() { // Instanzmethode IO.println("in X");

}

void call() {

this.print(); // dynamisch gebunden }

}

class Y extends X {

void print() { // überschrieben IO.println("in Y");

}

public static void main(String[] args) { Y y = new Y();

y.call(); // Ausgabe: in Y } }

(8)

i S

private Instanz-Methoden

 Ausnahme: private Instanz-Methoden werden statisch gebunden

class X {

private void print() { // private Instanzmethode IO.println("in X");

}

void call() {

this.print(); // statisch gebunden }

}

class Y extends X {

void print() { // überschrieben IO.println("in Y");

}

public static void main(String[] args) { Y y = new Y();

y.call(); // Ausgabe: in X } }

(9)

i S

Klassen-Methoden

 Klassen-Methoden werden statisch gebunden

class X {

static void print() { // Klassen-Methode IO.println("in X");

}

void call() {

this.print(); // statisch gebunden (X.print();) }

}

class Y extends X {

static void print() { // überschrieben IO.println("in Y");

}

public static void main(String[] args) { Y y = new Y();

y.call(); // Ausgabe: in X } }

(10)

i S

Attribute

 Dynamisches Binden gilt nur für Methoden nicht für Attribute!

class X { int i;

void f() { ... } }

class Y extends X { int i;

void f() { ... } }

...

X obj = new Y();

obj.f(); // Aufruf der Methode f der Klasse Y obj.i = 3; // Zugriff auf Attribut i der Klasse X ((Y)obj).i = 5; // Zugriff auf Attribut i der Klasse Y

(11)

i S

Vorteile

 Erweiterbarkeit (ohne Quellcode-Änderung):

Implementierung von erweiterbaren – Funktionen

– Frameworks

die auch für Objekte einsetzbar sind, deren Klassen zur

Entwicklungszeit der Funktionen bzw. Frameworks noch gar nicht existierten.

Beispiel: Java-GUI-Framework AWT

(12)

i S

static boolean nullstelle(Funktion funk, int von, int bis) { for (int x = von; x <= bis; x++) {

if (funk.f(x) == 0) return true;

}

return false;

}

class Funktion { int f(int x) { return x; } }

class QuadratFunktion extends Funktion { int f(int x) { return x * x; }

}

Funktion id = new Funktion();

Funktion q = new QuadratFunktion();

Beispiel

(13)

i S

Zusammenfassung

 Polymorphie: Fähigkeit einer Objektvariablen vom Typ T

1

, auf

Objekte von Klassen eines anderen Typs T

2

verweisen zu können, wobei in Java T

2

Unterklasse von T

1

sein muss

 Statisches Binden: Bereits zur Compilierzeit steht fest, welche Methode ausgeführt wird (Klassenmethode, private

Instanzmethoden)

 Dynamisches Binden: Erst zur Laufzeit wird ermittelt, welche Methode ausgeführt wird (nicht-private Instanzmethoden)

 Beim Aufruf einer nicht-private Instanz-Methode über eine

Objektvariable wird diejenige Methode ausgeführt, die der Klasse des referenzierten Objektes zugeordnet ist

 Vorteil des dynamischen Bindens: einfache Erweiterbarkeit von

Programmen (ohne Quellcode-Änderungen)

Referenzen

ÄHNLICHE DOKUMENTE

Auf der nächsthöheren Stufe, auf welcher die Bataillons- und Abteilungskommandanten ausgebildet werden, zeigt sich wiederum die gleiche Unterteilung des Lehrstoffes in zwei

 Klassenbibliothek: Sammlung von nützlichen, häufig gebrauchten Klassen, die (anderen) Programmierern zur Verfügung gestellt werden..  Java-Packages: Hilfsmittel zur

 In einer Datei können mehrere Klassen definiert werden, aber nur eine darf eine public-Klasse sein. Der Name der Datei muss in diesem Fall gleich dem Namen der

Dietrich Boles.

 Die Instantiierung abstrakter Klassen ist nicht möglich; es lassen sich wohl aber Objektvariablen definieren, womit. Polymorphie/dynamisches Binden ausgenutzt

wird während der Ausführung der Funktion f ein Fehlerobjekt vom Typ Ex3 geworfen, dann wird zunächst (*8) ausgeführt und danach die Funktion h unmittelbar verlassen und

T kann im weiteren Klassenkopf und im Klassenrumpf (fast) überall da verwendet werden, wo Klassennamen stehen können..  Problem: beerTransfuser kann nur

Das Wasser wurde durch Glühen (5 Minuten lang) des lufttrocknen Gesteins über der Deville'schen Lampe bestimmt.. auch das letztere bestimmt. Diese Bestirnmungsweise