int x = 1; int y = 2; int *ip; // ip is Pointer to int ip = &x; y = *ip; *ip = 0; ip = &y; J2SE 5.0 – Aufzähldatentypen (These 2) Java 1.5 führt Aufzähldatentypen ein ● ● ● typsicher ähnlich einer Klassendefinition (keine Ober-/Unterklassen) erlauben auch Methoden und Variablen public class Farbe { public final static int BLACK = 0; public final static int WHITE = 1; public final static int RED = 2; } .... int farbe = Farbe.BLACK; enum Farbe { black, white, red, green } ... Farbe f = Farbe.black; J2SE 5.0 – “Generics” (These 3) Java 1.5 ermöglicht auch generische Klassen: kein Type-Casting mehr bei der Benutzung von Collections Buch b1 = new Buch(“Titel”); Buch b = new Buch(“Titel”); ArrayList list = new ArrayList(); ArrayList<Buch> list = list.add(0, b); new ArrayList<Buch>(); list.add(0,b); Buch b2 = (Buch)list.get(0); Buch b2 = list.get(0); J2SE 5.0 – “Generics” (These 3) Java 1.5 ermöglicht auch generische Klassen: typsichere Collections Buch b = new Buch(“Titel”); Auto a = new Auto(“E-TV 20”); ArrayList list = new ArrayList(); list.add(0, a); list.add(1, b); list.add(2, new Integer(2)); Buch b = new Buch(“Titel”); Auto a = new Auto(“E-TV 20”); ArrayList<Buch> list = new ArrayList<Buch>(); list.add(0, b); // Fehler zur Compilezeit: list.add(1, a); J2SE 5.0 – “Autoboxing” Problem: an vielen Stellen (z.B. beim Arbeiten mit Collections) werden Objekte benötigt, aber es liegen primitive Datentypen (z.B. int-Werte) vor bisher: explizite Hin- und Rückkonvertierung nötig Autoboxing beseitigt dieses Problem ArrayList list = new ArrayList(); ArrayList<Integer> list = new ArrayList<Integer>(); int i = 12; int i = 12; list.add(0, new Integer(i)); list.add(0, i); int j = 2; int j = 2; j = j + (list.get(0)).intValue(); j = j + list.get(0); J2SE 5.0 – vereinfachte Iteration Problem: bei Iteration über die Elemente von Collections ist bisher der Umweg über Iterator oder Enumeration nötig Java 1.5 erlaubt einfachere Schleifen bei Benutzung von Collections ArrayList regal = new ArrayList(); ... for (Iterator i = list.iterator(); i.hasNext();) { ((Buch)regal.get(i)).print(); } ArrayList<Buch> regal = new ArrayList<Buch>(); ... for (Buch b : regal) { b.print(); } TYPE personentyp : ( student, dozent ); TYPE uniperson = RECORD name : STRING alter : INTEGER; CASE typ : personentyp OF student : (matrikelnr : INTEGER ); dozent : (personalnr, telefon, raum : INTEGER ); END; { case } END; class Ueberladen { private int wert; Ueberladen() {wert=0;} Ueberladen(int zahl) {wert = zahl;} int addiere(int summand) { wert += summand; return wert;} int addiere(int summand, int mehrmals) { wert = (wert+summand)*mehrmals; ; return wert; } int addiere(Ueberladen summand) { wert += summand.wert; return wert; } int gibWert() {return wert;} } class UeberladenTest{ public static void main(String[] args){ Ueberladen u1 = new Ueberladen(); Ueberladen u2 = new Ueberladen(42); System.out.println(u1.addiere(21)); System.out.println(u2.addiere(u1)); System.out.println(u1.addiere(10,2)); u1.addiere(1); System.out.println(u1.gibWert()); } } J2SE 5.0 – “Varargs” (These 5) Java 1.5 ermöglicht nun auch variable Argumentlisten int addiere (int a, int b) { return (a+b); } int addiere (int a, int b, int c) { return (a+b+c); } ... int addiere (int ... args) { int wert = 0; for (int i : args) { wert += i; } return wert; } int i = 0; int j = 0; marke 1: i++; j = 0; marke2: j++; if (j < 10) goto marke2; if (i < 10) goto marke1; J2SE 5.0 – statischer Import mit Vorsicht zu genießen: Import statischer Variablen aus anderen Klassen in den Namensraum der aktuellen Klasse import java.awt.BorderLayout; ... getContentPane().add( new JButton(“Play”), BorderLayout.CENTER); import static java.awt.BorderLayout.*; ... getContentPane().add( new Jbutton(“Play”), CENTER);