IT I: Heute • Nachbetrachtung Wissensüberprüfung • Java Klassen verwenden • Wrapper Klassen • Speicher und Adressen • Unit Test • Projekt Scheduling? 25.10.2016 IT I - VO 4 1 Feedback Feedback zu folgenden Themen? • Kaffeemaschine • Skript • Vertretung • Tutorium 25.10.2016 IT I - VO 4 2 Nachbetrachtung Wissensüberprüfung • Wieviele Elemente in liste werden betrachtet? for(Blabla b:liste){ if(b.hatEigenschaft()) return true; else return false; } 25.10.2016 IT I - VO 4 3 Nachbetrachtung Wissensüberprüfung • Wieviele Elemente in liste werden betrachtet? for(Blabla b:liste){ if(b.hatEigenschaft()) { return true; } return false; } 25.10.2016 IT I - VO 4 4 Nachbetrachtung Wissensüberprüfung • Konstruktoren: erschaffen Objekt, indem Attribute gesetzt werden • Dazu gibt's mehrere Möglichkeiten: - Attribut auf Parameterwert setzen - Attribut auf fixen Wert setzen 25.10.2016 IT I - VO 4 5 Nachbetrachtung Wissensüberprüfung • Konstruktoren: erschaffen Objekt, indem Attribute gesetzt werden • Typischwerweise: Hat der Konstruktor Parameter, so werden entsprechende Attribute auf Parameter gesetzt: this.blablabla = blablabla; 25.10.2016 IT I - VO 4 6 Nachbetrachtung Wissensüberprüfung • Konstruktor von ArrayList: Aufruf von new ArrayList<Typ>() erschafft leere Liste: {} (nicht null!) • Aufruf des Konstruktors ist nötig, bevor mit Methode add Elemente hinzugefügt werden können. 25.10.2016 IT I - VO 4 7 Nachbetrachtung Wissensüberprüfung • Konstruktor mit ArrayList-Parameter public Blabla(ArrayList<Typ> liste) { this.liste = liste; } • Das funktioniert nur, wenn es entsprechendes Attribut liste gibt! 25.10.2016 IT I - VO 4 8 Nachbetrachtung Wissensüberprüfung • Was passiert hier? public Blabla(ArrayList<Typ> liste) { this.liste = newArrayList<Typ>(); this.liste = liste; } 25.10.2016 IT I - VO 4 9 Nachbetrachtung Wissensüberprüfung • Initialisierung der Liste ist unnötig: public Blabla(ArrayList<Typ> liste) { this.liste = new ArrayList<Typ>(); this.liste = liste; } • Attribut wird ohnehin gesetzt. 25.10.2016 IT I - VO 4 10 Nachbetrachtung Wissensüberprüfung • Was passiert hier? public Blabla(ArrayList<Typ> liste) { liste = new ArrayList<Typ>(); this.liste = liste; } 25.10.2016 IT I - VO 4 11 Nachbetrachtung Wissensüberprüfung • Noch schlechter: public Blabla(ArrayList<Typ> liste) { liste = new ArrayList<Typ>(); this.liste = liste; } • Überschreibt Parameter, bevor Attribut auf Parameterwert gesetzt. 25.10.2016 IT I - VO 4 12 Nachbetrachtung Wissensüberprüfung • Was passiert hier? public Blabla(ArrayList<Typ> liste) { this.liste = new ArrayList<Typ>(); } 25.10.2016 IT I - VO 4 13 Nachbetrachtung Wissensüberprüfung • Noch schlechter: public Blabla(ArrayList<Typ> liste) { this.liste = new ArrayList<Typ>(); } • Initialisiert Attribut, Parameter nicht verwendet. 25.10.2016 IT I - VO 4 14 Nachbetrachtung Wissensüberprüfung • Was passiert hier? public Blabla(ArrayList<Typ> liste) { ArrayList<Typ> liste = new ArrayList<Typ>(); } 25.10.2016 IT I - VO 4 15 Nachbetrachtung Wissensüberprüfung • Noch schlechter: public Blabla(ArrayList<Typ> liste) { ArrayList<Typ> liste = new ArrayList<Typ>(); } • Kompiliert nicht, weil Variable liste bereits existiert. 25.10.2016 IT I - VO 4 16 Aufruf von Objektmethoden • Gegeben Klasse Wusch mit Methode void flitz(String derString). • Richtiger Aufruf für Wusch-Objekt derWusch: derWusch.flitz(einString), wobei einString ein beliebiger String ist. 25.10.2016 IT I - VO 4 17 Aufruf von Objektmethoden • Überprüfen Sie bei jedem Methodenaufruf objekt.methode(parameter) - Wurde objekt initialisiert? - Gibt's die Methode in der Klasse von objekt? - Stimmen die Parameter (Anzahl und Typ)? - Wenn die Methode einen Rückgabewert hat: Wird der Rückgabewert einer Variable vom richtigen Typ zugewiesen bzw. passend verwendet? 25.10.2016 IT I - VO 4 18 Aufruf von Objektmethoden • Beispiel: Krass trara = new Krass(true); if(trara.bumbum(7,”autsch”)) String x = trara.peng(); • Gibt's Konstruktor in Krass, der boolean als Parameter nimmt? • Wurde trara initialisiert? • Gibt's Methode bumbum() in Krass, die int und String als Parameter nimmt? • Hat Methode bumbum() Rückgabewert boolean? • Gibt's parameterlose Methode peng() in Krass mit Rückgabewert String? 25.10.2016 IT I - VO 4 19 Aufruf von Objektmethoden • Weiteres Beispiel: ArrayList<Blub> liste = getList(); int x = liste.get(i).drown(-5).haha(); • Gibt's Methode getList() in aktueller Klasse, die ArrayList von Blub-Objekten zurückgibt? • Ist i ein int? Wurde i initialisiert? • Gibt's Methode drown() in Klasse Blub, die einen numerischen Wert (int, double oder float) als Parameter nimmt? • Gibt's in der Klasse, die die Methode drown() als Rückgabewert hat eine parameterlose Methode haha(), die einen int zurückgibt? 25.10.2016 IT I - VO 4 20 Klammern sparen • Geschwungene Klammern können weggelassen werden, wenn sie nur ein Statement enthalten: if(i==j) a++; else a--; oder for(int i=0; i<10; i++) for(int j=10; j>0; j--) System.out.println(i+j); 25.10.2016 IT I - VO 4 21 Vordefinierte Java-Klassen • Klassen-Bibliotheken – Sammlungen von nützlichen Klassen, die nicht selbst programmiert werden müssen. – In Java sind diese in packages organisiert. – Für die Java-Programmierung muss man einige wichtige dieser Klassen kennen. – Man muss die Klassen-Dokumentation (Class API) lesen können, um sich über weiter Klassen informieren zu können. – API: Applications Programmers Interface 25.10.2016 IT I - VO 4 22 Lesen der Klassen-Dokumentation • Die Dokumentation beschreibt in der Regel nur die Verwendung der Klassen, nicht wie die Klassen implementiert sind. • Die Dokumentation liegt in HTML-Format vor. • Eine Klassen-Dokumentation enthält: – Name der Klasse – Allgemeine Beschreibung der Klasse – Liste der Konstruktoren und Methoden mit Parametern und Rückgabewerten – Eine Beschreibung für jeden Konstruktor und jede Methode: • Was bewirkt der Konstruktor oder die Methode? 25.10.2016 IT I - VO 4 23 Information Hiding • Die Klassen-Dokumentation enthält keine Implementierungsdetails: – Attribute und Methoden, die private sind. – Die Implementierung der Methoden. 25.10.2016 IT I - VO 4 24 Verwendung von Bibliotheksklassen • Klassen aus einem Java package müssen importiert werden, und können dann wie eine Klasse des eigenen Projektes/Paketes verwendet werden: import <Paketname>.<Klassenname>; • Z.B.: import java.util.Random; Dabei ist java.util das Paket, das die Klasse Random enthält. (Diese Klasse ist für aktuelle Übungsaufgaben nützlich!) 25.10.2016 IT I - VO 4 25 Die Klasse Random • Die Klasse Random stellt verschiedene Methoden zur Erzeugung von Zufallszahlen zur Verfügung. • Mit Konstruktor new Random() wird ein Zufallszahlengenerator erstellt. • Mit Methoden double nextDouble() int nextInt() ... werden dann Zufallszahlen erzeugt. 25.10.2016 IT I - VO 4 26 Strings in Java • Strings sind Objekte der Klasse String im package java.lang. • Die Klassen von java.lang sind die einzigen Klassen, die nicht explizit importiert werden müssen. • Vergleich von Strings mit Methode equals • Besondere Syntax für Strings: – Automatisches Erzeugen eines String-Objektes durch Angabe eine Zeichenkette, z.B. "abc". – Zusammenfügen von Strings durch den Operator +, z.B. string1 + "abc". – Datentypen werden automatisch in Strings umgewandelt, wenn das nötig ist, z.B. "" + 17. 25.10.2016 IT I - VO 4 27 Statische Methoden • Statische Methoden werden mit dem Wort static gekennzeichnet, z.B. public static double sqrt(double a) • Der Aufruf einer statischen Methode ist an kein Objekt gebunden und erfolgt über den Klassennamen, z.B. Math.sqrt(x*x+y*y); • Da eine statische Methode nicht an ein Objekt gebunden ist, kann eine solche Methode auch nicht unmittelbar auf Objekt-Attribute zugreifen. 25.10.2016 IT I - VO 4 28 Die Klasse Math • Die Klasse Math in java.lang stellt ausschließlich statische Methoden zur Verfügung, die mathematische Funktionen berechnen. 25.10.2016 IT I - VO 4 29 Statische Attribute Klassenattribute • Auch Attribute können statisch (static) sein. • Solche Attribute sind nicht einem Objekt sondern der Klasse zugeordnet. • Statische Attribute können auch public oder private sein. • Auf statische Attribute wird über den Klassennamen zugegriffen, z.B. System.out. • Für die eigene Programmierung haben statische Attribute nur als Konstanten eine wichtige Bedeutung. 25.10.2016 IT I - VO 4 30 System.out • In der Klasse System ist out ein statisches Attribut vom Datentyp PrintStream (aus java.util), das public ist. public static PrintStream out; • System ist eine Klasse in java.lang. • Mit System.out stehen über Objektmethoden der Klasse PrintStream einfache Ausgabemöglichkeiten zur Verfügung. 25.10.2016 IT I - VO 4 31 Konstanten (1) • Konstanten werden verwendet, um Werten einen Namen zu geben. • Dadurch werden Programme leichter lesbar und leichter veränderbar. • Die Verwendung von Konstanten ist sehr empfehlenswert! • Beispiel: Konstante für die Kapazität des LKW. • Konstanten sind Attribute, die mit der Bezeichnung final versehen werden. • Die Bezeichnung final bedeutet, dass der Wert des Attributs nicht verändert werden kann, also konstant ist. • Weiters sind Konstanten meist statisch, da sich ihr Wert nicht auf ein einzelnes Objekt bezieht. 25.10.2016 IT I - VO 4 32 Konstanten (2) • Beispiel: private static final int LKW_KAPAZITAET = 100; • Eine Konstante hat immer einen Datentyp und kann auch public oder private sein. • Java-Konvention: – Konstantennamen werden mit Blockbuchstaben geschrieben, wobei Wort zur besseren Lesbarkeit durch "_" getrennt werden. • In der Klasse Math ist z.B. die Konstante public static final double PI = 3.14… definiert, auf die mit Math.PI zugegriffen werden kann. 25.10.2016 IT I - VO 4 33 Die Objekt-Referenz this • Auf das Objekt, dessen Methode gerade ausgeführt wird, kann mit this zugegriffen werden. • In einem Konstruktor bezeichnet this das Objekt, das gerade erzeugt wird. • Auf Attribute kann eindeutig mit this.attributname zugegriffen werden. 18.10.2016 IT I - VO 3 34 Wrapper classes • Primitive types (int, long, double, …) are not objects. • They must be wrapped into an object to be put into an ArrayList. • Wrapper classes exist for all primitive types: primitive type int long double ... 25.10.2016 IT I - VO 4 wrapper class Integer Long Double ... 35 Autoboxing und Unboxing • Die Konvertierung von primitiven Datentypen und Objekten der Wrapper-Klassen erfolgt in Java (fast immer) automatisch. // Integer n = new Integer(42); Integer n = 42; // int i = n.intValue(); int i = n; 25.10.2016 IT I - VO 4 36 Autoboxing and unboxing private ArrayList<Integer> markList; … public void storeMark(int mark) { markList.add(mark); } autoboxing int firstMark = markList.remove(0); 25.10.2016 IT I - VO 4 unboxing 37 Spezialfall zum Autoboxing & Unboxing private ArrayList<Integer> list; void storeIntegers(){ list.add(42); list.add(43); } void removeAndPrint(){ list.remove(1); for(Integer i : list){ System.out.println(i); } } 25.10.2016 IT I - VO 4 38 Weitere Eigenschaften von Wrapper-Klassen • Wrapper-Klassen stellen weitere Funktionalitäten bereit: – Enthalten Konstanten – static Methoden zur Konvertierung, ... Integer.MAX_VALUE = 231-1 Integer.MIN_VALUE = -231 Double.MAX_VALUE = (2-2-52)·21023 Double.MIN_VALUE = 2-1074 Double.POSITIVE_INFINITY Double.NEGATIVE_INFINITY 25.10.2016 IT I - VO 4 39 Hardware • Eingabegeräte: Tastatur, Maus, … • Ausgabegeräte: Bildschirm, Drucker, … • Prozessor (CPU): Evt. multi-core, … – Führt die durch ein Programm festgelegten Schritte aus. • Hauptspeicher (RAM) – Beinhaltet die Daten (und die Programmschritte) die für die Programmausführung unmittelbar benötigt werden. • Externer Speicher: Festplatte, … – Kann sehr große Datenmengen aufnehmen und permanent speichern. 25.10.2016 IT I - VO 4 40 Software • Anwendungsprogramme – Powerpoint, selbstgeschriebene Programme, … • Betriebssystem (Windows, Linux, MacOS) – Stellt die Basisfunktionen des Computers und seiner Komponenten zur Verfügung: • • • • • Eingabe Ausgabe Zugriffe auf den Haupt- und externen Speicher Programmstart … – In Java stehen diese Basisfunktionen z.B. über Methodenaufrufe zur Verfügung. 25.10.2016 IT I - VO 4 41 Der Prozessor • Gängige Prozessoren verstehen nur relativ einfache Programmschritte: – – – – Hole die Daten X aus dem Hauptspeicher Führe die arithmetische Operation Y aus Schreibe die Daten in den Hauptspeicher Wenn das Ergebnis größer als 0 ist, mache an der Stelle Z des Programms weiter • Ein Programm in einer höheren Programmiersprache (wie z.B. Java) muss in solch einfache Programmschritte umgewandelt werden. 25.10.2016 IT I - VO 4 42 Compiler • Um ein Programm in einer höheren Programmiersprache (z.B. Java) auf einem Computer auszuführen, wird das Programm in eine computergerechte Form umgewandelt. – Komplizierte Anweisungen werden in einfache Instruktionen für den Prozessor umgewandelt. – Speicheradressen für Objekte, Attribute, Variablen, … werden festgelegt. – Die Werte von Datentypen werden in eine Binärdarstellung umgewandelt. • Diese Aufgabe erledigt im wesentlichen der Compiler. 25.10.2016 IT I - VO 4 43 Speicher und Adressen • Um Daten im Speicher (Haupt- oder externer Speicher) abzulegen, muss der genaue Platz im Speicher, die Adresse, angegeben werden. • Ebenso muss beim Lesen von Daten aus dem Speicher die die Adresse angegeben werden. • In einer höheren Programmiersprache wie Java werden Adressen meist nicht explizit angegeben, sondern es werden Variablen- , Parameter- und Attributnamen verwendet. • Diese werden automatisch in die richtigen Speicheradressen übersetzt. 25.10.2016 IT I - VO 4 44 Speicher und Adressen • Von jedem Java-Objekt sind die Datentypen seiner Attribute bekannt. • Daher kann der Speicherplatzbedarf berechnet werden. • Wenn ein neues Objekt angelegt wird, wird dieser Speicherplatz (an irgendeiner Stelle des Hauptspeichers) reserviert. • Der Konstruktor initialisiert dann die Attributwerte des Objektes. 25.10.2016 IT I - VO 4 45 Primitive vs. Object Types - Objekt-Referenzen werden verwendet, wenn ein Attribut (oder lokale Variable) keinen primitiven Datentyp, sondern ein Objekt bezeichnet. - Der Wert des Attributs ist dann nicht das Objekt selbst, sondern eine Referenz auf das Objekt („welches Objekt ist gemeint?“). Das hat insbesondere Auswirkungen beim Zuweisen von Objekten (eigentlich Objekt-Referenzen) und dem Kopieren von Objekten. - Nur Attribute (und Variablen) von einem primitiven Datentyp enthalten den entsprechenden Wert. - Alle Attribute von anderem Datentyp enthalten als Wert nur Objekt-Referenzen. 25.10.2016 IT I - VO 4 46 Primitive types vs. object types (1) SomeObject obj; object type int i; primitive type 32 25.10.2016 IT I - VO 4 47 Primitive types vs. object types (2) ObjectType a; ObjectType b; b = a; int a; int b; 32 32 25.10.2016 IT I - VO 4 48 Arrays 25.10.2016 IT I - VO 4 49 Unit Test • Neben den bisher vorgestellten Möglichkeiten zum Testen von Programmen, gibt es in Java eigene Unit Test Klassen. • Diese erlauben das automatische Anlegen von Objekten. • In BlueJ können die in der Unit Test Klasse angelegten Objekte in die Objektleiste kopiert werden bzw. umgekehrt. • Testfälle können durch Objektinteraktion festgelegt werden. 25.10.2016 IT I - VO 4 50