Universität Bremen Initialisierung von Variablen Automatische Initialisierung Für Klassen-Variablen (die sich auf kein Objekt beziehen, static) Für Member-Variablen (Teile von Objekten) Erzwungene Initialisierung Für lokale Variablen, d.h. Variablen in Funktionen Es muss für den Compiler erkennbar sein, dass eine Variable initialisiert wurde, bevor sie das erste Mal ausgelesen wird. int i = 0; int i; : i = 17; Einführung in die Programmierung mit Java int i; : i = i+1 (Nicht erlaubt) 67 Universität Bremen Funktionen Motivation Eigenschaften Funktionen erlauben, das Programm zu strukturieren Sie kapseln eine bestimmte Funktionalität Man kann sie mehrfach verwenden Sie eröffnen die Möglichkeit zur Rekursion (Selbstaufruf) ergebnistyp bezeichner ( [ typ bezeichner ] { , typ bezeichner } ] ) rumpf Vor Klassen-Funktionen (die sich auf kein Objekt beziehen) steht static Funktionen ohne Rückgabe haben den Ergebnistyp void Überladen Mehrere Funktionen können den gleichen Namen haben, wenn sie unterschiedliche Parameterlisten haben oder zu unterschiedlichen Klassen gehören Einführung in die Programmierung mit Java 68 Universität Bremen Beispiele für Funktionen Parameterlos Mit Parametern static void printHello() {System.out.println("Hello");} static double getPi() {return Math.PI;} void println() in class PrintStream static int plus(int a,int b) {return a + b;} static double factorial(int n) {return n == 0 ? 1 : n * factorial(n-1);} void println(String s) in class PrintStream Überladung static int add(int a,int b) {return a+b;} static double add(double a,double b) {return a+b;} static int add(double a,double b) {return (int) (a+b);} Falsch! static String add(String a,String b) {return Integer.toString(Integer.parseInt(a) + Integer.parseInt(b));} Diverse Varianten von println und print in PrintStream Einführung in die Programmierung mit Java 69 Universität Bremen Count mit Funktionen import importjava.io.*; java.io.*; class classCount Count {{ static staticboolean booleanisWhiteSpace(char isWhiteSpace(charc)c) {{ return returncc== ==' '' '||||cc== =='\t' '\t'|||| cc== =='\n' '\n'||||cc== =='\r'; '\r'; }} static staticboolean booleanisEndOfSentence(char isEndOfSentence(charc)c) {{ return returncc== =='.''.'||||cc== =='!''!'|||| cc== =='?' '?'||||cc== ==':'; ':'; }} Einführung in die Programmierung mit Java static staticvoid voidmain(String[] main(String[]args) args) throws throwsFileNotFoundException, FileNotFoundException, IOException IOException {{ int intchars chars==0,0, whitespace whitespace==0,0, words words==0,0, sentences sentences==0;0; FileInputStream FileInputStreamstream stream== new newFileInputStream(args[0]); FileInputStream(args[0]); int intcc==stream.read(); stream.read(); 70 Universität Bremen Count mit Funktionen while(c while(c!= !=-1) -1) {{ while(c while(c!= !=-1 -1&& &&isWhiteSpace((char) isWhiteSpace((char)c)) c)) {{ ++whitespace; ++whitespace; cc==stream.read(); stream.read(); }} if(c if(c!= !=-1) -1) {{ while(c while(c!= !=-1 -1&& &&!isWhiteSpace((char) !isWhiteSpace((char)c)) c)) {{ ++chars; ++chars; if(isEndOfSentence((char) if(isEndOfSentence((char)c)) c)) ++sentences; ++sentences; cc==stream.read(); stream.read(); }} ++words; ++words; }} Einführung in die Programmierung mit Java }} System.out.println( System.out.println( args[0] args[0]++""besteht bestehtaus:"); aus:"); System.out.println( System.out.println( chars chars++whitespace whitespace ++""Zeichen Zeichen(inkl. (inkl.Leerzeichen)"); Leerzeichen)"); System.out.println(chars System.out.println(chars ++""Zeichen Zeichen(ohne (ohneLeerzeichen)"); Leerzeichen)"); System.out.println(words System.out.println(words ++""Wörtern"); Wörtern"); System.out.println(sentences System.out.println(sentences ++""Sätzen"); Sätzen"); }} }} 71 Universität Bremen Beispiel: Count mit Funktionen Einführung in die Programmierung mit Java 72 Universität Bremen Eval mit Funktionen class classEval Eval {{ static staticdouble[] double[]stack; stack; static int top; static int top; static staticvoid voidinit(int init(intsize) size) {{ stack stack==new newdouble[size]; double[size]; top = 0; top = 0; }} static staticvoid voidpush(double push(doublei)i) {{ stack[top++] stack[top++]==i;i; }} static staticdouble doublepop() pop() {{ return returnstack[--top]; stack[--top]; }} Einführung in die Programmierung mit Java static staticvoid voidmain(String[] main(String[]args) args) {{ init(10); init(10); for(int for(inti i==0;0;i i<<args.length; args.length;++i) ++i) if(args[i].equals("+")) if(args[i].equals("+")) push(pop() push(pop()++pop()); pop()); else elseif(args[i].equals("-")) if(args[i].equals("-")) push(-pop() push(-pop()++pop()); pop()); else elseif(args[i].equals("x")) if(args[i].equals("x")) push(pop() push(pop()**pop()); pop()); else elseif(args[i].equals("/")) if(args[i].equals("/")) push(1.0 push(1.0/ /pop() pop()**pop()); pop()); else else push(Double.parseDouble(args[i])); push(Double.parseDouble(args[i])); System.out.println(pop()); System.out.println(pop()); }} }} 73 Universität Bremen Verbundvariablen Arrays Arrays verbinden mehrere Variablen gleichen Typs zu einem Verbund Auf die einzelnen Elemente kann mit einem Index zugegriffen werden Verbundvariablen Verbundvariablen verbinden mehrere Variablen möglicherweise unterschiedlichen Typs zu einem Verbund Der Zugriff auf die Elemente des Verbunds geschieht über ihren Namen In Java heißt der Typ eines Verbundes Klasse, einzelne Instanzen heißen Objekte Instanzen von Verbundvariablen werden mit new erzeugt Einführung in die Programmierung mit Java vorname vorname Herbert Herbert nachname nachname Pappelbusch Pappelbusch alter alter 35 35 adresse adresse Nirgendwo Nirgendwo 74 Universität Bremen Eval mit Stack-Objekt class classStack Stack {{ double[] double[]stack; stack; int top; int top; }} class classEval Eval {{ static staticStack Stackinit(int init(intsize) size) {{ Stack Stackss==new newStack(); Stack(); s.stack = new double[size]; s.stack = new double[size]; s.top s.top==0;0; return returns;s; }} static staticvoid voidpush(Stack push(Stacks,double s,doublei)i) {{ s.stack[s.top++] s.stack[s.top++]==i;i; }} Einführung in die Programmierung mit Java static staticdouble doublepop(Stack pop(Stacks)s) {{ return returns.stack[--s.top]; s.stack[--s.top]; }} static staticvoid voidmain(String[] main(String[]args) args) {{ Stack Stackstack stack==init(10); init(10); for(int i = 0; i < for(int i = 0; i <args.length; args.length;++i) ++i) if(args[i].equals("+")) if(args[i].equals("+")) push(stack,pop(stack) push(stack,pop(stack)++pop(stack)); pop(stack)); else if(args[i].equals("-")) else if(args[i].equals("-")) push(stack,-pop(stack) push(stack,-pop(stack)++pop(stack)); pop(stack)); ...... else else push(stack,Double.parseDouble(args[i])); push(stack,Double.parseDouble(args[i])); System.out.println(pop(stack)); System.out.println(pop(stack)); }} }} 75 Universität Bremen Klassen Klassen fassen sowohl die Daten als auch die Funktionen, die auf den Daten arbeiten, in Verbund-variablen zusammen Die Instanzen einer Klasse heißen Objekte Funktionen, die Teil einer Klasse sind (also alle in Java), heißen auch Member-Funktionen oder Methoden der Klasse Variablen, die Teil einer Klasse sind, heißen Member-Variablen Auf Objekte kann in Java nur über Referenzen zugegriffen werden Referenzen zeigen immer entweder auf ein Objekt oder sie sind null Einführung in die Programmierung mit Java 76 Universität Bremen Klassenvariablen und -funktionen Klassen können auch Variablen enthalten, die nur einmal existieren und nicht für jedes Objekt getrennt Diese bezeichnet man als Klassenvariablen und erkennt sie am vorangestellten static Auf sie kann auch aus MemberFunktionen zugegriffen werden Ebenfalls können Klassen Funktionen enthalten, die nicht auf Objekten arbeiten, sondern wiederum nur auf Klassenvariablen zugreifen können. Sie beginnen ebenfalls mit static Einführung in die Programmierung mit Java Ausgelieferte Fahrzeuge 77 Universität Bremen Eval mit Stack-Klasse class classStack Stack {{ double[] double[]stack; stack; int top; int top; Stack(int Stack(intsize) size) {{ stack stack==new newdouble[size]; double[size]; top = 0; top = 0; }} void voidpush(double push(doublei)i) {{ stack[top++] stack[top++]==i;i; }} double doublepop() pop() {{ return returnstack[--top]; stack[--top]; }} }} Einführung in die Programmierung mit Java class classEval Eval {{ static staticvoid voidmain(String[] main(String[]args) args) {{ Stack Stackstack stack==new newStack(10); Stack(10); for(int for(inti i==0;0;i i<<args.length; args.length;++i) ++i) if(args[i].equals("+")) if(args[i].equals("+")) stack.push(stack.pop() stack.push(stack.pop()++stack.pop()); stack.pop()); else elseif(args[i].equals("-")) if(args[i].equals("-")) stack.push(-stack.pop() stack.push(-stack.pop()++stack.pop()); stack.pop()); else elseif(args[i].equals("x")) if(args[i].equals("x")) stack.push(stack.pop() stack.push(stack.pop()**stack.pop()); stack.pop()); ...... else else stack.push(Double.parseDouble(args[i])); stack.push(Double.parseDouble(args[i])); System.out.println(stack.pop()); System.out.println(stack.pop()); }} }} 78 Universität Bremen Zugriff auf Klassenelemente Allgemein Der Zugriff ist nur aus demselben Paket erlaubt Jeder Zugriff ist erlaubt private public Ohne Angabe Der Zugriff auf die Member-Variablen und MemberFunktionen einer Klasse kann eingeschränkt werden Hierdurch lässt sich gewährleisten, dass nur die offizielle Schnittstelle der Klasse (die Signatur) von außen benutzt werden kann, so dass die eigentliche Implementierung nachträglich geändert werden kann. Zugriff nur aus derselben Klasse protected Zugriff aus demselben Paket und auch aus abgeleiteten Klassen Einführung in die Programmierung mit Java class classStack Stack {{ private privatedouble[] double[]stack; stack; private int top; private int top; public publicStack(int Stack(intsize) size) {{ stack stack==new newdouble[size]; double[size]; top = 0; top = 0; }} public publicvoid voidpush(double push(doublei)i) {{ stack[top++] stack[top++]==i;i; }} public publicdouble doublepop() pop() {{ return returnstack[--top]; stack[--top]; }} }} 79 Universität Bremen Abstrakte Datentypen und Klassen Einführung in die Programmierung mit Java 80 Universität Bremen Beispiel: Implementierung public publicclass classBinTree BinTree {{ BinTree BinTreeleftBranch,rightBranch; leftBranch,rightBranch; private int private intval; val; boolean isEmpty; boolean isEmpty; public publicBinTree() BinTree(){isEmpty {isEmpty==true;} true;} public publicBinTree(BinTree BinTree(BinTreel,int l,intv,BinTree v,BinTreer)r) {{ leftBranch leftBranch==l;l; val val==v;v; rightBranch rightBranch==r;r; isEmpty isEmpty==false; false; }} public publicboolean booleanempty() empty(){return {returnisEmpty;} isEmpty;} Einführung in die Programmierung mit Java public publicBinTree BinTreeleft() left() {{ if(empty()) if(empty()) error(); error(); return returnleftBranch; leftBranch; }} public publicBinTree BinTreeright() right() {{ if(empty()) if(empty()) error(); error(); return returnrightBranch; rightBranch; }} public publicint intvalue() value() {{ if(empty()) if(empty()) error(); error(); return returnval;} val;} 81 Universität Bremen Beispiel: Implementierung private privatevoid voiderror() error() {{ System.out.println("Zugriff System.out.println("Zugriffauf aufleeren leerenBaum!"); Baum!"); }} static staticpublic publicvoid voidmain(String[] main(String[]args) args) {{ BinTree BinTreeb1 b1==new newBinTree(), BinTree(),b2 b2==new newBinTree(); BinTree(); System.out.println(new System.out.println(newBinTree(b1,42,b2).left() BinTree(b1,42,b2).left()== ==b1); b1); BinTree(b1,42,b2).right() == System.out.println(new System.out.println(new BinTree(b1,42,b2).right() ==b2); b2); BinTree(b1,42,b2).value() == System.out.println(new System.out.println(new BinTree(b1,42,b2).value() ==42); 42); BinTree().empty() == true); System.out.println(new System.out.println(new BinTree().empty() == true); System.out.println(new System.out.println(newBinTree(b1,42,b2).empty() BinTree(b1,42,b2).empty()== ==false); false); System.out.println(new System.out.println(newBinTree().left()); BinTree().left()); }} }} Einführung in die Programmierung mit Java 82 Universität Bremen Der Java-Stack class classfoo foo {{ static staticpublic publicvoid voidmain(String[] main(String[]args) args) {{ int inti i==1,j 1,j==2;2; int intkk==fun1(i,j); fun1(i,j); }} static staticpublic publicint intfun1(int fun1(inta,int a,intb) b) {{ bool boolx;x; return returnaa**b;b; }} }} Parameter Parametervon vonmain(...) main(...) MM Rücksprungadresse Rücksprungadresse zum zumStartup-Code Startup-Code Lokale LokaleVariablen Variablenvon vonmain main MM Parameter Parametervon vonfun1(...) fun1(...) MM Rücksprungadresse Rücksprungadresse zum zumAufruf Aufrufaus ausmain() main() Lokale LokaleVariablen Variablenvon vonfun1 fun1 MM Einführung in die Programmierung mit Java 83 Universität Bremen Der Java-Heap Stack Heap M boolean b true "Hallo" BinTree int i 42 int val 0 String s BinTree right null BinTree t M boolean isEmpty boolean b = true; int i = 42; String s = "Hallo"; left null true BinTree left int val 17 BinTree right null boolean isEmpty false M BinTree t = new BinTree(new BinTree(),17,null); Einführung in die Programmierung mit Java 84 Universität Bremen Arrays Stack Heap M int length 3 int[] a 17 42 15 int[][] b M int length 3 int[.] a = {17,42,15}; int[.][.] b = new int[3][.]; b[0] = new int[6]; b[1] = new int[.] {1,24}; b[0][0] = 29; ... Einführung in die Programmierung mit Java null int length 6 29 -42 0 38 34 7 int length 2 1 24 M 85 Universität Bremen Zuweisungen Stack Heap M int i 42 int j 17 Value v Value w M class Value {int value;} int i = 42, j = 17; Value v = new Value(); Value w = new Value(); v.value = 42; w.value = 17; i = j; v = w; w.value = 19; System.out.println(v.value); Einführung in die Programmierung mit Java int value 42 int value M 17 Stack M int i 17 int j 17 Value v Value w M 86 19 Universität Bremen Funktionsaufrufe Stack Heap M int i Value v M int value 17 42 42 M Stack static public void fun(int j, Value w) {w.value = j; j = 63;} ... int i = 42; Value v = new Value(); v.value = 17; fun(i,v); System.out.println(i + " " + v.value); Einführung in die Programmierung mit Java M int i Value v int j 42 42 Value w M Rücksprungadresse 87 63 Universität Bremen Beispiel: Zahlen austauschen class classValue Value {{ int intvalue; value; }} class classSwap Swap {{ static staticvoid voidmain(String[] main(String[]args) args) {{ Value Valueaa==new newValue(), Value(),bb==new newValue(); Value(); a.value = 17; b.value = 42; a.value = 17; b.value = 42; swap1(a.value,b.value); swap1(a.value,b.value); System.out.println(a.value System.out.println(a.value++",",""++b.value); b.value); swap2(a,b); swap2(a,b); System.out.println(a.value System.out.println(a.value++",",""++b.value); b.value); swap3(a,b); swap3(a,b); System.out.println(a.value System.out.println(a.value++",",""++b.value); b.value); }} Einführung in die Programmierung mit Java static staticvoid voidswap3(Value swap3(Valuea,Value a,Valueb) b) {{ int intt t==a.value; a.value; a.value a.value==b.value; b.value; b.value = t; b.value = t; }} static staticvoid voidswap1(int swap1(inta,int a,intb) b) {{ int intt t==a;a; aa==b;b; bb==t;t; }} static staticvoid voidswap2(Value swap2(Valuea,Value a,Valueb) b) {{ Value Valuet t==a;a; aa==b;b; bb==t;t; }} }} 88 Universität Bremen Beispiel: Zahlen austauschen Stack M int a 17 int b M 42 swap1 Heap Stack int value 17 int value M 42 M Value a Value b M swap2 Einführung in die Programmierung mit Java 89 swap3 Universität Bremen Strings: Suchen und Ersetzen import importjava.io.*; java.io.*; class classReplace Replace {{ static staticString Stringread(String read(Stringfile) file)throws throws FileNotFoundException, IOException FileNotFoundException, IOException {{ String Stringtext text==""; ""; FileInputStream FileInputStreamstream stream== new newFileInputStream(file); FileInputStream(file); int c = stream.read(); int c = stream.read(); while(c while(c!= !=-1) -1) {{ text text+= +=(char) (char)c;c; cc==stream.read(); stream.read(); }} return returntext; text; }} Einführung in die Programmierung mit Java static staticString Stringreplace(String replace(Stringtext, text, String searchText,String replaceText) String searchText,String replaceText) {{ int intpos pos==text.indexOf(searchText); text.indexOf(searchText); while(pos while(pos!= !=-1) -1) {{ text text==text.substring(0,pos) text.substring(0,pos)++ replaceText replaceText++ text.substring(pos text.substring(pos++searchText.length()); searchText.length()); pos = text.indexOf(searchText,pos+ pos = text.indexOf(searchText,pos+ replaceText.length()); replaceText.length()); }} return returntext;} text;} substring substringliefert lieferteinen einenTeilbereich Teilbereichdes desStrings Strings indexOf indexOfsucht suchtnach nachdem demersten erstenVorkommen Vorkommen des desSuch-Strings Such-Stringsab abder derStartposition Startposition 90 Universität Bremen Strings: Suchen und Ersetzen static staticvoid voidmain(String[] main(String[]args) args)throws throwsFileNotFoundException, FileNotFoundException, IOException IOException {{ String Stringtext text==read(args[0]); read(args[0]); for(int for(inti i==1;1;i i<<args.length; args.length;i i+= +=2) 2) text text==replace(text,args[i],args[i+1]); replace(text,args[i],args[i+1]); System.out.print(text); System.out.print(text); }} }} Einführung in die Programmierung mit Java 91 Universität Bremen Beispiel: Suchen und Ersetzen Einführung in die Programmierung mit Java 92 Universität Bremen Übungsaufgabe Aufgabe Beispiel Umwandlung von ganzen Zahlen in die deutsche Sprache >java IntToGerman 30123511 dreißigmillioneneinhundertdreiundzwanzigtausendfünfhundertelf > Tipps Zahlen kann man mit Ganzzahldivision und Modulo zerlegen Viele Texte kann man in String-Arrays ablegen ("zwei", "zwölf", "sechzig") Manche Teile kann man mehrmals nutzen, daher sollte man Funktionen verwenden Einführung in die Programmierung mit Java 93