Von C zu Java INE2, Freitag 14.00 - 15.55 / TE407 M. Thaler, [email protected] Office TG208 http://www.zhaw.ch/~tham 1 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Um was geht es? Software Entwicklung • Programme werden immer komplexer • Probleme mit Komplexität - Überblick behalten - Programme testen und warten - bestehende Software weiterverwenden Was hilft Komplexität zu meistern? • z.B. Objektorentierte Programmierung OOP • verschiedenste Programmiersprachen für OOP - C++, C#, Java, etc. 2 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 ... um was geht es ? Grundidee OOP • Struktur der Software widerspiegelt Realität - klar unterscheidbare Einheiten bzw. Objekte Realität besteht aus Objekten: Auto, Velo, Konto, etc. - Objekte interagieren über Methoden (Funktionen) - Objekte werden mit Klassen definiert Objekt = Daten und Methoden Beispiel: Konto • hat Eigenschaften (Attribute) - konkrete Daten Zustand des Objekts - veränderlich oder konstant • hat Verhalten - über Methoden zur Verfügung gestellt - ändern den Zustand des Objekts 3 Objekt MeinKonto Kontostand: 2000 Kontonummer: 260 einzahlen() abheben() getKontostand() ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 ... um was geht es? 4 Grundpfeiler von OOP • Generalisierung/Spezialisierung - Porsche, Ferrari: Sportwagen gemeinsame Eigenschaften - Sportwagen, SUV: Autos gemeinsame Eigenschaften • Vererbung - gemeinsame Eigenschaften an Subklassen vererbt • Kapselung - Klassen definierte Schnittstelle nach aussen - Implementation, etc. nicht sichtbar • Polymorphismus - Subklassen können identische Methoden aus Oberklassen überschreiben 4 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 ... um was geht es ? Vorteile von OOP • Modularität - Objekte (bzw. Klassen) unabhängige Entwicklung möglich • Information Hiding - Zugriff nur über Methoden versteckt interne Funktionalität • Code-Reuse - Nutzung bestehender Objekte in neuen Anwendungen • Pluggability und einfaches Debugging - Objekte können einfach ausgetauscht und gewartet werden Nachteile • ... 5 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 ... um was geht es ? Für OOP braucht es "neue" Programmiersprachen • Beispiele - Smalltalk, C++, C#, JAVA, Objective-C, Python, etc. • oft Erweiterungen bestehender Sprachen Java • • • • 6 objektorientierte Programmiersprache plattformunabhängig write once, run anywhere einheitliche Graphikbibliothek angelehnt an C/C++ ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Lernziele Sie können • erklären wie Java ausgeführt wird • die grundlegenden Eigenschaften von Java aufzählen und erklären • Referenz-Datentypen erklären und anwenden • einfache Konsolen-Anwendungen implementieren • erklären was Methoden sind und den Unterschied zu C Funktionen aufzeigen • Arrays und Strings in Anwendungen einsetzen 7 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Inhalt Wie wird Java ausgeführt Java und C Namen Einfache Datentypen und Konstanten Aufzählungstypen Referenzdatentypen • Arrays und Strings Typenumwandlung Ausdrücke / Blöcke / Operatoren Methoden Arrays / Strings 8 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Leseempfehlung Grundkurs Java Dietmar Abts, Springer Vieweg elektronisch verfügbar, siehe ZHAW Bibliothek Grundkurs Programmieren in Java 8 Dietmar Ratz ed. alt., Hanser Verlag elektronisch verfügbar, siehe ZHAW Bibliothek Webseite: www.grundkurs-java.de 9 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Wie wird Java ausgeführt? Ausführbare Files bei C Programmierung • Linker erzeugt Maschinencode • Maschinencode für spezifischen Prozessor Java • Compiler erzeugt Byte-Code - wird auf Java Virtual Machine (JVM) abgerabeitet • JVM: simuliert Prozessor - JVM ist prozessor- bzw. plattformabhängig Java Programme laufen auf jeder Plattform Java Programm 10 Compiler JVM MacOs JVM Windows JVM Linux/Unix ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Your first cup of Java after C Hello World #include <stdio.h> int main(void) { $ gcc -o hello hello.c printf("Hello World\n"); $ ls } hello hello.c $ ./hello Hello World public class CupOfJava { public static void main(String[] args) { System.out.println("Hello World"); } $ javac CupOfJava.java } $ ls CupOfJava.class CupOfJava.java $ java CupOfJava Hello World 11 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Java und C Java ist an C angelehnt • Syntax sehr ähnlich • gleiche Kontrollkonstrukte - if, while, do, for, switch, etc. • Kommentare - // und /* ... */ public class CvsJava { public static void main(String[] args) { for (int i = 0; i < 10; i++) { if (i % 3 == 0) System.out.printf("%d durch 3 teilbar\n", i); } } } 12 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Unterschiede Java und C Java hat nicht • • • • • Pointer keine Pointerarithmetik globale Variablen und globale Funktionen Präprozessor keine Macros, etc. "goto" ist aber reserviertes Schlüsselwort "struct", "union", "typedef" Java hat • frei platzierbare Variablen- und Methodendeklaration • eine Garbage Collector - nicht mehr benutzter Speicher wird automatisch freigegeben 13 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Namen / Variablen Namenskonvention Java • Java: case sensitive - "Camel Case" zur Abgrenzung von Worten: meinKonto • Variabeln, Methodennamen mit Kleinbuchstaben beginnen • Klassennamen mit Grossbuchstaben beginnen Variabelnamen • Regel - erstes Zeichen: Buchstabe, _ oder $ - restliche Zeichen: Buchstaben, Zahlen, _ oder $ • beliebige UNICODE Zeichen erlaubt, auch Umlaute • Empfehlung keine Umlaute und Spezialzeichen 14 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Einfache Datentypen Java (primitive data types) • ganze Zahlen - byte (8 Bit), short (16 Bit), int (32 Bit) , long (64 Bit) • Fliesskomma - float, double - float Konstanten benötigen "f": 2.3f - float wenn möglich vermeiden • Logik - boolean - Werte: true, false • Alphanumerische Zeichen - char (Unicode) - Unicode 0x0000 bis 0x007F entsprechen ASCII Code 15 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Konstanten Java hat keinen Präprozessor • wie Konstanten definieren? Schlüsselwort final • Variablen, Methoden, Klassen können als final markiert werden • können nicht mehr "überschrieben" (verändert) werden Beispiel Konstanten final int ANZAHL = 100; 16 // ANZAHL -> Konstante ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Aufzählungstypen Neuere Java Versionen Beispiel Aufzählungstyp (Klasse) • Deklaration public enum Tag { MONTAG, DIENSTAG, MITTWOCH, DONNERSTAG, FREITAG, SAMSTAG, SONNTAG } • Anwendung ... Tag day = MONTAG; ... if (day == MONTAG) { ... 17 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Referenz-Datentypen und Arrays Java hat keine Pointer ... • aber Referenz-Datentypen Referenz-Datentyp • Variable • in C Speicherplatz für Adresse der eigentlichen Daten Speicherplatz für Pointer Beispiel Array in Java int[] a; // a: Speicherplatz fuer Adresse der Arraydaten ... a = new int[32]; // Adresse eines integer Array Objekts der Länge 32 // wird in a abgelegt a[15] = 3; // Zugriff auf 16. Element Hinweis • Objekte sind immer Referenz-Typen 18 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Strings String eigener (Referenz)-Datentyp in Java • Strings sind Objekte Strings und Stringverkettung • Definition String s = "Hello"; • Strings können mit "+" zusammengehängt werden String s = "Hello " + "World"; // s -> "Hello World" • automatische Konversion von numerischen Variablen int i = 16, String s1 = String s2 = String s3 = 19 j = 2; "Resultat: " + i; "Resultat: " + i + j; "Resultat: " + (i + j); // s1 -> "Resultat: 16" // s2 -> "Resultat: 162" // s3 -> "Resultat: 18" ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Textausgabe auf Konsole Java Methoden • println(str) und print(str) - mit und ohne newline • printf(format, daten) - wie in C Beispiel • alle Varianten erzeugen die gleiche Ausgabe int theYear = 2017; System.out.print("Hello World in " + theYear + "\n"); System.out.println("Hello World in " + theYear); System.out.printf("Hello World in %4d\n", theYear); 20 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Texteingabe von Konsole Benötigt Klasse Scanner • dazu muss java.util.* importiert werden Beispiel import java.util.*; public class InputExample { public static void main(String[] args) { Scanner scanner = new Scanner(System.in); System.out.print("enter name: "); String name = scanner.next(); System.out.print("enter age: "); int age = scanner.nextInt(); System.out.printf("You %s are %d\n", name, age); } } 21 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Typenumwandlung (casts) Operationen mit gemischten Typen • Umandlung: teilweise automatisch, teilweise von Hand • niedrigere Datentypen in höhere Datentypen umgewandelt Typenhierarchie • Verlust von Genauigkeit möglich Explizite Umwandlung double float long int short byte höchster Typ niedrigster Typ cast wie in C double d; ... int i = (int)d; 22 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Ausdrücke und Operatoren Ausdrücke und Operatoren • gleich wie in C mit sehr wenigen Ausnahmen Ausnahmen • Modulo Operation auch für Fliesskomma-Typen definiert • Mathematische Funktionen in java.lang.Math definiert - automatisch importiert - es muss die Klasse "Math" angegeben werden - z.B. Konstanten Konstante e: double e = Math.E Konstante pi: double pi = Math.pi - z.B. Funktionen runden auf nächste ganze Zahl: i = Math.round(d) runden auf höhere ganze Zahl: d = Math.ceil(d) 23 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Blöcke, Entscheidungen, Schleifen Java wie C • Block - in geschweiften Klammern: { ... } • Entscheidungen - if then else - switch • Schleifen - for - while, do ... while - break, continue Unterschied zu Standard C • Schleifenvariable i.d.R. in Schleifeninitialiseirung deklariert for (int i = 0; i < 10; i++) ... 24 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 C Funktionen vs. Java Methoden Methoden in Java • wie Funktionen in C • Ausnahme: Methoden ohne Paramater void test(void) { ... } "void" nicht erlaubt // nicht erlaubt in Java main-Methode in Java • 1 Argument: Array von Strings - Anzahl Elemente des Arrays kann abgefragt werden • Beispiel: gibt Anzahl Argumente aus public static void main(String[] args) { System.out.println("Anzahl Argumente" + args.length); } 25 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 sl id e Arrays ... revisited Deklaration • Array existiert noch nicht hat auch noch keine Länge • legt Speicherplatz für Referenz an Array-Datentyp (Referenzdatentyp) int[] a; // Deklaration des Arrays Element-Datentyp Anlegen mit new • alloziert Speicherplatz • wird mit 0 initialisiert int[] a; a = new int[8]; hat eine Länge (hier 8 integers) // Deklaration // Speicherreservation: 8 integer int[] b = new int[10]; // Deklaration und Reservation: 10 integer 26 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 ... Arrays Initialisierung • nur bei Deklaration möglich • zwei Varianten double[] messWerte = {0.14, 0.23, 0.32, 0.41}; double[] testWerte = new double[] {0.1, 0.2, 0.3, 0.4}; Arrays in Java Objekte • Objekt mit Daten und einer Länge int n = ... ; int[] b = new int[n]; for (int i = 0; i < b.length; i++) System.out.println(b[i]); 27 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 ... Arrays Zugriff • über Index, erstes Element hat Index 0 int index = 4; wert = a[index]; Java testet Array Grenzen • Zugriff auf unerlaubten Index ArrayIndexOutOfBoundsException Arrays nicht explizit löschbar • keine "dangling" Pointers • Garbage Collector gibt Speicher frei 28 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 ... Arrays Parameter für Methode • mit Referenz übergeben public int summe(int[] array) { int sum = 0; for (int i = 0; i < array.length; i++) sum += array[i]; return sum; } • Änderungen in Methode an Array sichtbar im aufrufenden Programm (wie C) 29 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 ... Arrays Zweidimensionale Arrays int m = ...; int n = ...; int[][] b = new int[m][n]; // Deklaration & Reservation: m x n • Längenabfrage int rows = b.length; int cols = b[0].length; // Anzahl Reihen // Anzahl Spalten • Zugriff int q = b[16][4] + b[12][3]; Mehrdimensionale Arrays • analoges Vorgehen 30 ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 Strings revisited String in Java • beliebig lange Kette von Zeichen • oft verwendet: Kommunikation mit "Umwelt" • als Objekt behandelt Wichtige String Methoden • • • • • • • 31 Länge des Strings int length() Zeichen an Position char charAt(int index) Vergleich von Strings Position eines Substrings String split(String regexp) Stringzerlegung etc. siehe auch Leseempfehlungen ZHAW, © M. Thaler, K. Rege, G. Burkert März 17 ... Strings revisted Vergleich von String-Objekten • Objekte können nicht mit "==" verglichen werden • es werden nur die Referenzen verglichen • falsch String a = "abc"; String b = "abc"; if (a == b) {} // vergleicht Referenzen -> immer false • richtig: equals-Methode verwenden String a = "abc"; String b = "abc"; if (a.equals(b)) {} 32 // vergleicht String Objekte ZHAW, © M. Thaler, K. Rege, G. Burkert März 17