Vorlesung Programmieren 1. Objekte und Klassen 21.10.2015 | Prof. Dr. Ralf H. Reussner Version 1.0 LEHRSTUHL FÜR SOFTWARE-DESIGN UND –QUALITÄT (SDQ) INSTITUT FÜR PROGRAMMSTRUKTUREN UND DATENORGANISATION (IPD), FAKULTÄT FÜR INFORMATIK KIT – Universität des Landes Baden-Württemberg und nationales Forschungszentrum in der Helmholtz-Gemeinschaft sdq.ipd.kit.edu www.kit.edu Organisatorisches Die Anmeldung zu den Tutorien ist bereits geöffnet und endet am Donnerstag, den 22.10.2015, um 18 Uhr: http://webinscribe.ira.uka.de Erstes Tutorium: bringen Sie Ihren Laptop mit, falls vorhanden Die Tutorien ab Mittwoch (den 28.10.2015) Einverständniserklärung bitte diese Woche per ProgrammierenBriefkasten abgeben, wenn noch nicht geschehen Parallel zur Vorlesung im Audimax gibt es Live-Streams in die Hörsäle: -101, Gebäude 50.34, 1. UG -102, Gebäude 50.34, 1. UG 2 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Semesterplan - Überblick 21.10.15 Objekte und Klassen 28.10.15 Typen und Variablen 04.11.15 Kontrollstrukturen 11.11.15 Konstruktoren und Methoden 18.11.15 Arrays 25.11.15 Konvertierung, Datenkapselung, Sichtbarkeit 02.12.15 Listen und Abstrakte Datentype 09.12.15 Vererbung 16.12.15 Interfaces und Generics 23.12.15 Rekursion 30.12.15 06.01.16 3 13.01.16 Exceptions 20.01.16 Testen und Assertions 27.01.16 Parsen, Suchen, Sortieren 03.02.16 Java API, Objektorientierte Design-Prinzipien 10.02.16 Vom Programm zur Maschine, Best Practices 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Literaturhinweis - Weiterlesen Dietmar Ratz, Jens Scheffler, Detlef Seese und Jan Wiesenberger „Grundkurs Programmieren in Java“, 7. Auflage, 2014 (mit Java 8), Hansa-Verlag Abschnitt 2.2. „Was heißt Programmieren?“ Abschnitt 3.1. „Mein erstes Programm“ 4 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Was ist Programmierung? Aufgabe: Aufstellung der Personen der Größe nach Verfügbare Instruktionen: 1. nach links oder rechts weitergeben 2. nach links oder rechts weitergeben 3. Personen, die oder halten, wechseln den Platz Beispielablauf: 1. nach rechts 2. Platz wechseln 3. nach links 4. Platz wechseln 5 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) War das nun „Programmieren“? Zum Teil ja: Präzise festgelegter Prozess Eindeutige Instruktionen Es fehlt: Ein „allgemeiner Plan“, der angibt, welcher Schritt als nächstes zu tun ist Allgemein: für beliebige Anzahl von Personen Möglichst abstrakt, d.h. (z.B.) nicht nur auf Personen bezogen Dies wäre dann ein Programm! 6 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Bubblesort – Implementierung public class BubbleSort { public static void sort(long[] a) { for (int pass = 1; pass < a.length; pass++) { for (int i = 0; i < a.length - pass; i++) { if (a[i] > a[i+1]) { long tmp = a[i]; a[i] = a[i+1]; a[i+1] = tmp; } } } } } 7 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello World!"); } } 8 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello World!"); } } Wie starte ich mein Java-Programm? 9 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Praxis: Übersetzen von Java-Klassen Der Prozessor „versteht“ kein Programm in einer höheren Programmiersprache, wie z.B. Java! è Er verarbeitet nur Binärcode! Java-Programme müssen daher übersetzt („compiliert“) werden javac Jede Klasse in einer eigenen Datei: class SimpleProgram ➜ Datei „SimpleProgram.java“ Dateiname muss dem Klassennamen entsprechen Klassendeklaration in Java Java-Compiler javac SimpleProgram. java 10 21.10.2015 Vorlesung Programmieren: Objekte und Klassen „Ausführbare“ Version der Klasse („Bytecode“) SimpleProgram. class Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello World!"); } } ...$javac SimpleProgram.java Wie starte ich mein Java-Programm? Kompilieren 11 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Praxis: Ausführen von Java-Programmen Mit javac übersetze Programme (Klassen) werden mit dem Java-Interpreter java ausgeführt. Im Beispiel: java SimpleProgram Dabei wird in der angegebenen Klasse die Methode main gesucht und diese gestartet. main muss deklariert sein als public static void main(String args[]) { ... } Ausgaben können mittels System.out.print() und System.out.println() vorgenommen werden; letzteres gibt einen Zeilenvorschub mit aus 12 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello World!"); } } ...$javac SimpleProgram.java ...$java SimpleProgram Hello World! ...$ Wie starte ich mein Java-Programm? Kompilieren Ausführen 13 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Compiler vs. Übersetzer Ein Programm ist ein Algorithmus, der in einer Programmiersprache geschrieben wurde. Die Programmierer „sprechen“ also mit dem Rechner. Zum „Sprechen“ kann in einer „Sprache“ erfolgen, die der Rechner direkt versteht. è Binärcode Eine Notation mit Nullen und Einsen Für Menschen schwer verständlich Idee: Maschinennahe Sprachen, auch Assemblersprache genannt. Assemblersprache besteht aus Buchstaben und Ziffern, z.B.: MOV RG1 RG5 ADD RG2 RG4 14 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Compiler vs. Übersetzer Assemblercode kann direkt vom Prozessor ausgeführt werden. Abhängig vom Prozessortyp. Verwenden eines benutzernahen Sprache è è Höhere Programmiersprachen Übersetzer notwendig Übersetzer ist eine spezielle Software, die den Code einer höheren Programmiersprache übersetzt in die Maschinensprache oder eine Zwischensprachen 15 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Compiler vs. Übersetzer Compiler Compiler transformieren die Programme in einer höheren Sprache in maschinennahe Programme. Compiler übersetzen die Programme nicht vollständig Die Programme wird später ausgeführt. Interpreter Interpreter werden benutzt, wenn die Programme Anweisung für Anweisung übersetzt werden. Die Programme werden unmittelbar ausgeführt. 16 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Compiler vs. Übersetzer Traditionelle höhere Programmiersprachen benötigen für jeden Prozessortyp einen Compiler. Der Quellcode wird in das Zielprogramm übersetzt. è Das Programm muss für jeden Prozessortyp übersetzt werden. 17 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Compiler vs. Übersetzer 18 Java hingegen ist plattformunabhängig. è Nur ein Compiler wird für alle Plattformen benötigt. Compiler übersetzt den Quellcode in Java-Bytecode. Java-Bytecode ist unabhängig von einem bestimmten Prozessor. Java-Bytecode kann nicht unmittelbar ausgeführt werden. è Java-Bytecode ist portabel. è Java-Bytecode wird für einen „virtuellen Prozessor“ gefertigt. Der virtuelle Prozessor wird die virtuelle Maschine (VM) genannt. Java-Interpreter analysiert den Java-Bytecode und führt ihn aus. 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Compiler vs. Übersetzer Java-Quellcode Vector2D.java Java-Compiler Java-Bytecode javac Vector2D.class java 19 Java VM für Windows Java VM für Linux Java VM für MacOS Ausführbares Windows-Programm Ausführbares LinuxProgramm Ausführbares MacOS-Programm 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Just In Time Compilation Ein leichtgewichtiger Compiler Findet während der Ausführung des Codes statt Ziel: Optimierung des Codes zum Verbessern der Performance è Optimierung des häufig auszuführenden Codes, wie z.B. Schleifen Beispiele für die Code-Optimierung: Entfernen von redundanten Aufrufen (z.B. durch Ersetzen mit einer lokalen Variable) Copy Propagation (Beispiel: Ersetzen von z=x+y und y=f durch z=x+f) Entfernen vom toten Code (Code, der nie aufgerufen wird oder dessen Ergebnis nie benutzt wird) 20 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello World!"); } } ...$javac SimpleProgram.java ...$java SimpleProgram Hello World! ...$ Wie ändere ich die Ausgabe? 21 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello World!"); } } ...$javac SimpleProgram.java ...$java SimpleProgram Hello World! ...$ Wie ändere ich die Ausgabe? 22 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello!"); } } ...$javac SimpleProgram.java ...$java SimpleProgram Hello World! ...$ Wie ändere ich die Ausgabe? 23 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello!"); } } ...$javac SimpleProgram.java ...$java SimpleProgram Hello World! ...$ Wie ändere ich die Ausgabe? Muss ich das Programm wieder kompilieren? 24 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello!"); } } ...$javac SimpleProgram.java ...$java SimpleProgram Hello World! ...$ Wie ändere ich die Ausgabe? Muss ich das Programm wieder kompilieren? Ja 25 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello!"); } } ...$javac SimpleProgram.java ...$java SimpleProgram Hello World! ...$javac SimpleProgram.java ...$java SimpleProgram Hello! Wie ändere ich die Ausgabe? Muss ich das Programm wieder kompilieren? Ja 26 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello"); System.out.println("World!"); } } ...$javac SimpleProgram.java ...$java SimpleProgram Hello World! ...$javac SimpleProgram.java ...$java SimpleProgram Hello! Welche Ausgabe erwarte ich? 27 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello"); System.out.println("World!"); } } ...$ Welche Ausgabe erwarte ich? 28 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello"); System.out.println("World!"); } } ...$javac SimpleProgram.java Welche Ausgabe erwarte ich? 29 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello"); System.out.println("World!"); } } ...$javac SimpleProgram.java ...$java SimpleProgram Hello World! Welche Ausgabe erwarte ich? 30 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("1+1"); } } ...$ Welche Ausgabe erwarte ich? 31 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("1+1"); } } ...$javac SimpleProgram.java Welche Ausgabe erwarte ich? 32 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("1+1"); } } ...$javac SimpleProgram.java ...$java SimpleProgram 1+1 Welche Ausgabe erwarte ich? 33 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm Ein Beispiel für eine Klasse Klassenname public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello"); System.out.println("World!"); } } Methodenname main-Methode ...$javac SimpleProgram.java ...$java SimpleProgram Hello World! ...$ Woraus besteht das einfache Beispiel? 34 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { int firstNumber = 1; int secondNumber = 2; System.out.println(firstNumber+secondNumber); } } ...$ Welche Ausgabe erwarte ich? 35 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { int firstNumber = 1; int secondNumber = 2; System.out.println(firstNumber+secondNumber); } } ...$javac SimpleProgram.java ...$java SimpleProgram 3 Welche Ausgabe erwarte ich? 36 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { int firstNumber = 1; int secondNumber = 2; System.out.println(firstNumber+secondNumber); } } ...$javac SimpleProgram.java ...$java SimpleProgram 3 Woraus besteht das modifizierte Beispiel? 37 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm Veriablendeklaration public class SimpleProgram { public static void main(String[] args) { int firstNumber = 1; int secondNumber = 2; System.out.println(firstNumber+secondNumber); } } ...$javac SimpleProgram.java ...$java SimpleProgram 3 Woraus besteht das modifizierte Beispiel? 38 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm Veriablendeklaration Wert public class SimpleProgram { public static void main(String[] args) { int firstNumber = 1; int secondNumber = 2; System.out.println(firstNumber+secondNumber); } } ...$javac SimpleProgram.java ...$java SimpleProgram 3 Woraus besteht das modifizierte Beispiel? 39 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm Variablenname Veriablendeklaration Wert public class SimpleProgram { public static void main(String[] args) { int firstNumber = 1; int secondNumber = 2; System.out.println(firstNumber+secondNumber); } } ...$javac SimpleProgram.java ...$java SimpleProgram 3 Woraus besteht das modifizierte Beispiel? 40 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm Variablentyp Variablenname Veriablendeklaration Wert public class SimpleProgram { public static void main(String[] args) { int firstNumber = 1; int secondNumber = 2; System.out.println(firstNumber+secondNumber); } } ...$javac SimpleProgram.java ...$java SimpleProgram 3 Woraus besteht das modifizierte Beispiel? 41 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm Variablentyp Variablenname Veriablendeklaration Wert public class SimpleProgram { public static void main(String[] args) { int firstNumber = 1; int secondNumber = 2; System.out.println(firstNumber+secondNumber); } } Initialisierung ...$javac SimpleProgram.java ...$java SimpleProgram 3 Woraus besteht das modifizierte Beispiel? 42 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello"); System.out.println("World!"); } } ...$javac SimpleProgram.java ...$java SimpleProgram Hello World! ...$ In welcher Reihenfolge wird mein Programm ausgeführt? 43 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello"); System.out.println("World!"); } } ...$javac SimpleProgram.java ...$java SimpleProgram Hello World! ...$ In welcher Reihenfolge wird mein Programm ausgeführt? Die Ausführung beginnt mit der main-Methode 44 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello"); System.out.println("World!"); } } ...$javac SimpleProgram.java ...$java SimpleProgram Hello World! ...$ In welcher Reihenfolge wird mein Programm ausgeführt? Die Ausführung beginnt mit der main-Methode Die Ausführung beginnt mit der ersten Zeile der main-Methode 45 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello"); System.out.println("World!"); } } ...$javac SimpleProgram.java ...$java SimpleProgram Hello World! ...$ In welcher Reihenfolge wird mein Programm ausgeführt? Die Ausführung beginnt mit der main-Methode Die Ausführung beginnt mit der ersten Zeile der main-Methode Die Ausführung endet mit der letzten Zeile der main-Methode 46 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello"); } static void printWorld(){ System.out.println("World!"); } } ...$ Welche Ausgabe erwarten wir? 47 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello"); } static void printWorld(){ System.out.println("World!"); } } ...$ Welche Ausgabe erwarten wir? Wird die Methode printWorld ausgeführt? 48 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello"); } static void printWorld(){ System.out.println("World!"); } } ...$ Welche Ausgabe erwarten wir? Wird die Methode printWorld ausgeführt? Nein 49 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello"); } static void printWorld(){ System.out.println("World!"); } } ...$javac SimpleProgram.java ...$java SimpleProgram Hello Welche Ausgabe erwarten wir? Wird die Methode printWorld ausgeführt? Nein 50 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello"); } static void printWorld(){ System.out.println("World!"); } } ...$ Wie kann ich die Methode printWorld ausführen? 51 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello"); printWorld(); } static void printWorld(){ System.out.println("World!"); } } ...$ Wie kann ich die Methode printWorld ausführen? 52 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Einfaches Programm public class SimpleProgram { public static void main(String[] args) { System.out.println("Hello"); printWorld(); } static void printWorld(){ System.out.println("World!"); } } ...$javac SimpleProgram.java ...$java SimpleProgram Hello World Wie kann ich die Methode printWorld ausführen? 53 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Billard-Spiel Programmieren ist nicht nur die Definition von Befehlen und deren Ausführungsreihenfolge. è Datenmodellierung y (vx,vy) (px,py) x 54 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Billard-Spiel Angenommen, wir wollen ein Billard-Spiel programmieren Erster Schritt: Simulation der Bewegung der Kugeln y Tisch (vx,vy) Größe Kugeln: jede Kugel hat (zu jedem Zeitpunkt): Eine Position auf dem Tisch Eine Bewegungsrichtung und Geschwindigkeit Evtl. Effet (Drall, Spin) Kugeln können aneinanderstoßen und ändern dann die Bewegungsrichtung 55 21.10.2015 Vorlesung Programmieren: Objekte und Klassen (px,py) x Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Objektorientierte Programmierung (OOP) Grundidee der Objektorientierten Programmierung: Jedes Objekt der Realität hat ein virtuelles Gegenstück Objekte kooperieren durch Datenaustausch Im Zentrum: Modellierungsfrage y (vx,vy) (px,py) „Wer macht was?“ (Im Gegensatz zu: „Wie wird’s gemacht?“) Gebräuchliche Benennungen für Datenaustausch: „Objekt A sendet Nachricht an Objekt B“ „Objekt A ruft eine Methode von Objekt B auf“ 56 21.10.2015 Vorlesung Programmieren: Objekte und Klassen x Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) OOP am Beispiel „Billard-Spiel“ Reale Welt „Programmwelt“ Objektname Objekte Attribute Table t length Modellierung width name getLength() getWidth() getName() addBall(...) 254 cm 127 cm „Toronto Deluxe“ Methoden Ball blueBall Ball redBall Ball whiteBall diameter 57,2 mm diameter 57,2 mm weightdiameter 170 g 57,2 mm weight 170 g 170 gRED color weight color RED xPos color 30 cmRED xPos 30 cm yPos xPos 50 cm30 cm yPos 50 cm yPos 50 cm ⋮ ⋮ ⋮ simulationStep(...) simulationStep(...) simulationStep(...) 57 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Klassen: Der „Bauplan“ von Objekten Objekt Ball redBall diameter weight color xPos yPos ⋮ 57,2 mm 170 g RED 30 cm 50 cm simulationStep(...) Klasse (Java) class Ball { // Attribute float diameter; // in Int weight; // in ... float xPos; // in float yPos; // in ... // Methoden void simulationStep() { } mm gram cm cm } Aus einer Klasse können beliebig viele Objekte („Objekt-Instanzen“, „Instanzen der Klasse“) dieses „Bauplans“ erzeugt werden. 58 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Definition: Objekte und Klassen Ein Objekt wird durch drei Aspekte charakterisiert: Identität Objekteigenschaften können sich ändern, die Identität des Objekts bleibt aber gleich Durch Objektnamen sichergestellt Zustand Menge der Eigenschaften des Objekts zu einem Zeitpunkt Durch Attribute realisiert Verhalten Ausführen von Aktionen, die den Zustand ändern können Durch Methoden realisiert Eine Klasse ist ein „Bauplan“ für gleichartige Objekte und legt fest welche Attribute die Objekt-Instanzen der Klasse haben welche Methoden die Objekt-Instanzen der Klasse haben Grady Booch, Object Oriented Analysis and Design http://www.nicolasdanino.com/tongji/OOAD_Booch_3rd_Edition.pdf 59 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Ursprung Objektorientierter Programmierung 1960er Jahre: Ole-Johan Dahl (1931-2002) und Kristen Nygaard (1926-2002) entwickeln die Programmiersprache Simula genauer: erst Simula I, danach Simula 67 Simula steht für SIMulation LAnguage, eine Programmiersprache für Simulationen Erste Programmiersprache, die zwischen Klassen und Objekten unterscheidet Viele weitere Konzepte aus Simula finden sich in heutigen Objektorientierten Sprachen wieder 60 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Klassen in Java class Ball { // Attribute float diameter; int weight; ... float xPosition; float yPosition; float xVelocity; Float yVelocity; Kommentare // in mm // in gram // // // // in in in in cm cm m/s m/s // Methoden ... } Zwei Arten von Kommentaren in Java: // Zeilenkommentar /* längerer Kommentar über mehrere Zeilen */ Schema: class Name { Klassenrumpf } „Klassen-Deklaration“ 61 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Ist die Klassendefinition gut so? class Ball { // Attribute float diameter; int weight; ... float xPosition; float yPosition; float xVelocity; Float yVelocity; // in mm // in gram // // // // in in in in cm cm m/s m/s // Methoden ... Wir haben zweimal fast dasselbe Konstrukt. Lässt sich das vereinfachen? Ja! } Abstraktion der x/y-Paare in eine neue Klasse Vector2D. 62 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Abstraktion: Klasse für Koordinatenpaare class Ball { // Attribute float diameter; int weight; ... float Vector2D xPosition; position; float Vector2D yPosition; velocity; float xVelocity; Float // Methoden yVelocity; ... } // Methoden ... } // in mm // in gram // // // // in in in in cm cm m/s m/s m/s class Vector2D { // Attribute: x/y-Koordinaten float x; float y; // Methoden ... } Was haben wir gewonnen? Kürzere, übersichtlichere Klassendeklaration Strukturierung, „Kapselung“ von Daten 63 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Wie erzeugt man Objekte? Objekte werden mit dem new-Operator erzeugt Vector2D position = new Vector2D(); Vector2d velocity = new Vector2D(); Ball ball = new Ball(); 64 21.10.2015 Vorlesung Programmieren: Objekte und Klassen // erzeugt Vektor „position“ // erzeugt Vektor „velocity“ // erzeugt Billardkugel Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Jetzt sind Sie gefragt! Wir modellieren die Mensa „Bauplan“ für gleichartige Objekte Welche Klassen benötigen wir? Welche Attribute? Welche Methoden? Eigenschaften eines Objekts (Zustand) Aktionen, welche den Objekt-Zustand ändern können (Verhalten) 65 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Jetzt sind Sie gefragt! Schreiben Sie eine main-Methode für die Klasse Vector2D, die die Koordinaten eines Vektors ausgibt. class Vector2D { // attributes: // x/y-coordinates float x; float y; } 66 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD) Zusammenfassung Objekte modellieren Gegenstände der realen Welt Klassen sind „Baupläne“ für Objekte Klassen in Java werden deklariert mit class Name { Klassenrumpf } Neue Objekte einer Klasse werden mittels new erzeugt Klassen erlauben eine Erweiterung der eingebauten Java-Datentypen 67 21.10.2015 Vorlesung Programmieren: Objekte und Klassen Lehrstuhl für Software-Design und –Qualität (SDQ) Institut für Programmstrukturen und Datenorganisation (IPD)