Von C zu Java

Werbung
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
Herunterladen