Programmieren I. Kapitel 10. Spezielle Features

Ähnliche Dokumente
Innere Klassen in Java

Repetitorium Informatik (Java)

Einstieg in die Informatik mit Java

Innere Klassen. Gerd Bohlender. Institut für Angewandte und Numerische Mathematik. Vorlesung: Einstieg in die Informatik mit Java

Java I Vorlesung Vererbung und Sichtbarkeit

Enumerations und innere Klassen

Beispiele für Ausdrücke. Der imperative Kern. Der imperative Kern. Imperativer Kern - Kontrollstrukturen. Deklarationen mit Initialisierung

Javakurs 2013 Objektorientierung

Kapitel 9. Programmierkurs. Attribute von Klassen, Methoden und Variablen. 9.1 Attribute von Klassen, Methoden und Variablen

Algorithmen und Datenstrukturen

Programmieren in Java

3 Objektorientierte Konzepte in Java

3. Klassen Statische Komponenten einer Klasse. Klassenvariablen

Theorie zu Übung 8 Implementierung in Java

Prof. W. Henrich Seite 1

Klassen und Objekte. Einführung in Java. Folie 1 von Mai Ivo Kronenberg

Programmieren II. Innere Klassen. Heusch 10, Ratz 5.2.1, Institut für Angewandte Informatik

6. Globalübung (zu Übungsblatt 8)

5.5.8 Öffentliche und private Eigenschaften

AuD-Tafelübung T-B5b

Java Einführung Methoden in Klassen

5. Tutorium zu Programmieren

Einstieg in die Informatik mit Java

Java Schulung (Java 2 Java Development Kit 5 / 6)

Einstieg in die Informatik mit Java

Silke Trißl, Prof. Ulf Leser Wissensmanagement in der Bioinformatik. Jede Applikation braucht eine Klasse mit einer main-methode

Kapitel 3. Programmierkurs. Arten von Anweisungen. 3.1 Was sind Anweisungen?

3 Objektorientierte Konzepte in Java

Einführung in die Informatik

Javakurs FSS Lehrstuhl Stuckenschmidt. Tag 3 - Objektorientierung

Arten von Klassen-Beziehungen

Java Einführung Methoden. Kapitel 6

Einstieg in die Informatik mit Java

FH D. Objektorientierte Programmierung in Java FH D FH D. Prof. Dr. Ing. André Stuhlsatz. Wiederholung: Gerüstbeispiel. Vererbungshierarchie: Typ 0

Java Kurs für Anfänger Einheit 4 Klassen und Objekte

Java Einführung Abstrakte Klassen und Interfaces

Programmieren I. Kapitel 8. Vererbung

