Informatik I – WS05/06 – Folien von Tobias Dezulian Kapitel 4 - 8.11.2005 • Schichtenarchitektur: Kompiler und Interpreter • Java (Source & Byte Code), " Hello World " Programm • Datenstrukturen in Java: Primitivtypen, Arrays, Objekte • Klassen, Objekte und Referenzen • Lehrbeispiel: Sortieralgorithmus " Bubble Sort" ¾ Sortieren von Primitivtypen ¾ [Sortieren von Strings] ¾ [Sortieren von Objekten anhand eines Feldes] Informatik I – WS05/06 – Folien von Tobias Dezulian Schichtenarchitektur am Beispiel: C, BASIC, Java Graphik: A. Weber und W. Küchlin Informatik I – WS05/06 – Folien von Tobias Dezulian Schichtenarchitektur am Beispiel: C, BASIC, Java Java Virtuelle Maschine (JVM) Kompilierung Java Virtuelle Maschine (JVM) Graphik: A. Weber und W. Küchlin Informatik I – WS05/06 – Folien von Tobias Dezulian Schichtenarchitektur am Beispiel: C C Source Code Kompilierung: [+]: Code läuft effizient [-]: Abhängig von BS und CPU Kompilierung Assembler Code Ausführung Betriebssystem CPU Informatik I – WS05/06 – Folien von Tobias Dezulian Schichtenarchitektur am Beispiel: BASIC BASIC Code Interpretation: [+]: Unabhängig von BS und CPU [-]: Code läuft etwas langsamer Interpretation BASIC Interpreter Betriebssystem CPU Schichtenarchitektur am Beispiel: Java Informatik I – WS05/06 – Folien von Tobias Dezulian Java Source Code Kompilierung Java Byte Code Interpretation Kompilierung + Interpretation: [+]: Unabhängig von BS und CPU [+]: Code läuft effizient [-]: Komplexeres Verfahren Java Virtuelle Maschine (JVM) Betriebssystem CPU Java Source und Byte Code Informatik I – WS05/06 – Folien von Tobias Dezulian Java Source Code Kompilierung [Kompiler: javac] Java Byte Code public class Calculator { public static void main(String[] args){ int i = 17 + 20 - 10; System.out.println(i); return; } } bipush 17 istore_1 iload_1 bipush 20 iadd istore_1 iload_1 bipush 10 isub istore_1 getstatic #2; //java/lang/System.out:Ljava/io/PrintStream; iload_1 invokevirtual #3; //Method java/io/PrintStream.println:(I)V return Informatik I – WS05/06 – Folien von Tobias Dezulian Java Live Demo Java Source Code Kompilierung [Kompiler: „javac“] Java Byte Code Interpretation [JVM: „java“] Java Virtuelle Maschine Empfohlene Literatur: •http://java.sun.com/docs/books/tutorial/getStarted/cupojava/index.html •http://java.sun.com/docs/books/tutorial/index.html Informatik I – WS05/06 – Folien von Tobias Dezulian „Hello World“ Programm in Java (I) // Datei: HelloWorld.java public class HelloWorld { public static void main( String[] args ) { System.out.println("Hello World!"); } } • das gesamte Programm befindet sich innerhalb der Klassendefinition public class HelloWorld {} • Java-Programm = Menge von Klassendefinitionen • die Klassendefinition HelloWorld muss in einer gleichnamigen Datei „HelloWorld.java“ abgespeichert sein • main()-Methode ist der Einstiegspunkt des Programms • Bildschirmausgabe mit System.out.println() Informatik I – WS05/06 – Folien von Tobias Dezulian „Hello World“ Programm in Java (II) • Übersetzung der Applikation (Compiler): % javac HelloWorld.java • nach fehlerfreier Übersetzung entsteht die Bytecode-Datei: HelloWorld.class • ausführbares Programm = Menge von .class-Dateien • Ausführen der Applikation (Interpreter): % java HelloWorld • Ausgabe von “Hello World!” auf dem Bildschirm Informatik I – WS05/06 – Folien von Tobias Dezulian Variablendeklaration in Java Variablen • sind Positionen im Speicher, die Werte aufnehmen können. Bestehen aus Typ, Bezeichnung und Wert: int i = 12; Typ Bezeichnung Wert • müssen vor der Benutzung deklariert werden: zaehler = 7; //Fehler: Variable „zaehler“ unbekannt! • Deklaration mit gleichzeitiger Anfangswert-Zuweisung erlaubt: boolean muede = false; • Mehrfachdeklarationen in einer Zeile möglich: int i = 0, j = 3, k = 5; • Variablennamen müssen mit einem Buchstaben, einem Unterstreichungsstrich (_) oder einem Dollarzeichen ($) beginnen Variablen in Java Informatik I – WS05/06 – Folien von Tobias Dezulian Bezeichnungen: • Java ist eine „case sensitive“ Programmiersprache, d.h. unterscheidet generell Groß/Kleinbuchstaben : int f = 12; int F = 17; • Stilistischer Tipp: Aussagenkräftige Bezeichnungen wählen!! float tempCelsius = calcCelsius( tempFahrenheit ); • Deklaration mit gleichzeitiger Anfangswert-Zuweisung erlaubt: boolean muede = false; • Mehrfachdeklarationen und Zuweisungen in einer Zeile möglich: int i = 0, j = 3, k = 5; • Variablennamen müssen mit einem Buchstaben, einem Unterstreichungsstrich (_) oder einem Dollarzeichen ($) beginnen Zwei Arten von Datentypen in Java: • Primitivtypen • Klassen/Interfaces Neue (benutzerspezifische) Datentypen können (nur) durch neue Klassendefinitionen erzeugt werden ! Informatik I – WS05/06 – Folien von Tobias Dezulian Datenstrukturen: Primitivtypen Typ Bedeutung Größe boolean true oder false char Unicode-Zeichen 16 Bits byte Ganze Zahl mit Vorzeichen 8 Bits short Ganze Zahl mit Vorzeichen 16 Bits int Ganze Zahl mit Vorzeichen 32 Bits long Ganze Zahl mit Vorzeichen 64 Bits float IEEE 754-Fließkommazahl 32 Bits double IEEE 754-Fließkommazahl 64 Bits 1 Bit Aufgrund der durch die Sprachdefinition festgeschriebenen Größe und Handhabung der Primitivtypen gibt es keine Plattformabhängigkeiten (wie in vielen anderen Sprachen, z.B. C) !!! Informatik I – WS05/06 – Folien von Tobias Dezulian Datenstrukturen: Klassen Eine Klasse ist ein Datentyp, der wiederum Attribute aus Primitivtypen und Referenzen auf Objekten anderer Klassen beinhalten kann. Diese Attribute heißen in Java „Felder“. class String{ char[] zeichenkette; class Auto{ int anzahlTueren; } float motorTemp; String kennzeichen; class Person{ Person fahrer; String name; } int alter; Felder } Eine Klasse ist Schablone für Objekte Huhn Informatik I – WS05/06 – Folien von Tobias Dezulian Klasse String name; float groesse; Image bildchen; Berta Kunigunde Objekte Elfriede Graphik: http://www.ias.uni-stuttgart.de/ Elsa Klassen und Objekte Informatik I – WS05/06 – Folien von Tobias Dezulian • Jedes Objekt wird als Instanz seiner Klasse bezeichnet. • Erzeugung (Instanziierung) eines Objekts auf Basis seiner Klasse erfolgt mittels des new Operators. • Der Zugriff auf die Felder einer Instanz erfolgt mittels des "."-operators. public class ComplexNumber{ float real; float complex; } ComplexNumber cn = new ComplexNumber(); cn.real = 17.891; cn.complex = 13.112; float someFloat = cn.complex; System.out.print(someFloat); 13.112 Primitivtypen, Objekte, Referenzen Informatik I – WS05/06 – Folien von Tobias Dezulian Primitivtypen und Objekte unterscheiden sich sehr grundlegend: • Eine Variable eines Primitivtyps enthält einen Wert. • Eine Variablen eines nicht-Primitivtyps (Referenz) verweist auf ein Objekt (Spezialfall: null) und enthält als Wert eine Referenz auf dieses Objekt. int myInt = 99; int myInt2 = myInt; ComplexNumber cn = new ComplexNumber(); real: 17.891 cn.real = 17.891; complex: 13.1 cn.complex = 13.1; ComplexNumber cn2 = cn; t r e zi ert n re nzi e f myInt == 99 re fere 99 myInt2 == re cn == ref ref cn2 == Informatik I – WS05/06 – Folien von Tobias Dezulian Referenzen ComplexNumber cn = new ComplexNumber(); cn.real = 17.891; cn.complex = 13.1; ComplexNumber cn2 = cn; ComplexNumber cn3 = new ComplexNumber(); cn3.real = 17.891; cn3.complex = 13.1; real: 17.891 cn == cn2 == cn3 == cn cn == cn2 == cn3 ref ref ref true false referenziert referenziert re f e ren complex: 13.1 zier t real: 17.891 complex: 13.1 Informatik I – WS05/06 – Folien von Tobias Dezulian Datenstrukturen: Klassen Die Java Laufzeitumgebung (JRE) stellt automatisch schon mehr als 3000 Klassen zur Verfügung, auf die jedes Java Programm zurückgreifen kann. Zusätzlich lassen sich in Form anderer Bibliotheken beliebig viele andere Klassen einbinden. Und (fast) jedes Java-Programm deklariert eine Vielzahl eigener Klassen. Sonderklassen, welche durch die Java Sprachdefinition einen eigenen syntaktischen Umgang mitbringen: • Zeichenkette (String) • Reihung (Array) • Aufzählung (Enumeration) [wird später behandelt] Informatik I – WS05/06 – Folien von Tobias Dezulian Syntaktisch ausgezeichnete Klassen: Strings Da Strings sehr häufig benutzt werden, gibt es zusätzlich zur Standardsyntax im Umgang mit Klassen noch folgende Möglichkeiten: • Konkatenation mit + operator • Automatische Konvertierung von Primitivtypen und Objekten String textEins = "hel"+"lo"; char ausrufezeichen = '!'; String textZwei = "world"; int number42 = 42; String textOut = textEins + "_" + textZwei + ausrufezeichen + " the number is:"+number42; System.out.println(textOut); hello_world! the number is:42 Informatik I – WS05/06 – Folien von Tobias Dezulian Syntaktisch ausgezeichnete Klassen: Arrays Ein Array ist eine "Container"-Klasse, welche eine Menge von Primitivtypen (gleichen Typs) oder Objekte (gleichen Typs) zusammenfasst und leicht verwaltbar macht: int[] lottozahlen = { 27, 15, 2, 40, 4, 13, 37 }; referen z i er t 27 15 2 40 4 13 37 Image uluru, paris, fiji; Ein Array ist lediglich Container!!! .. //initialisierung Image[] urlaubsbilder = { uluru, paris, fiji}; referen z i er t uluru paris Zugriff: lottozahlen[0]=10; Image favorit=urlaubsbilder[2]; referenziert fiji Syntaktisch ausgezeichnete Klassen: Arrays Ein Array kann mit new() leer erzeugt werden: Informatik I – WS05/06 – Folien von Tobias Dezulian int[] lottozahlen = new int[3](); Ein Array kann höhere Dimensionalität besitzen: Kochplatte[][] kochplatten = new Kochplatte[2][2](); kochplatten[1][1] kochplatten[0][1] kochplatten[0][0] kochplatten[1][0] Leitbeispiel: Sortier-Algorithmus "Bubble Sort" Informatik I – WS05/06 – Folien von Tobias Dezulian Eingabe: Eine Reihung (Array) von Elementen (z.B. Zahlen) und eine Ordnung. Ausgabe: Eine Reihung derselben Elemente – wobei ihre Reihenfolge jetzt dieser Ordnung entspricht. Ablauf: Vergleiche schrittweise benachbarte Elemente und vertausche sie ggfs in die durch die Ordnung vorgegebene Reihenfolge. Höre auf, sobald alle Elemente paarweise geordnet sind. (Zahlen-) Wert Position innerhalb des Arrays Graphik von: http://wwwtcs.inf.tu-dresden.de/~stoschek/aud/bubble/bubble.html Informatik I – WS05/06 – Folien von Tobias Dezulian Sortier-Algorithmus: Bubble Sort Eingabe: Eine Reihung (Array) von Elementen (z.B. Zahlen) und eine Ordnung. Ausgabe: Eine Reihung derselben Elemente – Vertauschen !!! ihre Reihenfolge jetzt wobei dieser Ordnung entspricht. Ablauf: Vergleiche schrittweise benachbarte Elemente und vertausche sie ggfs in die durch die Ordnung vorgegebene Reihenfolge. Höre auf, sobald alle Elemente paarweise geordnet sind. (Zahlen-) Wert Position innerhalb des Arrays Graphik von: http://wwwtcs.inf.tu-dresden.de/~stoschek/aud/bubble/bubble.html Informatik I – WS05/06 – Folien von Tobias Dezulian Sortier-Algorithmus: Bubble Sort Eingabe: Eine Reihung (Array) von Elementen (z.B. Zahlen) und eine Ordnung. Ausgabe: Eine Reihung derselben Elemente – Belassenwobei !!! ihre Reihenfolge jetzt dieser Ordnung entspricht. Ablauf: Vergleiche schrittweise benachbarte Elemente und vertausche sie ggfs in die durch die Ordnung vorgegebene Reihenfolge. Höre auf, sobald alle Elemente paarweise geordnet sind. (Zahlen-) Wert Position innerhalb des Arrays Graphik von: http://wwwtcs.inf.tu-dresden.de/~stoschek/aud/bubble/bubble.html Informatik I – WS05/06 – Folien von Tobias Dezulian Bubble Sort von Integern in Java int[] r; //Ein- und Ausgabe-Reihung int i; //index int tmp; //temporaerer Speicher boolean done; //merkt sich, ob Alg fertig VariablenDeklaration r = new int[]{ 17, 2, 20, 5, 6}; Eingabe //Sortieren do{ done = true; for(i=0; i<r.length-1; i++){ if( r[i] > r[i+1]){ tmp = r[i]; r[i]=r[i+1]; r[i+1] = tmp; done = false; } } }while(!done); //Ausgabe for(i=0; i<r.length; i++){ System.out.print(r[i]+" "); } Algorithmus Ausgabe