Grundwissen 10. Klasse 16.08.2011 1. Grundlegende Datentypen a) Wichtige Datentypen ℝ double int ℤ Wahrheitswerte boolean Zeichen char Rundungsfehler! 1.42 oder 2E+2 maximal ± 2 Milliarden 2374 true oder false Unicodezeichen b) Wichtige Klassen String Zeichenketten 'A' "Hallo, Welt" Math Mathematische Funktionen Math.sin( ) Math.cos( ) Math.sqrt( ) Random Zufallszahlen, Achtung nur ein einziges Objekt erzeugen! System Ausgaben an die Konsole, Beenden eines Programms Grundwissen 10. Klasse 2. Modellierung a) Warum modelliert man Programme? • Für die Kommunikation zwischen Entwicklern und dem Kunden • Um festzulegen was überhaupt realisiert werden soll • Um Fehlentwicklungen zu vermeiden • Um Kosten zu sparen b) UML Unified Modelling Language Diagramme • Klassendiagramme, Objektdiagramme • Zustandsdiagramme • Aktivitätsdiagramme (Automaten) • Sequenzdiagramme c) UML Schreibweisen • [Voraussetzung] Voraussetzung/Bedingung die erfüllt sein muss. • {Beschränkung} Einschränkung auf einen Teil der möglichen Werte z.B. radius{>0}. Grundwissen 10. Klasse 3. Variablen a) Variablen Variablen werden deklariert durch <Typ> <Name>; Abhängig von der Position wird es ein Attribut (Klassenrumpf) oder eine lokale Variable (Methodenrumpf). Alle Variablen gelten nur innerhalb der sie umgebenden { }. b) Zuweisung Zuweisungen werden mit = durchgeführt. Nicht zu verwechseln mit == welches Vergleichen bedeutet. <Ziel> = <Term> Die Ziel Variable, Attribut wird überschrieben. Beispiel a = a + 1; alternativ a++ a wird um eins erhöht int i = 0; Die Variable i wird definiert und gleichzeitig mit einem Wert befüllt. Grundwissen 10. Klasse { Anfang des Methodenrumpfes 4. Methoden <Ergebnistyp> <Name>( <Parameter> ) { … return <Ergebnis> ; double max( double a, double b) { if ( b > a ) { return b; } Methodenrumpf } return a; } } Ende des Methodenrumpfes Mit return legt man das Ergebnis der Methode fest und beendet sie. Gibt es kein Ergebnis so lautet der Ergebnistyp void, in diesem Fall darf return entfallen. Jede Methode gehört zu einem Objekt, dieses Objekt kann man mit this ansprechen, solange der Name eindeutig ist darf this weggelassen werden. Die Methode main ist die erste Methode die in einem Programm ausgeführt wird. Sie lautet immer public static void main (String[] args) { … } Beispiel public static void main(String[] args) { System.out.println(“Hello World!“); } Grundwissen 10. Klasse 5. Umwandlung von Klassendiagrammen zu Java Klassen + public # protected – private class Bankkonto { private long betrag; private String eigentuemer; private long dispo; public long einzahlen(long betrag) { … } public long abheben(long betrag) { … } } Die Methodenrümpfe können dem Klassendiagramm nicht entnommen werden. Grundwissen 10. Klasse 6. Zustandsdiagramm Jede Belegung der Attribute eines Objekts kann als Zustand interpretiert werden. Jede Zuweisung ist ein Übergang zwischen zwei solchen Zuständen. Beispiel Ein Ampel hat 4 gültige Zustände. Hierbei werden 4 ungültige Zustände weggelassen. Das Diagramm erlaubt es übersichtlich darzustellen, wie sich Daten ändern. Grundwissen 10. Klasse 7. Objektlebenszyklus a) Objekterzeugung Objekte werden erzeugt durch den Befehl new. new Kreis(10, 7, 5); Es wird ein leeres Objekt erzeugt und der passende Konstruktor aufgerufen. Kreis(double x, double y, double radius) { this.x = x; this.y = y; this.radius = radius; } Konstruktoren erkennt man daran, dass sie keinen Ergebnistyp haben und genauso heißen wie die Klasse. b) Garbage Collection Ein Objekt wird vom Garbage Collector gelöscht, wenn dieser feststellt, dass es keine Referenz mehr auf dieses gibt. Also es keine Möglichkeit mehr gibt auf das Objekt zuzugreifen. Es ist in Java nicht möglich Objekte explizit zu zerstören. Grundwissen 10. Klasse 8. Bedingte Anweisung (if, else) if ( <Bedingung> ) { if ( <Bedingung> ) { … … } } else { … } Die Bedingung muss den Typ boolean liefern. Also true oder false. Möglichkeiten hierfür sind: Methode Variable Vergleiche Logik boolean <name>(<parameter>) boolean <name> <, <=, ==, >=, > kleiner, kleiner gleich, gleich, größer gleich, größer |, &, ! oder, und, nicht Beispiel boolean werktag; long betrag; if (konto.istGedeckt( ) & (betrag < 1000 | werktag) ) { … } Das Konto muss gedeckt sein und am Wochenende muss der Betrag kleiner als 1000 sein. Grundwissen 10. Klasse 9. Schleifen (for, while, do while) for (<Deklaration>; <Bedingung>; <Iteration> ) { … } Es wird in der Deklaration eine lokale Variable definiert. Die Bedingung wird am Anfang jedes Durchgangs geprüft. - meist in der Form for (int i = <Anfang>; i < <Ende>; i++) { … } Am Ende jedes Durchgangs wird die Iteration ausgeführt. do { while ( <Bedingung> ) { … … } while ( <Bedingung> ); } Ist die Bedingung wahr wird der Schleifenrumpf ausgeführt. Die beiden while Schleifen unterscheiden sich darin, dass do-while das erste mal immer ausgeführt wird. Beispiel for (int i = 5; i < 10; i++) {…} while( i < 10) {…} do {…} while (i < 10) 5 Schleifendurchgänge für i = 5 bis 9, bei 10 endet die Schleife. Die Schleife wird ausgeführt solange i < 10 ist. Die Schleife wird einmal ausgeführt, danach solange i < 10 ist. Grundwissen 10. Klasse 10. Felder ( [ ] ) Felder benötigt man wenn man mehrere Objekte der selben Klasse verwalten will. <Typ>[ ] <name> double[] werteTabelle Hierbei darf die Anzahl auch erst zur Laufzeit feststehen, daher muss das Feld wie ein Objekt erzeugt werden. <name> = new <Typ>[<Anzahl>] werteTabelle = new double[100]; Man kann nun die einzelnen Elemente des Feldes wie normale Variablen verwenden. <name>[<index>] werteTabelle[0] = 12.5; … Die Anzahl der Elemente kann über das Attribut length abgefragt werden. werteTabelle.length Verwendung in einer Schleife for ( int i = 0; i < werteTabelle.length; i++) { System.out.println(werteTabelle[i]); } Grundwissen 10. Klasse 11. Aktivitätsdiagramm / Automaten Mit Automaten modelliert man die verschiedenen Phasen die ein Algorithmus durchläuft. Im Unterschied zum Zustandsautomaten wird angegeben, welche Aktion einen Übergang auslöst (auslösende Aktion) und welche Aktion ausgelöst wird (ausgelöste Aktion). Beispiel Eine Stoppuhr läuft (L), hält (S) oder ist aus (A). Um zu vermeiden, dass man die Uhr aus Versehen direkt wieder stoppt, geht dies erst nach 1sec. auslösende Aktion [Bedingung] / ausgelöste Aktion Grundwissen 10. Klasse 12. Fallunterscheidung (switch, case) Fallunterscheidungen erlauben es bei Zahlwerten (byte, char, short, int) direkt zu springen ohne Kaskaden von bedingten Anweisungen (if's) schreiben zu müssen. switch (<Zahl>) { switch (phase) { case 0: //Ei case <konstante Zahl>: zeichneEi( ); <Anweisungssequenz> break; case 1: //Huhn break; zeichneHuhn( ); … break; case 2: //Chicken Nuggets default: zeichneNuggets( ); <Anweisungssequenz> break; default: } zeichneFehler( ); } Abhängig von der <Zahl> wird zum passenden case gesprungen. Das break beendet den Fall. default wird angesprungen, wenn es keinen passenden Fall gibt. Grundwissen 10. Klasse 13. Design und Programmierung eines Automaten Der aktuelle Zustand wird in einem Attribut gespeichert. Jede Aktion wird eine eigene Methode. Alternativ kann die auslösende Aktion auch als Parameter übergeben werden, was jedoch eine zusätzliche Fallunterscheidung notwendig macht. In der Methode für die auslösende Aktion, wird zuerst nach dem Zustand eine Fallunterscheidung gemacht (if, switch). Man prüft ob die Bedingung erfüllt ist, dann wird die Methode die zur ausgelösten Aktion gehört aufgerufen. public void knopfStartStop( ) { switch (zustand) { case 'L': if (zeit > 1) { uhrStoppen( ); zustand = 'S'; } Und am Ende der neue Zustand gesetzt. Hinweis: Buchstaben sind Zahlen (Unicode!), daher ist switch erlaubt. break; case 'S': uhrStarten( ); zustand = 'L'; break; } } Grundwissen 10. Klasse 14. Sequenzdiagramm Um konkrete Aufrufsequenzen darzustellen verwendet man Sequenzdiagramme. Hier steht die zeitliche Abfolge im Vordergrund. Der Kopf ist ein Objektdiagramm, welches die Erzeugung des Objekts markiert (new). Die Lebenslinie stellt die Existenz dar. Ein Kreuz steht für die Zerstörung des Objektes. Für jede aktive Methode des Objektes wird ein Balken über die Lebenslinie gelegt. Welcher beim Aufruf beginnt und beim Methodenende aufhört. Methodenaufrufe werden durch Pfeile dargestellt. Beispiel class A { void h( ) { B b = new B( ); b.f( ); b.g( ); } } Grundwissen 10. Klasse 15. Assoziation Die Beziehungen zwischen Klassen lassen sich grob in drei Kategorien aufteilen. • Referenz, es werden Objekte der anderen Klasse verwendet. (Lose Beziehung) • Aggregation, es gibt Attribute die Referenzen auf Objekte der anderen Klasse enthalten. Diese Objekte können aber noch von anderen Objekten referenziert sein. (Geteilte Objekte) • Komposition, wie Aggregation nur das die referenzierten Objekte ausschließlich von diesem Objekt referenziert werden. (Exklusive Objekte) Aggregation Referenz Komposition Die Zahlen haben die selbe Bedeutung wie beim ER Diagramm (9. Klasse) Wir kennen bisher drei Arten Attribute. Daten, Zustand, Aggregation/Komposition. Grundwissen 10. Klasse 16. Vererbung Klassen können andere Klassen erben. Hierdurch übernimmt die Klasse alle Methoden und Attribute der Oberklasse. Die Unterklasse kann nun neue Methoden definieren oder bestehende Überlagern. Um explizit auf die Oberklasse zuzugreifen verwendet man den Bezeichner super (analog zu this). Methoden können abstrakt sein, dann besitzen sie keinen Methodenrumpf mehr sonder überlassen dies der Unterklasse. Eine Klasse die nur abstrakte Methoden besitzt nennt man Interface (Schnittstelle). Eine Unterklasse kann wie ihre Oberklasse verwendet werden. Umgekehrt ist dies nicht möglich. Beispiel Punkt p = new Kreis( ); // ist erlaubt Figur f = new Kreis( ); // ist erlaubt f = p; // wäre in dieser Konstellation zwar richtig muss aber mit einem Cast erzwungen werden f = (Kreis)p; Kreis k = new Punkt(); // ist nicht erlaubt Grundwissen 10. Klasse 17. Polymorphie Polymorphie bedeutet, dass beim Methodenaufruf noch nicht feststeht welcher Code ausgeführt wird. Sobald Vererbung ins Spiel kommt kann jedes Objekt auch ein Objekt einer beliebigen Unterklasse sein, welche komplett andere Implementationen einer Methode besitzen kann. Dies erlaubt polymorphe Algorithmen zum Beispiel zum Sortieren. Eine Klasse deren Objekte sortierbar sein sollen, muss dann lediglich eine Methode kleiner besitzen. Wie diese arbeitet ist für das Sortieren nicht von Bedeutung. Beispiel BubbleSort interface Sortierbar { abstract boolean kleiner(Sortierbar s); } void bubbleSort(Sortierbar[ ] werte) { boolean sortiert = false; Sortierbar temp = null; while (!sortiert) { for(int i = 1; i < werte.length; i++) { sortiert = true; if( werte[i].kleiner(werte[i-1]) ) { Arrays.swap(werte, i, i-1); sortiert = false; } } } Grundwissen 10. Klasse 18. Projektphasen a) Anforderungsanalyse Es wird grundsätzlich festgelegt was das Programm machen soll. Hierfür gibt es viele Möglichkeiten. • Handbuch erstellen • Use-Cases schreiben. Use-Cases sind kleine Geschichten die beschreiben wie ein Anwender bestimmte Probleme löst. • Zeichnungnen, Texte usw. b) Systemdesign Der Aufbau und die Struktur des Programms wird festgelegt. Hierzu verwendet man UML Diagramme und Texte. Es wird der grobe Aufbau festgelegt. c) Programmierung Der Entwurf wird in Programmcode übersetzt. d) Test Die Anwendung wird anhand der Anforderungsanalyse getestet. Software IDE integrated development environment JDK java development kit JRE java runtime environment Entwurf Dia http://dia-installer.de/ integrierte Entwicklungsumgebung Java Entwicklungs Werkzeuge Java Laufzeitumgebung Freeware IDE Eclipse http://www.eclipse.org/ Freeware IDE BlueJ http://www.bluej.org/ Freeware JDK Java http://www.oracle.com/technetwork/java/javase/downloads Freeware