Foliensatz1+2 - Detlef Krömke - Goethe

Werbung
Johann Wolfgang Goethe-Universität
Professur für Graphische Datenverarbeitung
Fachbereich Informatik und Mathematik
Prof. Dr. Detlef Krömker
Ashraf Abu Baker
Organisatorisches
Intensivkurs vom 01.10.07 bis zum 12.10.07
9:00-10:30
Vorlesung
10:30-12:15
Bearbeitung von theoretischen MultipleChoice-Aufgaben
12:15-13:00
Tutorium (Lösung der MC-Aufgaben)
13:00-14:00
Pause
14:00-18:00
Programmierung an den RBI-Rechnern
[email protected]
Java-Intensivkurs WS07/08
Folie 1
Organisatorisches
Teilnahmeschein (kein Leistungsschein, keine
Kreditpunkte)
Voraussetzung:
Java-Intensivkurs WS07/08
Folie 2
Aktuelle Information
http://www.gdv.informatik.uni-frankfurt.de/
Erfolgreiche und regelmäßige Teilnahme
Mindestens 50% der Übungspunkte
Bei 7 der Übungsblätter müssen für den theoretischen und
praktischen Teil jeweils mindestens 20% der Mindestpunktzahl
erreicht werden
Programmieraufgaben zählen doppelt so viel wie MC-Aufgaben
Java-Intensivkurs WS07/08
Folie 3
Java-Intensivkurs WS07/08
Folie 4
Einleitung
Java ist eine Technologie:
Plattform
Einleitung
Java-API: Sammlung aus Java-Programmen, die in
Pakete (packages) aufgeteilt sind
Pakete: Bibliotheken aus Klassen und Interfaces
Programmiersprache
Plattform (im Allgemeinen): Hardware- oder Softwareumgebung
Betriebssystem + Hardware
Java ist nur eine Software-Plattform
API (Java Application Programming Interface)
JVM (Java Virtual Machine)
Java-Intensivkurs WS07/08
Folie 5
Einführung
JVM:
Java-Intensivkurs WS07/08
Folie 6
Einführung
Plattformunabhängig?
Plattformunabhängige Softwareumgebung, die Java-Bytecode in
Maschinensprache übersetzt, interpretiert und ausführt
Kann als Bytecode Interpretier- und Ausführungsumgebung verstanden
werden
Da Java-Programme von der JVM und
nicht direkt von
Bytecode:
Datei mit der Erweiterung „.class“
Entsteht, wenn ein Java-Compiler ein Java-Programm kompiliert und
übersetzt
der Hardware ausgeführt werden,
sind sie plattformunabhängig.
Das einzige Codeformat, das die JVM verstehen kann
Java-Intensivkurs WS07/08
Folie 7
Java-Intensivkurs WS07/08
Folie 8
Entwicklungsgeschichte
Java ist 12 Jahre alt
Entwicklung von Java-Programmen
Vorbereitung:
Jahr
Version
Pakete
Klassen
Neue Features
1996
1.0
7
210
Applets, AWT, I/O, Net
1997
1.1
22
ca. 600
RMI, JDBC,…
1998
1.2
59
1524
Swing, Collections,…
2000
1.3
76
1840
CORBA ORB, Sound, Servlets…
2002
1.4
135
2723
XML Processing, JNI,…
2004
1.5
165
3279
Generics, Enhanced for Loop, Autoboxing, Enums,
Annotations…
2006
1.6
202
3777
Scripting, Compiler Access, Desktop Deployment…
Java Development Kit (JDK)
Java-Intensivkurs WS07/08
Folie 9
Entwicklung von Java-Programmen
Ein Java-Programm
Höchstens einer public-Klassendefinition (public top level class
definition)
Eine unbeschränkte Anzahl von nicht public-Klassendefinitionen
(non public top level class definitions)
Java-Quelldateien
Unicode-Dateien, die mit der Erweiterung „.java“ gespeichert
werden
Java-Intensivkurs WS07/08
Folie 11
Entwicklungsumgebung Eclipse
Java-Intensivkurs WS07/08
Folie 10
Programmbeispiel
Enthält ein Java-Programm eine top-levelKlassendefinition z.B. namens MyJavaProgram, so muss
seine Quelldatei MyJavaProgram.java heißen
/**
* A java program containing 1 public- and 2 non public class
* definitions.
*/
public class HelloWorld {// public class definition}
class MyFirstClass {// non public class definition}
class MySecondClass {// non public class definition}
Java-Intensivkurs WS07/08
Folie 12
Bestandteile eines Java-Programms
Pakete Imports & Klassen
package mypackage;// package declaration
Ein Programm kann drei sog. top-levelKompiliereinheiten beinhalten
Paket-Deklaration (package declaration)
Import-Anweisungen (import statements)
Klassen- oder Interface-Definitionen (class/interface definitions)
Alle genannten Kompiliereinheiten sind optional
Wenn sie jedoch in einer Java-Quelledatei vorkommen,
dann müssen sie in der obigen Reihenfolge erscheinen
Java-Intensivkurs WS07/08
Folie 13
Pakete & Imports
Pakete:
Dienen der logischen Gruppierung und Organisation von Klassen
und Interfaces
Entsprechen Programmierbibliotheken in anderen
Programmiersprachen
Import-Anweisungen:
Dienen der Verfügbarkeitsmachung
von Klassen aus anderen Paketen
Java-Intensivkurs WS07/08
Folie 15
import javax.swing.JButton; // import statement
import javax.swing.JPanel;// import statement
/*
* A top-level class definition
*/
public class MyClass{
//class body (Klassenrupf)
}
// interface definition
interface MyInterface{}
Java-Intensivkurs WS07/08
Folie 14
Kommentare
Drei Arten von Kommentaren:
// line comment
Zeilenkommentare:
Ein Zeilenkommentar ist genau eine Zeile lang
Blockkommentare:
Können sich über mehrere Zeilen strecken
Dokumentationskommentare:
- Werden vom Javadoc-Tool verwendet
- Für die automatische Generierung von
Klassen- und Interface-Dokumentationen
- Beginnen mit “/**“ und enden mit “*/“
Java-Intensivkurs WS07/08
Folie 16
/*
* block comment
*/
/**
* java-doc comment
*/
Applikationen und Applets
Zwei Arten von Java-Programmen:
Applikationen und Applets
Eine Applikation ist ein Java-Programm, das als eigenständige
Anwendung (stand alone application) von einer auf einem Rechner
installierten JVM, ausgeführt werden kann
Applets sind Java-Programme, die in HTML-Seiten eingebettet
werden und von einem Javafähigen Web-Browser als WebAnwendungen gestartet werden
Ein Javafähiger Browser ist ein Browser, für den die JVM als Plug-In
installiert ist
Java-Intensivkurs WS07/08
Folie 17
Applikationen
Applikationen
Es ist die Aufgabe des Programmierers festzulegen, ob
sein Programm als Applikation, als Applet oder auch als
beides funktionieren soll
Ein Programm, das als eigenständige Applikation
ausgeführt werden soll, muss eine sog. main-Methode
enthalten
//Signatur der main-Methode
Dient als Startpunkt
der Applikation
public static void main(String[] input){
}
//bzw. (seit JDK 5)
public static void main(String ... input)
{}
Java-Intensivkurs WS07/08
Folie 18
Applikationen
Warum muss jede Applikation eine main-Methode
enthalten?
Wird die main-Methode gefunden, übergibt ihr die JVM ein
Parameterarray und fängt anschließend mit der sequenziellen
Ausführung der in ihr enthaltenen Anweisungen an
Was passiert, wenn eine Applikation gestartet werden
soll?
Das Parameterarray enthält ggf. die Eingabeparameter, die an
das Programm übergeben werden sollen
Die Applikation repräsentiert durch ihre Klasse, wird in die JVM
geladen
Enthält die Klasse keine solche Methode, so wird eine
Fehlermeldung ausgegeben
Die JVM durchsucht dann die Klasse nach der main-Methode
Java-Intensivkurs WS07/08
Folie 19
Java-Intensivkurs WS07/08
Folie 20
Bezeichner (Identifier)
Java-Bezeichner:
Bezeichner
Dürfen keine Java-Schlüsselwörter sein
Werden zur Benennung von Variablen, Methoden, Klassen,
Interfaces, Paketen... verwendet
Beliebig lange Folge aus Buchstaben, Ziffern und den UnicodeZeichen $ und _
Müssen mit einem Buchstaben, einem $-Zeichen oder einem
Unterstrich „_“ beginnen
int minValue;//legal
int
int
int
int
$;//legal
_3;//legal
3a;//illegal
min-Value;//illegal
int $minValue;//legal
int
int
int
int
int _minValue;//legal
$_;//legal
int _;//legal
a3;//legal
!maxValue;//illegal int -maxValue;//illegal
min!Value;//illegal
int _int;//legal
Java-Intensivkurs WS07/08
Folie 21
Variablen
Variable:
Symbol für einen Speicherbereich
Speichert Daten eines bestimmten Datentyps
Sind case-sensitive
abstract
assert
continue
default
for
goto
new
package
switch
synchronized
boolean
break
byte
case
catch
char
class
const
do
double
else
enum
extends
final
finally
float
if
implements
import
instanceof
int
interface
long
native
private
protected
public
return
short
static
strictfp
super
this
throw
throws
transient
try
void
volatile
while
int _int;//legal
Java-Intensivkurs WS07/08
Folie 22
Datentypen
Primitive Datentypen (primative data types)
Referenzdatentypen
(reference data types)
Java ist eine stark typisierte Programmiersprache
Jede Variable und jeder Ausdruck muss zur Kompilierzeit an
einen bestimmten Datentypen gebunden sein
Java-Intensivkurs WS07/08
Folie 23
int newVariable;//legal
int ifConstant;//legal int If;//legal
int New;//legal
int Private;//legal
int $boolean;//legal
Java-Intensivkurs WS07/08
Folie 24
Primitive Datentypen
Char
8 Datentypen
char:
Boolean
- Logischer Datentyp
- 1 Byte lang
- false oder true
boolean
true
false
char
16-Bit-Unicode-Zeichen
(0x0000 … 0xffff)
byte
–27 bis 27–1
short
–215 bis 215–1
int
–231 bis 231–1
long
–263 bis 263–1
float
1,4E-45f … 3,4E+38f
double
4,9E-324 … 1,7E+308
Unicode-Zeichen bzw. Ganzzahlen aus dem Intervall [0, 216-1]
char ist der einzige numerische Datentyp, der nicht
vorzeichenbehaftet ist
Mit char-Variablen können ganzzahlige Berechnungen
durchgeführt werden
char a='a';//entspricht der Zahl 97
char b='b';//entspricht der Zahl 98
int aPlusb=a+b;
char c=99;
int aPlusbplusC=aPlusb+c;
System.out.println("a+b="+aPlusb+",a+b+c="+aPlusbplusC);
Ausgabe:
Java-Intensivkurs WS07/08
Folie 25
Java-Intensivkurs WS07/08
Folie 26
Ganzzahlentypen
byte, short, int, long
Numerische vorzeichenbehaftete Integraltypen
Stellen Ganzzahlen dar
Können in 3 Formaten dargestellt werden
- Dezimalformat : z.B. 281
- Oktalzahlen (Zahlen zur Basis 8 ): beginnen mit „0“ z.B. 0431
- Hexadezimal (Zahlen zur Basis 16 ): beginnen mit „0x“ z.B. 0x119
int _281_as_decimal=281;
int _281_as_oktal=0431;
int _281_as_hexadecimal=0x119;
System.out.println(_281_as_decimal+" "+_281_as_oktal+"
"+_281_as_hexadecimal);
Ausgabe: 281 281 281
Java-Intensivkurs WS07/08
Folie 27
a+b=195, a+b+c=294
Fließkommatypen
float, double
numerische vorzeichenbehaftet Fleißkommatypen
Stellen Fließkommazahlen dar
Double-Zahlen sind doppelt so lang und doppelt so genau wie
Float-Zahlen
float _22_divided_by_7_as_float=22/7.f;
double _22_divided_by_7_as_double =22/7.d;
System.out.println("_22_divided_by_7_as_float:
"+_22_divided_by_7_as_float);
System.out.println("_22_divided_by_7_as_double: "+
_22_divided_by_7_as_double);
Ausgabe: _22_divided_by_7_as_float: 3.142857
_22_divided_by_7_as_double: 3.142857142857143
Java-Intensivkurs WS07/08
Folie 28
Fließkommatypen
Float-Zahlen müssen mit dem Suffix „f“ bzw. groß „F“ enden
- Beispiel: 2.4f oder 2.4F
Double-Zahlen können mit dem Suffix „d“ bzw. groß „D“ enden
- Beispiel: 2.4d oder 2.4D
Eine suffixlose Kommazahl wird vom Compiler automatisch als
Double-Zahl interpretiert
Wrapper-Klassen
Zu jedem primitiven Datentypen in Java gibt es eine
korrespondierende Wrapper-Klasse
Kapselt die Variable in einer objektorientierten Hülle
Wrapper-Klassen verfügen über Zahlreiche Methoden
Wrapper-Klasse
Konstanten
und Kostanten Typ
- 2.4 ist eine Double-Zahl
Um eine Fließkommazahl von einer Ganzzahl unterscheiden zu
können, muss mindestens der Dezimalpunkt, der Exponent oder der
Suffix vorhanden sein
- Beispiele: 1., .1, 2E4, 2e4, 2f, 5D
Java-Intensivkurs WS07/08
Folie 29
boolean
Boolean
FALASE, TRUE
char
Character
MIN_VALUE, MAX_VALUE, SIZE
byte
Byte
MIN_VALUE, MAX_VALUE, SIZE, NaN
short
Short
MIN_VALUE, MAX_VALUE, SIZE, NaN
int
Integer
MIN_VALUE, MAX_VALUE, SIZE, NaN
long
Long
MIN_VALUE, MAX_VALUE, SIZE, NaN
float
Float
MAX_EXPONENT,MIN_EXPONENT,
MIN_VALUE, MAX_VALUE, SIZE , NaN
double
Double
MIN_EXPONENT,MIN_VALUE,
MAX_VALUE, SIZE,MAX_EXPONENT, NaN
Java-Intensivkurs WS07/08
Folie 30
Arithmetik- & Fließkommaprobleme
Typkonvertierung & Casting
Arithmetische Operationen können ungültige Werte
produzieren bzw. Rundungsfehler verursachen
Jede Variable in Java ist an einen Typ gebunden
1.30308
Fehlerart
10
* *310≠ 3
49
* 49 ≠ 1.0
Beispiel
Ergebnis
Overflow
Infinity
Rundungsfehler
true
Rundungsfehler
0.0/0.0
NaN
Rundungsfehler
1.0/0.0
Infinity
Rundungsfehler
true
Java erlaubt den Datentyp einer Variable in einen
anderen Datentyp zu konvertieren
Zwei Arten von Typkonvertierungen:
Implizite (automatische ) Typkonvertierung
-
Explizite Typumwandlung (casting)
-
Java-Intensivkurs WS07/08
Folie 31
Wird vom Compiler automatisch durchgeführt
Kann bzw. muss vom Programmierer durchgeführt werden
Java-Intensivkurs WS07/08
Folie 32
Typkonvertierung & Casting
/*
* Package: default
* Class:
Samples
* Method: typeConversion()
*/
//Beispiele für implizite Typkonvertierungen
System.out.println(710);//implizite Typumwandlung von
//integer in String
System.out.println(3.5);//implizite Typumwandlung von
//double in String
int k=5/2;//ganzzahlige Division. k hat den Wert 2
System.out.println("5/2="+k);
Ausgabe: 710 3.5 5/2=2
Typkonvertierung & Casting
//Beispiele für implizite Typkonvertierungen
System.out.println("5/2.0="+5/2.0+" Das Ergebnis ist vom
Type double!");
System.out.println("5/2.0f="+5/2.0f+" Das Ergebnis ist vom
Type float!");
int x='u';//implizite Typumwandlung von char zu integer
System.out.println(x);//liefert 117 zurück
Ausgabe:
5/2.0=2.5 Das Ergebnis ist vom Type double!
5/2.0f=2.5 Das Ergebnis ist vom Type float!
117
Java-Intensivkurs WS07/08
Folie 33
Java-Intensivkurs WS07/08
Folie 34
Typkonvertierung & Casting
Ob explizit oder implizit hängt vom Zieltyp ab
Jede Typkonvertierung entgegen der Pfeilrichtung
muss explizit durchgeführt werden
- Explizite Typkonvertierung wird als Casting bezeichnet
- Einschränkende Typkonvertierungen
Konvertierungen in Pfeilrichtung werden automatisch
durchgeführt
- Erweiternde Typkonvertierungen
Typkonvertierung & Casting
//Method: Samples.typeConversion()
int i=32;
short s=4;
char c='g';
double d=i;//erweiternde Typumwandlung
float ff=(float)d;//einschränkende Typumwandlung
byte b=(byte)c;//einschränkende
c=(char)s;//einschränkende
c=(char)b;//einschränkende
Java-Intensivkurs WS07/08
Folie 35
Java-Intensivkurs WS07/08
Folie 36
Erweiternde Typkonvertierungen
Erweiternde Typkonvertierungen:
Einschränkende Typkonvertierungen
Einschränkende Typkonvertierungen (erfordern Casting):
byte zu short, int, long, float, oder double
short zu byte oder char
short zu int, long, float, oder double
char zu byte oder short
char zu int, long, float, oder double
int zu byte, short, oder char
int zu long, float, oder double
long zu byte, short, char, oder int
long zu float oder double
float zu byte, short, char, int, oder long
float zu double
double zu byte, short, char, int, long, oder float
Java-Intensivkurs WS07/08
Folie 37
Autoboxing (boxing/unboxing)
Autoboxing gibt es erst seit Version 5
Vor Version 5 waren die primitiven Datentypen und ihre
korrespondierenden Wrapper-Klassen nicht
zuweisungskompatible
So war es z. B. nicht möglich eine primitive IntegerVariable einem Integer-Objekt oder umgekehrt
zuzuweisen:
Integer x=2;
int y=new Integer(3);
Java-Intensivkurs WS07/08
Folie 39
Java-Intensivkurs WS07/08
Folie 38
Autoboxing
Unter Boxing versteht man die automatische
Umwandlung eines primitiven Wertes in ein WrapperKlassenobjekt
Unboxing ist die Umkehrung von Boxing, sprich die
automatische Umwandlung eines WrapperKlassenobjektes in einen primitiven Wert
//boxing/unboxing
Boolean b=false;//boxing
float f=new Float(3.4.f);//unboxing
Java-Intensivkurs WS07/08
Folie 40
Autoboxing
Arrays
Da die Umwandlung automatisch vom Compiler
erfolgt, spricht man von Autoboxing
Geordnete Folge von Elementen des gleichen
Datentyps
Primitive Datentypen und ihre korrespondierenden
Wrapper-Klassen sind zuweisungskompatibel
Felder können enthalten:
Vor Version 5 hätte man die Umwandlung manuelle
durchführen müssen
//Vor Version 5 manuelle Umwandlung
Boolean b=new Boolean(false);
Float f1=new Float(3.4.f);
float f=f1.floatValue();
Java-Intensivkurs WS07/08
Folie 41
Array-Deklaration
Die Deklaration teilt dem Compiler den Namen des Arrays
und den Typ seiner Elemente mit
Bei Deklarationen ist es erlaubt den Arraynamen vor, nach
oder zwischen den eckigen Klammerpaaren zu
positionieren
Elemente eines primitiven Datentyps
Referenzen auf andere Arrays bzw. auf Objekte
Definition eines Arrays erfolgt in 3 Schritten:
Deklaration
Konstruktion
Initialisierung
Java-Intensivkurs WS07/08
Folie 42
Array-Konstruktion
Bei der Konstruktion eines Arrays wird ein Arrayobjekt
mit dem new-Operator instanziiert und die Länge des
Arrays festgelegt:
list1= new int[10]; // Arraykonstruktion
int [] list1; // Arraydeklaration
int list2 [];//Arraydeklaration
float [][] twoDimArray; // array of arrays of float
float []twoDimArray2[]; // array of arrays of float
int [] list3, list4 ; //Deklaration mehrerer Arrays
int [] list7, list8, list9[], list10[] ; //
Deklaration mehrerer Arrays. list9 und list10 sind
zweidimensionale Arrays
Java-Intensivkurs WS07/08
Folie 43
Java-Intensivkurs WS07/08
Folie 44
Intialisierung
Immer, wenn ein Array definiert wird, werden seine
Felder automatisch mit den Standardwerten ihres
Datentyps initialisiert
Standardwerte:
- 0 für numerische Datentypen
- false für boolean
- null für Referenztypen
Will man während der Definition das Array mit anderen
Werten initialisieren, so muss die Deklaration,
Konstruktion und Initialisierung zu einem einzelnen
Schritt kombiniert werden:
Java-Intensivkurs WS07/08
Folie 45
Irreguläre Arrays
Ein zweidimensionales Array:
Array dessen Felder Referenzen auf andere eindimensionale
Arrays enthalten
Es ist irreführend sich derartigen Arrays als eine Matrix
vorzustellen
Initialisierung
/*
* Package:
* Class:
* Method:
*/
//Explizite
default
Samples2.java
arrays()
Array-Intialisierung
int[]factorial = { 1, 1, 2, 6, 24, 120, 720, 5040 };
char ac[] = { 'n','o','t',' ','a',' ','S','t','r',
'i','n','g' };
float [][] _3X2Matrix={{1.0f,2.1f},{.5f,2.1f},{3.1f,.72f}};
Java-Intensivkurs WS07/08
Folie 46
Irreguläre Arrays
int [][] irregularArray =new int[][]{{3,1},{-1},{5,2,0}};
irregularArray[0] // entspricht {3,1} (erste Zeile)
irregularArray[1] // entspricht {-1} (zweite Zeile)
irregularArray[1][0] // entspricht -1 (erstes Element in der
zweiten Zeile)
irregularArray[2] // entspricht {5,2,0} (dritte Zeile)
In Java ist es nämlich erlaubt irreguläre
mehrdimensionale zu definieren:
Arrays, deren Zeilen unterschiedliche Längen aufweisen
Java-Intensivkurs WS07/08
Folie 47
Java-Intensivkurs WS07/08
Folie 48
Zugriff auf Arrays
Kontrollstrukturen
Jedes Arrayelement hat einen numerischen Index
Nummerierung fängt mit 0 an
Der Versuch auf ein Element mit einem falschen Index
zuzugreifen wirft eine sog. ArrayIndexOutOfBoundsException
if-else-Anweisung
Der Fragezeichenoperator:
(boolean_condition) ? expression1: expression2;
public static void wrongIndex(){
int [][] intArray =new int[3][3];
intArray=new int[][]{{3,1,3},{-1,0,1},{5,2}};
for(int i=0; i<3;i++)
for (int j=0;j<3;j++)
System.out.print(intArray[i][j]+" ");
int x=(y>0)?7:8;// wenn y>0 dann x=7 sonst x=8
}
Ausgabe: 3 1 3 -1 0 1 5 2 Exception in thread "main"
java.lang.ArrayIndexOutOfBoundsException: 2
at Samples.wrongIndex(HelloWorldApp.java:218)
at SamplesApplication.main(HelloWorldApp.java:19)
Java-Intensivkurs WS07/08
Folie 49
Java-Intensivkurs WS07/08
Folie 50
If-else-Anweisung
public
static void nullStellen(){
Asöldfk
/*
* Für eine quadratische Funktion f(X)=aX^²+bX+c mit a!=0
* ist Xi eine Nullstelle falls gilt: f(Xi)=0
* Die Nullstellen einer quadratischen Funktion lassen
* sich mithilfe der pq-Formel wie folgt leicht
* ermitteln:
*/
//f(X)=2X^²+3X+1
float a=2f, b=3f, c=1;
float p=b/a;
float q=c/a;
If-else-Anweisung
float d=(float)Math.pow(p/2, 2)-q;//d=(p/2)^²-q;
if(d<0)
System.out.println("Die Funktion f(X)="+a+"X^²+"+b+"X+"+c+"
hat keine Nullstellen!");
else if(d==0){
float x0=-p/2;
System.out.println("Die Funktion f(X)="+a+"X^²+"+b+"X+"+c+"
hat nur eine Nullstelle: X0="+x0);
} else {
float x0=-p/2+(float)Math.sqrt(d);
float x1=-p/2-(float)Math.sqrt(d);
System.out.println("Die Funktion f(X)="+a+"X^²+"+b+"X+"+c+"
hat zwei Nullstellen: X0="+x0+" und X1="+x1);
}
}
Java-Intensivkurs WS07/08
Folie 51
Java-Intensivkurs WS07/08
Folie 52
Switch
Switch
Eine if-else-Abfrage kann schnell unübersichtlich werden,
wenn viele Alternativen berücksichtigt werden müssen
Eine kompaktere Anweisungsform bietet das switchKonstrukt
Die Testvariable muss zuweisungskompatibel mit int sein
Testvariable ist vom Typ byte, char, short, oder int
Die sog. case-Labels (OPEN_FILE, DELETE_FILE, …) müssen
Konstanten sein
final int OPEN_FILE=0;final int DELETE_FILE=1; final int SAVE_FILE=2;
switch(command){//command wird Testvariable genannt
case OPEN_FILE: System.out.println("opening file...");break;
switch(testvaribale){
case C1: statement_1;
case C2: statement_2;
….
case Cn: statement_n;
default: default_statement;
}
case DELETE_FILE: System.out.println("deleting file...");break;
case SAVE_FILE: System.out.println("saving file...");break;
default: System.out.println("invalid command !!!!!");
}
Java-Intensivkurs WS07/08
Folie 53
Schleifen
while(boolean_condition)
repeated_statement_or_block
public static void whileBinary(int number) {
String binary="";
int number=123 ;
int div=number ;
int rest;
while(div>0 ){
rest=div%2;
div=div/2;
binary=rest+binary;
}
}
System.out.println("Die Binärdarstellung von "+number+" ist "+binary);
}
whileBinary(123 );
Ausgabe: Die Binärdarstellung von 123 ist 1111011
Java-Intensivkurs WS07/08
Folie 55
Java-Intensivkurs WS07/08
Folie 54
while
Beispiele für endlose while-Schleifen
public static void endlessWhileLoop() {
byte b=0;
while(b<3);
b++;//this statement will never execute
byte y=0;
while(true)
System.out.println((++y));//overflow after 128 iterations
byte x=1;
byte y=10;
while(Math.min(x,y)<5);// endless loop:
++x;
}
Java-Intensivkurs WS07/08
Folie 56
do-while
do
repeated_statement_or_block
while (boolean_condition);
public static void doWhileSumOfDigits(int number) {
//Berechnung der Quersumme einer positiven Zahl:
int sumOfDigits = 0;
do {
sumOfDigits += number % 10;// sumOfDigits=sumOfDigits+number%10
number /= 10;// number=number/10
}
while (number != 0)
System.out.println(sumOfDigits);// 25
}
doWhileSumOfDigits(283746);
Ausgabe: 30
Java-Intensivkurs WS07/08
Folie 57
for-Schleife
public static void strangeForLoop() {
// strange loop for(System.out.println("Ich werde ein einziges Mal
zu Beginn ausgeführt!");
i<5;System.out.println("Ich werde am Ende eines
Schleifendurchlaufs ausgeführt! "))
{
System.out.println("Ich werde zum "+(i++)+". Mal ausgeführt!");}
}
//Die beiden Schleifen sind äquivalent
for(System.out.println("Ich werde ein einziges Mal zu Beginn
ausgeführt!");
i<5;)
{
System.out.println("Ich werde zum "+(i++)+". Mal
ausgeführt!");
System.out.println("Ich werde am Ende eines
Schleifendurchlaufs ausgeführt! ")
}
Java-Intensivkurs WS07/08
Folie 59
for-Schleife
for(statement; boolean_condition;expression)
statement_block
public static void fibbonacci(int n) {
int fib1 = 0, fib2 = 1;
int fib = fib1 + fib2;
for (int i = 3; i <= n; i++) {
fib1 = fib2;
fib2 = fib;
fib = fib1 + fib2;
}
System.out.println(fib);
}
Samples.fibbonacci(11);
Ausgabe: 89
Java-Intensivkurs WS07/08
Folie 58
for-each-Schleife
Erst seit Version 5
Sie bietet eine komfortable Möglichkeit über Arrays und
Kollektionen (Collections) zu iterieren:
public static void forEachLoop() {
double [] trigonometry=new
double[]{Math.PI,Math.sin(Math.PI/2),Math.cos(Math.PI/2)};
for (double d : trigonometry)
System.out.println(d);
//for each element d in
the trigonometry array
}
//äquivalent zu:
for(int i=0;i<trigonometry.length;i++)
System.out.println(trigonometry[i]);
Java-Intensivkurs WS07/08
Folie 60
break und continue
In vielen Fällen ist das Beenden eines
Schleifendurchlaufes bzw. das Verlassen eines
Schleifenrumpfes erforderlich
continue und break
break:
Abarbeitung der Schleife sofort beendet
Schleife wird verlassen
Unabhängig davon ob das Abbruchkriterium erfüllt ist oder nicht
Anwendungsbeispiel: Textsuche-Programm
Java-Intensivkurs WS07/08
Folie 61
break
public static void breakSample(){
/* Erstelle eine zufällig generierte
* Liste aus Ganzzahlen
*/
int [] numbers= getRandomIntegerList();//Siehe 6.4 break und continue
/* Ermittle die Summe aller Zahlen, die vor der ersten
* negativen Zahl in der Liste vorkommen.
* Implementierung mit einer for-each-Schleife
*/
int sum=0;
for (int number : numbers) {
if(number<0)
break;
sum+=number;
}
System.out.println("Die Summe beträgt: "+sum);
}
Java-Intensivkurs WS07/08
Folie 62
continue
break: Schleife wird verlassen
continue: aktuelle Schleifendurchlauf wird unterbrochen
Nach der Ausführung von continue wird die
Schleifenbedingung erneut ausgewertet und ggf. wird
mit dem nächsten Schleifendurchlauf fortgefahren.
Java-Intensivkurs WS07/08
Folie 63
continue
Beispiel
Berechne die Wurzel jeder positiven Zahl in einer Liste L und
überspringe dabei die negativen Zahlen
public static void continueSample(){
int [] numbers= getRandomIntegerList();
/* Berechne die Wurzel jeder positiven Zahl in der Liste und
* überspringe dabei die negativen Zahlen
* Implementierung mit einer for-each-Schleife
*/
for (int number : numbers) {
if(number<0){
System.out.println(number+" hat keine Wurzel!");
continue;
}
double sqrt=Math.sqrt(number);
System.out.println("Wurzel von "+number+"= "+sqrt);
}}
Java-Intensivkurs WS07/08
Folie 64
OOP
Attribute einer Klasse (attributes)
Klasse:
Abstrakter Datentyp, der die Eigenschaften, das Verhalten & die
Struktur einer Menge gleichartiger Objekte der realen Welt definiert
Eigenschaften werden Attribute genannt
Das Verhalten legen sog. Methoden fest
public class Bankkonto {//Klassendeklaration
//Beginn des Klassenrumpfes
//Attribute legen den Zustand eines Objektes fest
public int kontoNummer; //Felddeklaration
public float kontoStand;//in € // Felddeklaration
public String inhaber; //Felddeklaration
Objekt =Instanz= konkrete Ausprägung einer Klasse
Objekte haben einen Zustand, Verhalten und Identität
Der Zustand eines Objektes ist durch die Belegung seiner Attribute
definiert
Objekte haben Verhalten (führen Aktionen durch)
Objekte haben Namen
//Ende des Klassenrumpfes
}
Beispiel: Klasse Mensch
Java-Intensivkurs WS07/08
Folie 65
Methoden einer Klasse (methods)
Java-Intensivkurs WS07/08
Folie 66
Methoden und Konstruktoren (constructors)
Methoden haben
public class Bankkonto {//Klassendeklaration
public void einzahlen(float betrag){
kontoStand+=betrag;
}
public void abheben(float betrag){
kontoStand-=betrag;
}
public float getKontoStand(){
return kontoStand;
}
}
Java-Intensivkurs WS07/08
Folie 67
Signatur (Methodenkopf):
-
Zugriffsmodifikator (public, private, protected)
Rückgabetyp (void, int, ..)
Namen
Parameterliste
Methodenrumpf
public void einzahlen(float betrag) //Methodenkopf (Signatur)
{
//Methodenrumpf
}
Java-Intensivkurs WS07/08
Folie 68
Konstruktoren
Spezielle Methoden
Haben keinen Rückgabetyp
Heißen genau so wie ihre zugehörigen Klassen
Werden in der Regel verwendet, um die Attribute eines
Objektes mit Anfangswerten zu initialisieren
//Konstruktor
public Bankkonto(){
kontoNummer=0;
inhaber="Unbekannt";
kontoStand=0.f;
}
Java-Intensivkurs WS07/08
Folie 69
Default-Konstruktor
Default-Konstruktor:
Heißt genau so wie seine Klasse
Hat keine Parameter und enthält keine Anweisungen
//Der Defaultkonstruktor
public KlassenName(){
}
Konstruktoren
Ein Konstruktor wird immer dann aufgerufen, wenn ein
Objekt mit dem new-Operator instanziiert wird:
Bankkonto alexKonto=new Bankkonto();//Objekt (Instanz)
Eine Klasse muss keine Konstruktoren definieren
In diesem Fall fügt der Compiler den parameterlosen
Default-Konstruktor in die Klasse ein
Java-Intensivkurs WS07/08
Folie 70
Überladen von Methoden
(overloading)
Zwei Parameterlisten sind unterschiedlich
Sie haben unterschiedliche Anzahl an Parametern
aMethod(float dx, float dy) //2 Parameter
aMethod()//keine Parameter
aMethod(float dx) //1 Parameter
Wenn sie dieselbe Anzahl an Parametern haben, jedoch
unterschiedliche Reihenfolge der Parametertypen
aMethod(float dx, int dy)
aMethod(int dx, float dy)
aMethod(float dx, float dy)
aMethod(int dx, int dy)
Java-Intensivkurs WS07/08
Folie 71
Java-Intensivkurs WS07/08
Folie 72
Überladen von Methoden
Die Bezeichnung der Parameter spielt in beiden Fällen
keine Rolle
Demnach sind die folgenden Parameterlisten absolut identisch:
aMethod(float deltaX, int deltaY)
Überladen von Methoden
Eine Methode ist durch ihren Namen und die exakte
Folge ihrer Eingabeparametertypen eindeutig bestimmt
Die Wiederverwendung desselben Methodennamens
mit einer anderen Parameterliste und evtl. einem
anderen Rückgabetyp wird als Überladung bezeichnet
aMethod(float dx, int dy)
Die beiden Methoden müssen unterschiedliche
Parameterlisten haben
Java-Intensivkurs WS07/08
Folie 73
Überladen von Methoden
Alle folgenden Methoden stellen Überladungen der
Methode translate dar:
public
public
public
public
public
public
public
void
void
void
void
void
void
void
translate(float dx, float dy)
translate(int dx, int dy)
translate(float dx, int dy)
translate(int dx, float dy)
translate(int dxy)
translate(float dxy)
translate()
Java-Intensivkurs WS07/08
Folie 74
Überladen von Methoden
Keine Überladung:
public void translate(float distance)
public void translate(float abstand)
Auch keine Überladung:
public void translate(int deltX, float deltaY)
public void translate(int dx, float dy)
public float translate(int dx, float dy)
Bemerkung: Konstruktoren können auch überladen
werden
Java-Intensivkurs WS07/08
Folie 75
Java-Intensivkurs WS07/08
Folie 76
Vererbung (inheritance)
Ein wesentliches Konzept in der OOP ist die Vererbung
Bietet die Möglichkeit die nicht privaten Attribute und
Methoden einer existierenden Klasse A auf eine neue
Klasse B zu übertragen
B erbt die Attribute und Methoden der Klasse A
A ist eine Oberklasse von B
B ist eine Unterklasse von A
Das Konzept unterstützt die Wiederverwendung von
bereits existierendem Code
Java-Intensivkurs WS07/08
Folie 77
Vererbung
Girokonto
Erbt alle Attribute und Methoden von Bankkonto
Fügt eigene Attribute und Methoden hinzu:
- Kreditrahmen und dauerAuftragEinrichten()
Was kann eine Klasse alles von ihrer Vaterklasse
erben?
Nur die nicht privaten Attribute und Methoden
Konstruktoren werden nicht vererbt
Java-Intensivkurs WS07/08
Folie 79
Vererbung
Girokonto als Unterklasse der Klasse Bankkonto:
class Girokonto extends Bankkonto{
float dispositionsLimit;
public void dauerAuftragEinrichten(){
/*
* Code für die Einrichtung eines
* Dauerauftrags
*/
}
}
Java-Intensivkurs WS07/08
Folie 78
Überschreibung von Methoden
(overriding)
Aus der Oberklasse geerbten Methoden dürfen in der
Unterklasse neu definiert werden
Wird eine von einer Oberklasse geerbten Methode in
der Unterklasse neu definiert ohne ihren Namen und
Parameterliste zu verändern, so spricht man von einer
Überschreibung der Methode
Die überschreibende Methode ersetzt ihre
überschriebene Methode in der Unterklasse komplett
Java-Intensivkurs WS07/08
Folie 80
Überschreibung von Methoden
Die Parameterliste der überschreibenden Methode
muss mit der Parameterliste der überschriebenen
Methode bis auf die Parameternamen identisch sein
Überschreibung von Methoden
public class Point {
public float x1;
public float y1;
//Verschiebung
public void translate(float dx, float dy){
this.x1+=dx;
this.y1+=dy;
}
//Gleichmäßige Verschiebung
public void translate(float distance){
x1+=distance;
y1+=distance;
}
}
Java-Intensivkurs WS07/08
Folie 81
Java-Intensivkurs WS07/08
Folie 82
Überschreibung von Methoden
Überschreibung von Methoden
class Line extends Point{
//Line ist die Unterklasse der Oberklasse Point
float x2;
float y2;
/*
*Überschreibung der Methode translate(float dx, float dy)
*der Oberklasse
*/
@Override
public void translate(float dx, float dy){
//Wiederverwendung des Codes der Oberklasse
super.translate(dx, dy);
x2+=dx;
y2+=dy;
}
}
Java-Intensivkurs WS07/08
Folie 83
class Line extends Point{
float x2;
float y2;
// Überschreibung der Methode translate(float distance)
@Override
public void translate(float distance){
//Überschreiben ohne Wiederverwendung
//des Codes der Oberklasse
x1+=distance;
y1+=distance;
x2+=distance;
y2+=distance;
}
}
Java-Intensivkurs WS07/08
Folie 84
Polymorphismus (polymorphism)
Polymorphismus (polymorphism)
Unter Polymorphismus versteht man die Fähigkeit einer
Objektreferenz, Objekte seiner Unterklasse zu
referenzieren und sich abhängig davon zu verhalten
Wird einer Oberklassenobjektreferenz R ein Objekt O
einer Unterklassen U zugewiesen, so verhält O
dementsprechend wie alle anderen Objekte von U
In Java ist es nämlich erlaubt einer
Oberklasssenobjektreferenz ein Unterklassenobjekt O
zuzuweisen
Verhält sich O in diesem Fall wie ein Objekt der Oberoder der Unterklasse?
Java-Intensivkurs WS07/08
Folie 85
Java-Intensivkurs WS07/08
Folie 86
Polymorphismus
/*
* Package: default
* Class: Polymorphism.java
* Method:
*/
class Polygon {
Polymorphismus
class Rectangle extends Polygon{//Unterklasse
/**
* Ein Rechteck
*/
public float width;
public float height;
//Oberklasse
/*
* Gibt den Flächeninhalt des Polygons zurück.
*/
public void getSurface(){
System.out.println("The surface of this polygon is
undefined.");
}
}
Java-Intensivkurs WS07/08
Folie 87
public Rectangle(float width, float height){
this.width=width;
this.height=height;
}
public void getSurface(){
System.out.println("The surface of this
rectangle is: "+this.width*height);
}
}
Java-Intensivkurs WS07/08
Folie 88
Polymorphismus
class Triangle extends Polygon{
float base;
float height;
public Triangle(float base, float height){
this.base=base;
this.height=height;
}
public void getSurface(){
System.out.println("The surface of this triangle
is: "+.5f*base*height);
}
}
Java-Intensivkurs WS07/08
Folie 89
Polymorphismus
Umgekehrt ist in Java und vielen anderen
Programmiersprachen nicht erlaubt einer Referenz einer
Unterklasse ein Objekt seiner Oberklasse zuzuweisen
Triangle triangle=new
Polygon();//Kompilierfehler
Rectangle rectangle=new
Polygon();//Kompilierfehler
Rectangle rectangle=new
Triangle();//Kompilierfehler
Java-Intensivkurs WS07/08
Folie 91
Polymorphismus
//polygon ist eine Oberklassenobjektreferenz
Polygon polygon=new Polygon();
polygon.getSurface();
polygon =new Rectangle(2,3);
polygon.getSurface();
polygon =new Triangle(3,2);
polygon.getSurface();
Ausgabe:
The surface of this polygon is undefined.
The surface of this rectangle is: 6.0
The surface of this triangle is: 3.0
Java-Intensivkurs WS07/08
Folie 90
Referenzen in Java
Zwei Kategorien von Datentypen:
Primitive Datentypen
Referenztypen (Arrays, Klassen und Interfaces)
Es gibt einen wesentlichen Unterschied zwischen einer
primitiven Variablen und einer Referenzvariablen
Java-Intensivkurs WS07/08
Folie 92
Referenzen in Java
public class Student {
public
public
public
public
}
String name;//Referenzvariable (Objektreferenz)
Date gebDatum;// Referenzvariable (Objektreferenz)
String studiengang;// Referenzvariable (Objektreferenz)
int semesteranzahl; //primitive Variable
Java-Intensivkurs WS07/08
Folie 93
Herunterladen