•10.06.01 OO-Programmausführung Die OOP betrachtet eine Programmausführung als ein System kooperierender Objekte O1 O3 O2 Speicher Konzepte objektorientierter Programmierung • • • • Objekte Klassen Nachrichten Kapselung • Vererbung • Polymorphismus Einführung später! •1 •10.06.01 OOP: Das Grundmodell • Objekte haben einen lokalen Zustand • Objekte empfangen und bearbeiten Nachrichten Ein Objekt kann – seinen Zustand ändern, – Nachrichten an andere Objekte verschicken, – neue Objekte erzeugen oder existierende Objekte löschen. • Objekte sind grundsätzlich selbständige Ausführungseinheiten, die unabhängig voneinander und parallel arbeiten können. Was ist ein Objekt ? Ein Objekt ist ein Softwarebündel aus Variablen und mit diesen Variablen zusammenhängende Methoden. Ein Objekt ist eine konkrete Ausprägung bzw. eine Instanz einer Klasse. dynamisch! •2 •10.06.01 Objekt Buch Attribute: - Eigenschaft 1 - Eigenschaft 2 . . . . Verhalten: - Methode 1 - Methode 2 - Methode 3 . . . . Eigenschaften: Harry Potter - Titel - Autor - Verlag . . . . . J.K. Rowling Bloomsbury Verhalten: - getAutor( ) - getInhaltsverzeichnis ( ) - suche ( Schlüsselwort ) - setTitel( Titel ) - setVerlag( Verlag ) . . . statisch! Was ist eine Klasse ? Eine Klasse ist ein Bauplan, um Objekte einer bestimmten Sorte zu erzeugen. Ohne Klassen gibt es keine Objekte in Java! Klassen besitzen den Vorzug der Wiederverwendbarkeit. •3 •10.06.01 Rechteck-Objekte (x, y) • Höhe Fläche Umfang verkleinern Breite vergrößern verschieben klonen Klasse Klasse Rechteck Rechteck_A x=0 y=0 höhe = 10 breite = 10 Verkleinern Fläche Schieben x Equal y getX höhe Rechteck getY breite Rechteck Umfang Koordinaten Rechteck_B x=0 y=0 höhe = 10 breite = 10 Rechteck_C x = 33 y = 45 höhe = 15 breite = 15 •4 •10.06.01 public class Rechteck { // Attributen int x; Klasse Rechteck int y; int width; int height; // Konstruktoren public Rechteck() { x = 0; y = 0; width = 10; public class Main { height = 10; } // Main-Methode public static void main( String[] args ) { // Methoden Rechteck r1 = new Rechteck(); public int umfang() { Rechteck r2 = new Rechteck(); return 2*(width + height); int u = r1.umfang(); } int f = r2.flaeche(); } public int flaeche() { } // end of class Main return (width * height); } } // end of class Rechteck Was sind Nachrichten ? Methodenaufrufe -Empfänger - Name der auszuführenden Methode - Parameter B.doSomething( args ); A B Attri..1 Attri..3 ....... Attri..1 Attri..3 ....... C.doThis( args ); return 345; Attri..1 Attri..3 ....... C •5 •10.06.01 Nachrichten person1.equal(person2) Empfänger Nachricht Argumente Achtung! Bevor ich eine Nachricht zu einem Objekt schicke, muss dieses Empfängerobjekt im Speicher existieren. Was ist Kapselung ? Die Einschränkung des Zugriffs auf die Instanzvariablen eines Objektes durch Objekte anderer Klassen Man spricht von einer Kapselung des Objektzustands. Attribut 1 Attribut 2 usw . . . . Privater Zustand Öffentliche Methoden (API) API Application Programming Interface. Kapselung schützt so den Objektzustand vor “unsachgemäßer” Änderung und unterstützt Datenabstraktion. •6 •10.06.01 Kapselung Vorteile von Objekten sind ihre Modularität und die Möglichkeit, Information zu verbergen. Person Attributen: - private Name - private Vorname - private Geburtsdatum . . . . . Verhalten: - getName ( ) - getVorname ( ) - setGeburtsdatum( newDatum ) - setName ( newName ) . . . Argumente Syntax & Semantik • Die Syntax (“Satzbau”) einer Programmiersprache beschreibt, welche Zeichenfolgen gültige Programme bilden. • Die Semantik einer Programmiersprache definiert die genaue “Bedeutung” von Programmen in dieser Sprache. Natürliche Sprachen Syntaktisch korrekte sprachliche Äußerungen können mehrere Bedeutungen haben, Beispiel "Er sieht das Mädchen mit dem Fernrohr.” - syntaktisch korrekt - aber mehrere Bedeutungen •7 •10.06.01 Java-Anwendung Rechteck.java class Rechteck { // Feldvariablen Kreis.java class Geometrie { class Kreis { // Konstruktoren .... // Konstruktoren // Methoden .... // Feldvariablen // Feldvariablen .... .... Geometrie .java .... .... // Konstruktoren .... // Methoden .... .... // Methoden .... .... .... } } . . ( . . . . ) {. .} . . .. . main start } Java-Programme • Java-Programme bestehen aus einer oder mehreren Klassen • Eine Klasse ist in der Regel in einer eigenen, gleichnamigen Datei mit der Endung .java definiert, z. B. MyFirstProgram.java • Die Programmausführung beginnt mit der Methode main einer Klasse. •8 •10.06.01 Beispiel /* Ein einfaches aber vollständiges Java-Programm */ public class MyFirstProgram { public static void main(String[] args) { System.out.println( "Es läuft !"); } } // end of class MyFirstProgram Java-Programme Imperative Programmierung Objektorientierte Programmierung •9 •10.06.01 Imperative Grundbestandteile von Java Vergessen wir für eine Weile die objektorientierte Verpackung! Machen wir einen Zoom in den Rumpf einer Methode, wo die Welt noch schön und sequenziell ist. 1. Was ist eine Variable ? 2. Primitive Datentypen in Java 3. Deklaration von Variablen (OOP) 4. Ausdrücke in Java 5. Die vielen Operatoren von Java 6. Einfache Anweisungen 7. Anweisungen zur Ablaufsteuerung Literale (explizite Wertangabe) - Zahlen -Ganze Zahlen -Reelle Zahlen 7, -13 0.5, 1.0 - Zeichen -sichtbar -unsichtbar ‘a‘, ‘2‘, ‘!‘ ‘\n‘ ‘\t‘ - Wahrheitswerte true, - Strings (Zeichenketten): false "text" •10 •10.06.01 Primitive Datentypen in Java Java legt für jeden primitiven Datentyp eine feste Speichergröße und damit einen festen Zahlenbereich fest. Typ byte short int long float double boolean char Bits Zahlenbereich init. 8 -128 . . . 127 0 16 -32.768 . . 32.767 0 32 -231 . . . 231-1 0 63 63 64 -2 . . . 2 -1 0 32 ca. 3.402*1038 . . 1.402*10-45 0.0 308 -324 64 ca. 1.798*10 . . 4.94*10 0.0 1 true, false false 16 Unicode \u0000 Variablen • Variablen sind Stellen im Speicher, in denen Werte abgelegt werden können. Sie sind ausgezeichnet durch Namen, Typ und Wert. • Variablen müssen vor der erstmaligen Benutzung deklariert werden. • Variablen können fast überall deklariert werden. Ihr Gültigkeitsbereich erstreckt sich von der Stelle ihrer Deklaration bis zum Ende des Blocks, in dem sie deklariert wurden. { Variablendeklaration Gültigkeitsbereich bis Ende des Blockes } Änderung des Wertes einer Variablen geschieht durch Wertzuweisung ( = ). •11 •10.06.01 Variablendeklaration Modifizierer Datentyp Name Wert int breite ; int hoehe = 10 ; float radius = 0.0 ; Semikolon public Strings private String sprache = "java"; String name = "" ; Namen von Variablen beginnen immer mit – einem Buchstaben – oder ´_´ – keine Sonderzeichen dazwischen – kein reserviertes java-Wort a2345, andreas _zahlen, _100 wie +, =,& usw. int, boolean, true Konventionen Variablennamen werden klein geschrieben große Buchstaben dazwischen oder „underlines“ dazwischen umfang penColor pen_color •12 •10.06.01 Variablen Instanzvariablen (Feldvariablen, Attribute) Variablen, in denen die Eigenschaften von Objekten gespeichert werden Lokale Variablen Hilfsvariable für Berechnungen, Lebenszeit: nur solange das Objekt existiert. die in den Methoden deklariert werden Lebenszeit: nur solange die Methode ausgeführt wird. Beispiel public class Time { // Instanzvariablen oder Eigenschaften private int hours ; private int minutes ; private int seconds ; public int toSeconds( ) { // Lokale Variablen int temp ; temp = seconds + minutes*60 + hours*3600; return temp; } .... } // Ende der Klassedeklaration •13 •10.06.01 Erste Klassedeklaration Kopf public class Time { // Attribute private int hours ; private int minutes ; private int seconds ; // Konstruktor public Time( ) { hours = 0; minutes = 0; Rumpf seconds = 0; } . . . Time zeit; zeit = new Time (); zeit.setSeconds( 10 ); // Methoden public void getSeconds( ) { return seconds; } . . . public void setSeconds( int secs ) { if ( secs>0 || secs<60 ) { seconds=secs; } } } // Ende der Time-Klasse Weitere Konventionen Variablennamen Beginnen mit Kleinbuchstaben myName Klassennamen Beginnen mit Großbuchstaben Rechteck Konstanten nur Großbuchstaben BLAU Methoden Beginnen mit Kleinbuchstaben setColor ( BLAU ) •14 •10.06.01 Ausdrücke Ein Ausdruck ist eine Folge von Variablen, Operatoren und Methodenaufrufen, der zu einem einzelnen Wert ausgewertet wird. Ein Ausdruck besteht aus: Operanden Variablen Konstanten Methodenaufrufe Operatoren unäre binäre ternäre Klammern Rundeklammern ( ) Bestimmen die Reihefolge der Auswertung Arithmetische Operatoren unär Operator Zeichen Beispiel positives Vorzeichen negatives Vorzeichen + - +3 -x binär Operator Zeichen Beispiel Multiplikation * a*b Division / 3/ 5 Rest % 6 % PI Addition + 10 + 3 Subtraktion - 10 - 3 •15 •10.06.01 Die arithmetischen Operationen in Java sind teilweise polymorph Beispiele x + a float Spezialfall: float Ergebnis double int x / a float Ergebnis double Konkatenation von Strings mit + "Hallo " + " Leute ! " Ergebnis "Hallo Leute ! " + Operator mit String Ist der Operand kein String, wird er implizit konvertiert: Beispiele: int x = 30 ; String hello = "Der Wert von x ist" + x ; gefährliche Beispiele: String str1 = "text " + 2 + 3; // "text 23" String str1 = 2 + 3 + " text "; // "5 text" String str1 = 2 +( 3 + " text "); // "23 text" •16 •10.06.01 Vergleichs- und Bedingungsoperatoren unär Operator Zeichen Beispiel logische Negation ! !a binär Vergleiche <,>,<=,>= a <= b Gleichheit == 3 == x Ungleichheit != min != max bedingt UND && a && b bedingt ODER || a || b Beispiele: boolean w1 = false; boolean w2, w3; w2 = !w1; w1 = 6%3 == 0; w2 = w1 || w2; w1 = (6<7) && (7<6); w3 = w1 != w2; Die Vergleichsoperatoren können nur mit den primitiven Datentypen von Java operieren und produzieren immer einen Wahrheitswert. Die Bedingungsoperatoren operieren nur mit Wahrheitswerten. •17 •10.06.01 Anweisungen zur Ablaufsteuerung Einzelne Anweisungen (statements) werden mit einem Semikolon abgeschlossen: Anweisungen werden durch geschweifte Klammern zu Blöcken zusammengefasst: a = b * c; { a = b * r; x = a + z/a; } Die Abarbeitungsreihenfolge der Anweisungen verläuft normalerweise von oben nach unten und von links nach rechts. Die Anweisungen zur Ablaufsteuerung verändern diese Reihenfolge der Abarbeitung. if-else-Anweisung if ( Ausdruck ) { Anweisungen } else { Anweisungen } verzweigt abhängig von einer Bedingung in einen von zwei Fällen •18 •10.06.01 if(a < b) { max = b;} else { max = a;} if(count == b) { count = 0; } nextHour()-Methode der Time-Klasse public void nextHour() { if ( hours < 23 ) { hours = hours + 1; } else { hours = 0; } } weiter mit if-else-Anweisung if( punkte >= 90 ) { note = 1; } else { if ( punkte >= 80 ) { note = 2; } else { if ( punkte >= 70 ) { note = 3; } else { if ( punkte >= 60 ) { note = 4; } else { note = 5;} } } } •19 •10.06.01 Methoden • Die Funktionalität einer Klasse von Objekten, bzw. deren Verhalten wird durch Methoden implementiert. • Methoden enthalten den ablauffähigen Programmcode. • Es gibt keine Methoden außerhalb von Klassen. • Jede Deklaration einer Methode kann eine Folge einzelner Parameter enthalten, die für die Berechnungen innerhalb der Methode notwendig sind. • Methoden dürfen nicht geschachtelt werden. Deklaration einer Methode Modifizierer Rückgabetyp Methodenname ( Parameterliste ) { Methodenrumpf } Beispiel: public void setTime( int h, int m, int s ) { if ( (s > 59) || (s < 0) || (m > 59) || (m< 0) || (h > 23) || (h < 0) ) { System.out.println( "Falsche Zeitangabe:"+h+":"+m+":"+s); } else { hours = h; minutes = m; seconds = s; } } •20 •10.06.01 return-Anweisung public int fakultaet ( int zahl ) { int fak = 1; if ( ( zahl == 0 ) || ( zahl == 1 ) ) return fak ; else { while ( zahl > 1 ) { fak = fak*zahl; zahl = zahl + 1; } return fak ; } } // end of factorial Die return-Anweisung beendet den Lauf der Funktion (Methode) und sorgt für die Übergabe des Ergebnis. return-Anweisung Die return-Anweisung beendet frühzeitig die Ausführung einer Methode. In einer Methode kann es mehrere return-Anweisungen geben. Methoden, die als Funktionen definiert sind, d.h. ein Ergebnis liefern, müssen durch eine return-Anweisung dieses Ergebnis übergeben. Wenn eine Methode kein Ergebnis zurückgibt, wird das Schlüsselwort void als Rückgabetyp verwendet und eine return-Anweisung ist nicht erforderlich. •21 •10.06.01 6. Übungsblatt public class Main { public static void main( String[] args ) { ClockFrame cf = new ClockFrame(); Timer clock = new Timer(cf); clock.start(); } } // end of class Main time.nextSecond(); oder time.previousSecond(); Timer •22