Letztes Mal. static int ggt(int a, int b) { if (a == b) return a; else if (a > b) return ggt(a-b,b); else if (a < b) return ggt(a,b-a);

Einstieg in die Informatik mit Java

Gebundene Typparameter

Java Einführung Klassendefinitionen

Einstieg in die Informatik mit Java

Kapitel 8. Programmierkurs. Methoden. 8.1 Methoden

Objektorientierte Programmierung

Klausur Grundlagen der Programmierung

Prinzipien Objektorientierter Programmierung

Programmieren in Java

2. Methoden. n Generelles zum Aufruf von Methoden. n Parameterübergabemechanismen (call by value, call by reference)

Einführung in die Java- Programmierung

Objekt-Orientierte Programmierung

C# im Vergleich zu Java

Programmierkurs Java

Programmieren in Java

Javakurs für Anfänger

JAVA - Methoden

Objektorientierung (OO)

Einstieg in die Informatik mit Java

Objektorientierte Programmierung. Kapitel 12: Interfaces

Java I Vorlesung 6 Referenz-Datentypen

Vorkurs C++ Programmierung

Probeklausur: Programmierung WS04/05

Polymorphie/Späte Bindung Abstrakte Klassen Interfaces. Polymorphie/Späte Bindung Abstrakte Klassen Interfaces

Abschnitt 6: Klassen, Objekte und Methoden in Java

Objekt-Orientierte Programmierung

Geschachtelte Klassen

Algorithmen und Datenstrukturen 07

Java: Der Einstieg. Algorithmen und Datenstrukturen II 1

Einführung in die Informatik: Programmierung und Software-Entwicklung, WS 11/12 1. Kapitel 11. Listen. Listen

Übersicht. Vorstellung des OO-Paradigmas

Repetitorium Informatik (Java)

Kapitel 9: Klassen und höhere Datentypen. Klassen und höhere. Objekte, Felder, Methoden. Küchlin/Weber: Einführung in die Informatik

1. Grundzüge der Objektorientierung 2. Methoden, Unterprogramme und Parameter 3. Datenabstraktion 4. Konstruktoren 5. Vordefinierte Klassen

1 Polymorphie (Vielgestaltigkeit)

Geschachtelte Klassen

Einführung in Java. Arne Hüffmeier. Angelehnt an Java-Vorkurs der Freitagsrunde. Methoden implementieren. Michelle Liebers, Dennis Hoffmann

Scala. Abstrakte Elemente. Jevgeni Zelenkov. HM

Teil 1: Grundeigenschaften von Rechnern und Software

Java-Schulung Grundlagen

Kapitel 6. Vererbung

Kapitel 6. Vererbung

Programmieren 2 Java Überblick

Computeranwendung und Programmierung (CuP)

Einstieg in die Informatik mit Java

Kapitel 6. Vererbung

Programmieren I. Strategie zum Entwurf von Klassen. Beispiele. Design von Klassen. Dr. Klaus Höppner. Beispiel: Bibliothek

1.2 Attribute und Methoden Aufbau einer Java-Klasse:

Algorithmen und Datenstrukturen 06

Java: Eine Übersicht. Dennis Giffhorn. Lehrstuhl für Programmierparadigmen Universität Karlsruhe

Objektorientierte Programmierung. Objektorientierte Programmierung. Klasse. Objekt. Beispiel: Sportfest1. Methode. Eine Einführung mit BlueJ

Grundzüge der Programmierung. Wiederverwendung VERERBUNG

1.4. Funktionen. Objektorientierte Programmierung mit C++

2. Semester, 2. Prüfung, Lösung

Arten von Klassen-Beziehungen

Propädeutikum zur Programmierung

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

7. Objektorientierte Softwareentwicklung/3. Informatik II für Verkehrsingenieure

Kapitel 4: Klassen und Unterklassen

JAVA für Nichtinformatiker - Probeklausur -

Java - Klassen und Objekte

Java für Computerlinguisten

Transkript:

Programmieren I Kapitel 10. Spezielle Features

Kapitel 10: Spezielle Features Ziel: Besonderheiten von Java bei OO Konzepten statische Attribute und Methoden innere, verschachtelte und lokale Klassen anonyme Klassen Enumerationstypen Methoden höherer Ordnung: Methoden als Parameter von Methoden Methoden als Resultate von Methoden

Von objektorientiert zu imperativ mit static Definition: statische Attribute (auch: Klassenvariable): für alle Objekte der Klasse nur einmal vorhanden ansprechbar: auch über <<Klassenname>>.<<Attributname>> Beispiele und Anwendungen: Name der log Datei (Protokolldatei), in die alle Objekte ihre Aktivitäten protokollieren Buchführungsfunktionen einer Klasse über all ihre Instanzen (=Objekte) Klassenweite Konstanten static final float GRAVITY=9.81F;

Konkretes Beispiel (1/2) schöne Druckausgabe von Strings in gleich großen Käst chen; Kästchenbreite richtet sich nach längstem String Kästchenbreite ist für alle gleich => statisches Attribut class BoxedString { static int width; String name; BoxedString bs1 = new BoxedString(); BoxedString bs2 = new BoxedString(); bs1.name = Ein Text ; bs2.name = Dies ist noch ein Text ; bs2.width = max(wd(bs1.name), wd(bs2.name));

Einsatz statischer Attribute Im Beispiel gilt: bs2.width = bs1.width = BoxedString.width Grund: ein statisches Attribut gibt es nur einmal im Speicher Also Vorsicht vor den Seiteneffekten (bs2 modifiziert scheinbar bs1) Folge: gute Benutzung von statischen Variablen nicht über Objektnamen wie bs2.width oder bs1.width, sondern über den Klassennamen, also BoxedString.width Für bestimmte Aufgaben sinnvoll, aber keinesfalls zum Einsparen von lokalen Variablen oder Parametern von Methoden verwenden!!

Konkretes Beispiel (2/2) bessere Lösung: class BoxedString { static int width; String name; BoxedString(String name) { this.name = name; width = Math.max(wd(name)); BoxedString bs1 = new BoxedString( Ein Text ); BoxedString bs2 = new BoxedString ( Dies ist noch ein Text ); // BoxedString.width ist automatisch korrekt

Statische Methoden Definition: eine statische Methode gehört zur Klasse, nicht zu einzelnen Objekten kann daher nur auf statische Attribute zugreifen und statische Methoden aufrufen Beispiel: public static void main (...)... Nicht jedes Objekt hat sein main, sondern die Klasse einmal. In main werden erst Objekte kreiert. Zweck: Notationsvereinfachung für Utility Klassen wie Math, System,..., denn erst ein Math Objekt erzeugen zu müssen, um dann dessen.sin(1.3) aufzurufen, wäre sinnlos. Stattdessen: Math.sin(1.3)

Initialisierung von Variablen statische Attribute werden beim Laden der Klasse initialisiert (ggf. mit einem Standardwert) normale Attribute werden beim Kreieren des Objekts initialisiert (ggf. mit einem Standardwert) Lokale Variablen werden bei der ersten Wertzuweisung initialisiert (sofern es sie gibt, d.h.: keine Standardinitialisierung)

Spezielle Arten von Klassen Die im Folgenden vorgestellten Klassen sind hier nur der Vollständigkeit halber erwähnt; den Sinn Innerer Klassen werden wir nach der Diskussion von Sichtbarkeiten verstehen. Innere Klassen Verschachtelte Klassen Lokale Klassen Anonyme Klassen

Innere und verschachtelte Klassen Definition: eine Klasse, die innerhalb einer anderen Klasse deklariert wird und nicht als static deklariert ist, ist eine (echte) innere Klasse innerhalb, aber static => verschachtelte Klasse (Echte) innere Klassen erlauben keine static Attribute, verschachtelte Klassen schon verschachtelte Klassen sind wie normale äußere Klassen Objekte innerer Klassen gehören zu einem äußeren Objekt und können, nachdem dieses sie erzeugt hat, auf dessen Attribute und Methoden zugreifen.

Innere Klassen (Künstliches) Beispiel: class Outer { int a=42; int foo(int x) { return 2*x; class Inner { int i = foo(a); void bar() { this.i = Outer.this.a; analoge Notation zu this für new und super, z.b: Outer o = new Outer(); Outer.Inner i = o.new Inner();

Lokale Klassen Definition: innerhalb einer Methode oder eines Blocks definierte Klasse static ist sinnlos; nur im Block sichtbar können nicht auf die Variablen (sondern nur finals) der Methode zugreifen

Anonyme Klassen Definition: lokale Klassen ohne Namen damit ohne Konstruktor => Erweiterung von new um Argumente und Klassenrumpf Beispiel: Minimalstklassen im Zusammenhang mit GUIs (nicht Thema der Vorlesung)

Anonyme Klassen Beispiel au dem GUI Bereich: void foo() { class Mylistener extends MouseAdapter { public void mouseclicked(...) {dosomething(); window.addmouselistener(new Mylistener());... wird zu void foo() { window.addmouselistener(new MouseAdapter(){ public void mouseclicked(...) {dosomething(); );...

Enumerationstypen in Java Enumerationstypen sind endliche Datentypen, deren mögliche Werte aufgezählt werden. Beispiel: Ampelfarben sind rot, gelb, gruen Hacker Alternative: rot 0, gelb 1, gruen 2 anständiger Hacker: public static final int rot=0;... Immer noch keine Typsicherheit! Elegante Lösung seit Java 1.5: enum Ampelfarbe {rot, gelb, gruen;

Enumerationstypen in Java Erweiterungen: Argumente in () erlauben, eine allgemeine Konstruktorfunktion zu schreiben mit Attributen Beispiel: enum Coin { penny(1), nickel(5), dime(10), quater(25); private final int val; Coin(int value) { val=value; public int value() { return val; Und beim Aufrufer: Coin c = nickel; int v = c.value(); Methoden in { erlauben, individuelle Methodendefinitionen für jeden Wert zu schreiben

Allgemeinere for Schleifen ab Java 1.5 bisher nur: for (int i=0; i<100; i++) {... Wunsch: ähnliches, komfortables for für Enumerationstypen Lösung: die for in Schleife for (Ampelfarbe farb : Ampelfarbe.values()) { System.out.println(farb); values() ist geschenkt; (implizites) tostring() auch Dasselbe funktioniert für Iteratoren (später in der Vorlesung) und auch für Arrays: int [] a = {1,17,4,42; for (int i : a ) {...

Warnung Vorsicht: das Weiterlesen könnte dazu führen, dass Sie nicht mehr Java programmieren wollen Wenn sich dieser Zustand einstellen sollte: überspringen Sie den Teil lieber. Er ist nur der Vollständigkeit halber angegeben und zeigt den trickreichen Einsatz von Interfaces und anonymen Klassen.

Methoden als Argumente Methoden als Parameter (z.b. Sortierung oder für eine Differenzier Funktion diff die zu differenzierende Funktion f) Erste Lösung: double diff(fun f, double x) {... interface Fun { double apply(double x) ; class MyExpoFun implements Fun { public double apply(double x) { return Math.exp(2*x*x)/(x+1); double d = diff( new MyExpoFun(), 0 );

Methoden als Argumente Anonyme Klassen vermeiden die Namenssuche Lösung: double diff(fun f, double x) {... interface Fun { double apply(double x) ; double d = diff( new Fun() { public double apply(double x) { return Math.exp(2*x*x)/(x+1);,, 0 ); Meinungen?

Methoden als Argumente Etwas schönere Lösung (doch mit einem Namen, aber ohne Klasse, also in dem Sinne immer noch eine anonyme Klasse): double diff(fun f, double x) {... interface Fun { double apply(double x) ; Fun g = new Fun() { public double apply(double x) { return Math.exp(2*x*x)/(x+1); ; double d = diff( g,0 );

Methoden als Rückgabewerte Beispiel: g = shift (f,delta), also g(x) = f(x delta) Lösung: Fun shift (final Fun f, final double delta) { return new Fun() { public double apply(double x) { return f.apply(x delta); ;

Methoden als Rückgabewerte Anwendungsbeispiel: cos = shift (sin, /2) Anwendung: Fun mycos = shift(mysin, Math.PI/2); mit der zusätzlichen Definition Fun mysin = new Fun () { public double apply(double x) { return Math.sin(x); ; Meinungen?

Zusammenfassung Statische Attribute und Methoden verhindern unnötiges Kreieren einer einzigen Laufzeitinstanz Klassen kann man schachteln Es gibt namenlose Klassen Enumerationstypen und erweiterte for Schleifen sind schöne Erweiterungen in Java 1.5 Methoden höherer Ordnung sind krückenhaft implementierbar