Was ist Java ? Eine objektorientierte Programmiersprache Eine Sprache mit einer umfangreichen Klassen Bibliothek Eine portable Sprache, die auf der „Java Virtual Machine“ läuft und daher unabhängig vom Betriebssystem ist Sprache des WWW Portabilität Alle Java Applikationen laufen auf der Virtual Java Machine egal auf welchem System Anstelle eines „exe“-Files werden Java „class“-Files in Bytecode generiert Javaumgebung (Interpreter) Java Virtual Machine Entwicklungsgeschichte von Java 1991 – „Green-Team“ entwickelt oo-Sprache „Oak“ für elektr. Geräte 1993 als der erste Mosaic Browser herauskam, beauftragte Sun das Green Team zur Weiterentwicklung von „Oak“ 1995 wurde „Oak“ auf „Java“ umbenannt 1994 – entstand der neue Web Browser HotJava von Sun in Java Entwicklungsgeschichte von Java 1996 – Java Developer Kit 1.0 von Sun AWT (Abstract Window Toolkit) JDBC FEHLER!! Beschränktes Datum, keine Umlaute... 1997 – JDK 1.1 kommerziell verwendbar Neue Security Features –Zugriff auf lokale Ressourcen z.B. Filesystem oder Drucker Swing existierte als eigene Library Entwicklungsgeschichte von Java 1998 – JDK 1.2 (besser bekannt unter Java 2 Plattform) Micro Edition für embedded devices Standard edition Java Foundation classes (includieren drag&drop, Swings, Accessibility APIs für Behinderte) Enterprise Edition(Java Enterprise Edition) JNDI(Java Naming and Directory Interface) zum Ansprechen eines LDAP (lightweight Directory Access Protocoll Servers) LDAP Server gibt es von Netscape, Oracle und z.B. Siemens und dienen zu Authentifizierung JTI Java Transaction Interface – garantiert, dass Programme vollständig oder gar nicht ausgeführt wird (Transaktionssicherheit) EnterpriseJava Beans java basierender Standard für Komponentenmodell (Kooperation verteilter systeme, Transaktionssicherheit...) Es gibtJava Application server, die diesen Standard erfüllen – z.B. BEA Weblogic Entwicklungsumgebungen IBM‘s VisualAge for Java Microsofts J++ Inprises Jbuilder Symantecs VisualCafe Suns Java Workshop Suns Forte Erhältlichkeit Public domain tool, erhältlich bei www.java.sun.com/ Oder www.javasoft.com/ Erst für den kommerziellen Gebrauch müssen Lizenzen gekauft werden JavaScript, Applikationen und Applets Java Scripts ist eine Programmiersprache, die in HTML Dokumenten verwendet wird – hat NICHTS zu tun mit Java Applikationen – standalone Programme Applets – Java Programme, die nur in einem javafähigen Browser oder dem Appletviewer laufen können Java Developers‘ Kit javac – der Compiler java – Virtuelle Java Maschine jdb – Java Debugger jar – Archivierungstool javah – ermöglicht Integration mit CSourcefiles (die Platformunabhängigkeit geht dabei natürlich verloren!) javap - Disassembler javadoc – kreiert HTML Code aus *.class-Files appletviewer – zum Testen von Applets außerhalb des Browsers Programmierumgebung Änderung des auoexec.bat Files unter Windows 95 oder Windows 98 Für Windows NT setzen der environment Variablen (ControlPanel – System – Environment Folder) Programmierumgebung SET CLASSPATH=.;C\java\lib\tools.jar SET PATH=C:\ java \bin SET HOMEDRIVE=c: SET HOMEPATH=\ java SET JAVA_HOME=C:\ java Keine Leerzeichen zwischen den Directoryangaben!!! Erstes Programm public class Hello { public static void main (String argv[]) { System.out.println („Hello World“); } } Compilieren und Ausführen in einem MS-DOS Fenster Speichern des Files als „Hello.java“ – ACHTUNG – der Filename muß gleich sein mit dem Klassennamen (Achten auf Groß- und Kleinschreibung !!!) Compilieren : > javac Hello.java Ausführen: > java Hello (Hier wird keine Fileextension angegeben !!!) Debuggen Hierbei wird nicht die Virtuelle Java Maschine verwendet; der Byte Code der *.class files wird vom Debugger selbst (jdb) ausgeführt Das TCP/IP Netwerkservice muß laufen! Debugger Beispiel public class Test { public static void main(String args[]) { Test einObjekt = new Test(); einObject.dividiere(2,0) } public void dividiere (int a, int b) { int iErgebnis=0; ergebnis=a/b; System.out.println(iErgebnis); } } Debuggen mit jdb Kompilieren mit „–g“ Option: > javac –g Test.java Aufruf des Debuggers > jdb Test Setzen des Breakpoints > stop in test.dividiere Debugger laufen lassen > run Der jdb Debugger run Startet das Programm run class Startet angegebene Klasse load class Ladet eine Klasse gc Initiiert eine Garbage Collection exit (quit) Beendet jdb !! Startet letzten Befehl Jdb - Befehle stop in class.method Breakpoint in einer stop in class:line Breakpoint in einem File clear class.method Breakpoint in methode Methode setzen setzen entfernen clear class:line Breakpoint in file entfernen step ausführen der nächsten Zeile cont nach Breakpoint fortfahren Jdb - Befehle dump Gibt Informationen über Objekte und Variableninhalte help (?) Listet alle möglichen Debuggerbefehle list line Listet den Fileinhalt mit Zeilenzahlen locals Gibt Variablen samt Inhalt aus memory Gibt Informationen über das Ausmaß der Speicherbelegung print Gibt Informationen über Objekte und Variablen threads Listet alle laufenden Threads where Gibt an bis wohin der Debugger das Programm abgearbeitet hat Programmausführung ohne Debugger Programmausführung mit Debugger Klassendefinition Gültigkeitsbereich_der_Klasse class Klassenname extends Superklasse { ... } Jedes Object in Java ist von der Klasse Object abgeleitet! Gültigkeitsbereich_der_Klasse public – jeder kann auf diese Klasse zugreifen (pro File kann es nur 1 public Klasse geben!) kein Zugriffsmode – die Klasse ist nur im aktuellen Package verfügbar Package Sinn eines Package ist es Klassen zu vereinigen, die nicht in nur einem File sind, denn pro File kann es nur eine public Klasse geben, deren Namen mit dem Filenamen ident ist Dienen zur Datenkapselung Packagedeklaration Am Fileanfang: package Package_Name Jedes File des Package hat diesen Eintrag am Fileanfang. Sagt aus, daß die Packagefiles im Direktory Package_Name stehen. Packagedeklaration Das „Package Directory“ ist relativ zum CLASSPATH . Ist der CLASSPATH z.B. C:\jdk1.2\Pfad, so befinden sich die Files des Package in C:\jdk1.2\Pfad\Package_Name. Bei komplexerer Direktorystruktur, in der mehrere Packages gespeichert werden, werden die Directorypfade entsprechend länger. Files des Package test.daten wären dann im Directory C:\jdk1.2\Pfad\test\daten Zugriff auf Packageelemente public class MyPanel extends java.awt.Panel oder import java.awt.Panel; public class MyPanel extends Panel Zugriff auf alle Elemente eines Package (kann sich auf Kompilierzeit auswirken !!): import java.awt.*; ACHTUNG – Zugriff auf mehrere Packages (import java.*.*;) ist nicht möglich!! Beispiel einer Klasse public class Angestellter extends Object { public static int iMaxgehalt=30000; public int iGehalt=10000; private int iAlter=20; public String strName=„Meier“ } Schaffen einer Instanz Verwendung eines Konstruktors zum Kreieren einer Instanz Befehl new Konstruktor Ist eine Methode der Klasse Aussehen: Gültigkeitsbereich class Klassenname { Klassenname (Parameter) { Befehle } } Gültigkeitsbereich public – jeder kann den Konstruktor der Klasse protected – der Konstruktor kann nur von Klassen aufrufen vom gleichen Package oder von Subklassen außerhalb des Packages aufgerufen werden private – der Konstruktor kann nur von der Klasse selbst aufgerufen werden (z.B. Im: public void main(String[] args) kein Zugriffsmode – der Konstruktor kann nur vom aktuellen Package aus aufgerufen werden Konstruktor Beispiel public class Konto { private double kontostand=0.0; private String name=””; Konto(double einGeld, String einePerson){ kontostand=einGeld; name=einePerson; } Konto() { kontostand=0; name=“Anonym“; } ... } Der Defaultkonstruktor Klassenname(){} Muß nicht unbedingt in einer Klasse angegeben werden, da jede Klasse automatisch eine Subklasse von Object ist und den Defaultkonstruktor übernimmt Außnahme ist eine abgeleitete Klasse!! Hat eine Klasse eine Subklasse, so muss die Superklasse einen Defaultkonstruktor zur Verfügung stellen!! Verwendung von new Konto anonym = new Konto(); Konto vom_Meier = new Konto(50,“Meier“); Methoden Definition Gültigkeitsbereich_der_Methode Returntyp Name (Argumente){ Lokale Variablen Befehle ..... } Gültigkeitsbereich der Methode public – jeder kann auf diese Methode/Variable zugreifen (bei public Methoden oder Variablen muß auch die Klasse public sein!!) protected – auf diese Methoden/Variablen kann nur vom gleichen Package zugegriffen werden oder von Subklassen außerhalb des Package private – auf diese Methoden/Variablen kann nur die Klasse selbst zugreifen (nicht einmal Subklassen) kein Zugriffsmode – ist nur im aktuellen Package verfügbar Aufruf von Methoden Returnwert=Instanzname.Methodenname(Argumente); Wird die Methode nicht in der Klasse gefunden, so wird sie in der Superklasse gesucht. Ist sie dort nicht zu finden wird sie in der nächstenSuperklasse gesucht .... Bis zur letzten Superklasse (=Klasse Object) YoYo-Effekt: Eine Methode wird in einer Superklasse gefunden und ruft wieder eine Methode auf, die nicht in der Klasse sondern der Superklasse gefunden wird... return-Operator wird verwendet wie in C z.B. int x=5; return x; Kommentare Kommentarblöcke, die mit den Zeichen /* beginnen und mit den Zeichen */ enden Kommentarblöcke, die mit den Zeichen /** beginnen und mit den Zeichen */ enden (diese werden vom Dokumentgenerator javadoc für die Dokumentation verwendet) Oder // für einzelne Zeilen Achtung es gibt kein ineinander Schachteln von Kommentaren - als Ende gilt immer das nächste */ Zeichenpaar!! Beispiel eines falschen Kommentars /* x = 12 * 4; /* Berechnung von y */ y = x + 2; */ Garbage Collection Prozess für Speichermanagement - macht ungebrauchten Speicherplatz wieder verfügbar Läuft in eigenem Thread in der JVM Kann auch explizit im Programm aufgerufen werden: Runtime.getRuntime().gc() Runtime.getRuntime().runFinalization(); System.runFinalization(); System.gc(); Vorteile des GCs Es gibt keine Pointer, so wie in C++, sondern der Speicherplatz wird von der JVM verwaltet d.h. keine Probleme bei Pointeränderungen oder Speicherallokierung keine Probleme mit Speicherplatz, der obwohl er nicht mehr verwendet wird nicht wieder freigegeben wurde Definition der finalize-Methode protected void finalize() throws Throwable { … super.finalize(); } Namenskonventionen Alle Namen bestehen aus Groß- und Kleinbuchstaben und Ziffern Namen von Klassen und Interfaces beginnen mit einem Großbuchstaben. Beispiel: HalloWorld Namen von Konstanten beginnen mit einem Großbuchstaben und bestehen nur aus Großbuchstaben, Ziffern und Underlines. Beispiel: MAX_SPEED. Alle anderen Namen (Attribute, Methoden, Instanzen, Packages etc.) beginnen mit einem Kleinbuchstaben und bestehen aus Groß- und Kleinbuchstaben und Ziffern. Beispiel: getSize(). Reservierte Wörter abstract, boolean, break, byte, case, catch, char, class, const, continue, default, do, double, else, extends, false, final, finally, float, for, generic, goto, if, implements, import, instanceof, int, interface, long, native, new, null, package, private, protected, public, return, short, static, super, switch, synchronized, this, throw, throws, transient, true, try, void, volatile, while Datentypen Primitive oder elementare Datentypen: Gleitkomma-Zahlen: float, double ganze Zahlen: byte, short, int, long Logischer Typ (true oder false): boolean Zeichen (Unicode, Zahlenwert ohne Vorzeichen): char Objekt-Typen: Zeichenketten (Unicode): String sowie alle anderen als Klassen definierten Typen Primitive Datentypen Typname boolean byte char short int long float double Inhalt true oder false Ganzzahl mit Vorzeichen Unicode Zeichen Ganzzahl mit Vorzeichen Ganzzahl mit Vorzeichen Ganzzahl mit Vorzeichen Fließkommazahl Fließkommazahl Defaultwert false 0 \u0000 0 0 0 0,0 0,0 Bitanzahl 1 8 16 16 32 64 32 64 Bereichsgrenzen -128 bis 127 \u0000 bis \uFFFF -32768 bis 32767 ~ -2E9 bis 2E9 ~ -9E18 bis 9E18 +/-3.4E+38 bis +/-1.4E-45 +/-1.8E+308 bis +/-4.9E-324 Zahlen Konstante (Literale) haben standardmäßig den Typ int und werden dezimal interpretiert. Den Typ long kann man durch Anhängen von L erzeugen. Oktale Zahlen beginnen mit 0 (Null), hexadezimale mit 0x. Gleitpunktliterale haben den Typ double. Den Typ float kann man durch Anhängen von F erzeugen. Bei float und double ist die Angabe von E für den Exponenten möglich. z.B.: short i; i=-1234; int i; i=-1234; long i; i=-1234L; float x; x=-123.45F; x=1.0E-23F; double x; x=-123.45; x=1.0E-23; Wrapper Klassen für primitive Datentypen Integer für int Umwandlung einer Integer in einer int mit Hilfe der int Memberfunktion intValue() von Integer Kreieren eines Integer aus einer int mit Hilfe des Konstruktors Integer(int value) Float für float Umwandlung einer Float in einer float mit Hilfe der int Memberfunktion floatValue() von Float Kreieren eines Float aus einer float mit Hilfe des Konstruktors Float(float value) Wrapper Klassen für primitive Datentypen Short für short Long für long Short (short value) short shortValue() Long (long value) long longValue() Double für double Double (double value) double double Value() Wrapper Klassen für primitive Datentypen Boolean für boolean Byte für byte Boolean (boolean value) boolean booleanValue() Byte (byte value) byte byteValue() Character für char Character(char c) char charValue() Arithmetische Operationen + * / % Addition Subtraktion Multiplikation Division Rest Mathematische Funktionen von der Klasse MATH Annahme double x,y; Max Maximum Min Minimum Ceil Aufrunden Floor Abrunden Round Runden Sqrt Wurzel Abs Absolutbetrag Pow x hoch y Random Zufallszahl double double double double double double double double double d=Math.max(x,y); d=Math.min(x,y); d=Math.ceil(x); d=Math.floor(x); d=Math.round(x); d=Math.sqrt(x); d=Math.abs(y); d=Math.pow(x,y); d=Math.random(); Der Typ boolean und Vergleichoperatoren Beispiel Vergleichsoperatoren boolean b; b=true; b=false; == < > != <= >= gleich kleiner als größer als ungleich kleiner gleich größer gleich && logisches „und“ || logisches „oder“ Characters Im Programm: char c; c='A'; c=‘\u000c‘; Achtung: “a” ist kein Character, denn zwischen doppelten Hochkommas stehen nur Strings Strings Im Programm: String s; s="Abc"; s=null; s=“heute “+“und morgen“; String ist die einzige Klasse von der eine Instanz nicht mit new erzeugt werden muß Methoden der String Klasse Welche Länge hat String str? int len=str.length(); Zusammenfügen von mehreren Strings: String neu=str1 + “ “+str2; Methoden der String Klasse String str und String aString gleich? boolean b=str.equals(String aString); Sind String str und String aString gleich (ohne auf Groß/Kleinschreibung zu achten)? boolean b=str. equalsIgnoreCase(String aString); Welcher Character steht an der Stelle index von String str? char c=str.charAt(int index); Methoden der String Klasse Liefert den Substring aString zwischen den Indices a und b zurück String aString=str.substring(int a, int b); Gibt den String in Großbuchstaben zurück String aString=str.toUpperCase( b); An welcher Stelle des Strings str kommt der Characterwert c zuerst vor? (bei nicht Vorhandensein liefert die Funktion –1 zurück) int Stelle=str.indexOf(c); Gibt den String in Kleinbuchstaben zurück String aString=str.toLowerCase( b); Methoden der String Klasse ACHTUNG!! Es gibt schon die Abfrage (string1== string2) nur wird hier die Referenz und nicht der Inhalt der String verglichen!! Man muß für den Inhaltsvergleich daher die Methode boolean b=str.equals(String aString);wählen. String Umwandlungen Umwandlung von Strings, die Ziffern enthalten, in entsprechende Zahlenwerte Integer.parseInt(String) Long.parseLong(String) Float.valueOf(String).floatValue() Double.valueOf(String).doubleValue() Umwandlung von Zahlen in Strings int long float double String s = String.valueOf(zahl); oder String s = "" + zahl; Gültigkeitsbereich von temporären Variablen Variablen können an beliebiger Stelle des Programms deklariert werden. Je nachdem sind sie gültig in: Einer Methode Einem Konstrukt if –Befehl if(Bedingung){ ... } else { ... } Conditional Operator Teste Bedingung ? true … : false … z.B. i>k ? System.out.println(i) : System.out.println(k); oder x=m>=n?m:n; System.out.print-Befehl Schreibt auf Standard Output. Der Buffer sollte aber mit System.out.println() oder System.out.flush() geleert werden. switch Befehl switch (Ausdruck) { case label1: ... break; case label2: ... break; ... default: … } Beispiel für switch-Befehl switch (n) { case 0: System.out.println(“Leider nicht!”); break; case 1: System.out.println(“Volltreffer!“); break; default: System.out.println(“Zuviel!”;) } for-Schleife for (ursprünglicher Wert; Test; Werterhöhung) Befehl; bzw. for (ursprünglicher Wert; Test; Werterhöhung) { … } Beispiel für for-Schleife for (int i=0; i<5; i++) System.out.println(n); while-Schleife while (Test) Befehl; Bzw. while(Test) { … } Beispiel für while-Schleife int n=1; while (n<5) { System.out.println(n); n++; } do-Schleife do { … } while (Test); z.B. int n=5; do { System.out.println(n); n--; } while (n>0); Rekursionen public class Faktorielle{ public static void main(String argv[]){ Faktorielle f=new Faktorielle(); System.out.println(f.Faktorielle(5)); } public int Faktorielle (int zahl) { System.out.println(zahl); if(zahl==1) return 1; else return zahl*Faktorielle(--zahl); } } Übungsbeispiel Programmieren Sie das Beispiel zur Berechnung der Faktoriellen um. Es sollen dabei die Rekursionen durch entsprechende Konstrukte (if, while, for, switch, do-Schleife, Conditional Operator ....?!) ersetzt werden. Vererbung (inheritance) wird durch das Schlüsselwort extend realisiert -z.B.: public class Student extends Person{ private String subject=”EDV”; public String getSubject(){ return subject; } } Vererbung (Überschreiben von Attributen) ACHTUNG!! auf private Attribute kann die Subklasse nicht zugreifen, daher muss die Superklasse public Methoden zum Zugriff auf diese Attribute zur Verfügung! Konstruktor der Subklasse Der Konstruktor der Superklasse kann von der Basisklasse übernommen werden: super() oder super(Argument) je nach Angabe von Argumenten wird der entsprechende Konstruktor der Superklasse verwendet Konstruktor der Klasse selbst Es kann auch ein Konstruktor (aber NICHT mehrere!!) der Subklasse selbst verwendet werden: Beispiel: public class Person { int dasAlter; String einName; Person() { einName=„“; } Person(int alt) { this.Person(); this.dasAlter=alt; } Vererbungsbeispiel class Person{ private String Name; Person(){ Name=""; } Person(String aName){ Name=aName; } public void setName(String aName){ Name=aName; } public String getName(){ return Name; } } Vererbungsbeispiel public class Student extends Person{ private String Titel; public static void main(String args[]){ Student hans= new Student("Hans", "Dr"); Person tim = new Person("Tim"); System.out.println(hans.getName()); System.out.println(tim.getName()); } Student(String aName, String aTitle){ super.setName(aName); Titel=aTitle; } public String getName(){ return Titel+super.getName(); } } final public final class LaserPrinter extends Printer Verhindert das Kreieren von Subklassen der Klasse “LaserPrint” public final int maxSpeicher=128; Die Variable maxSpeicher kann nicht verändert werden public final void hallo(); Die Mehtode “hallo()” kann in einer Subklasse nicht überschrieben werden Variablen und Methoden von Klassen Sind für alle Instanzen der Klasse gleich Wird eine Klassenvariable z.B. von einer Instanz verändert, so betrifft diese Änderungen natürlich auch alle anderen Instanzen Klassenvariablen/Methoden werden in der Klasse mit dem Wort static gekennzeichnet Z.B. public static void main(String args[]) { ... } Beispiel von statischen Variablen und Methoden public class St { public static int counter=0; public static void main(String args[]) { } St s =new st(); St t =new st(); St u =new st(); St() { } } counter++; System.out.println(counter); Statische Variablen/Methoden Man braucht keine Instanz um statische Variablen/Methoden einer Klasse aufzurufen Beispiel: Klassendefinition public class Chair { static int i; .... } Verwendung: Chair.i=5; Überschreiben von statischen Methoden Eine Subklasse kann eine statischen Methoden der Superklasse nicht überschreiben D.h.: Hat die Superklasse die Mehtode static int myMehtod(), so kann die Subklasse diese nicht mit der Methode int myMethod() überschreiben Die Subklasse kann eine Klassenmethode mit demselben Namen haben, nicht aber eine Instanzmethode D.h., daß die Subklasse die Klassenmethode static int myMehtod() sehr wohl zur Verfügung stellen kann Übungsbeispiel Definieren sie eine Superklasse Person mit den privaten Attributen: Alter, Name, Land und der und dem Klassenattribut AnzahlDerPersonen insgesamt.Die Klasse soll eine Defaultkonstruktor und einen Konstruktor mit dem Namen haben Definieren sie eine Klasse Student als Subklasse von Person mit dem privaten Attribut Fachrichtung und dem Klassenattribut AnzahlDerStudenten. Die Klasse soll eine Defaultkonstruktor und einen Konstruktor mit dem Personennamen haben Testen Sie die beiden Klassen, indem sie 3 Personen und 2 Studenten instanzieren und die Anzahl der Personen/bzw. Studenten anzeigen Vergessen Sie nicht eine Methoden zur Verfügung zu stellen, sodaß eine Instanz der Klasse Student auch auf das private Attibut Name der Klasse Person zugreifen kann! Abstrakte Klasse Von abstrakten Klassen kann man keine Objekte erzeugen, sondern nur Subklassen Es fehlt meist die Funktionalität ein oder mehrer Methoden, die in den Subklassen definiert werden müssen Sie dienen zum Zusammenfassen von Objektgruppen mit ähnlicher Funktion Beispiel für abstrakte Klasse public abstract class Auto { public double Benzin=5; private boolean faehrt=false; public void starten(){ faehrt=true; verbraucheBenzin(); while(Benzin>0) verbraucheBenzin(); } abstract void verbraucheBenzin(); } Beispiel für eine Subklasse einer abstrakten Klasse public class VW extends Auto { public static void main(String args[]){ VW p=new VW(); p.starten(); } public void verbraucheBenzin(){ Benzin=Benzin-1; System.out.println(Benzin); } } Beispiel für eine Subklasse einer abstrakten Klasse public class Audi extends Auto { public static void main(String args[]){ Audi p=new Audi(); p.starten(); } public void verbraucheBenzin(){ Benzin=Benzin-0.5; System.out.println(Benzin); } } Casting auf abstrakte Klassen Man kann zwar keine Instanz eine abstrakten Klasse erzeugen, aber man kann eine Subklasse auf eine abstrakte Klasse casten. Z.B.: Superkl superKlasse; Subkl subKlasse=new SubKl(); superKlasse=subKlasse; Übungsbeispiel Geben Sie eine abstrakte Klasse Person an, mit den privaten Attributen Name und Land, den entsprechenden Zugriffsmethoden und einer abstrakten Methode Hallo. Die Klasse soll einen Defaultkonstruktor und einen Konstruktor mit dem Namen haben. Leiten sie von der abstrakten Klasse eine Klasse Englaender ab, die in der Methode Hallo den String „Hi there!!“ ausgibt. Die Klasse soll eine Defaultkonstruktor und einen Konstruktor mit dem Namen haben. Leiten sie von der abstrakten Klasse eine Klasse Oesterreicher ab, die in der Methode Hallo den String „Hallo Ihr ...!!“ ausgibt. Die Klasse soll eine Defaultkonstruktor und einen Konstruktor mit dem Namen haben. Testen Sie die Klasse mit dem Engländern Tom und Tim und den Österreichern Franz und Hans interface Klasse Gibt hauptsächlich den Aufbau einer Klasse an ohne irgendeine Funktionalität Es definiert nur die Methoden (return-Wert, Argumente und deren Typ) und konstante Klassenvariablen Methoden sind per default abstract, da sie nicht implementiert werden. Deshalb müssen Methoden auch nicht explicit als abstract definiert werden ACHTUNG!! Es kann keine statischen Methoden geben! Beispiel einer interface Klasse public interface Kalender{ public final static int Kalendererstelljahr=2000; public abstract void eingeben(String termin, Date date); public abstract String abfragen(Date date); public abstract String abfragen(Date termin); public abstract void loeschen(String string); } Interface Klasse Hauptverwendung: Mehrfachvererbung public interface Motorrad extends KFZ, Zweirad { ... } public class MyMotorrad implements Motorrad { ... } Bzw.: public class MyMotorrad implements KFZ, Zweirad { ... } Unterschiede zwischen abstrakter Klasse und Interface Interface stellt per Definition keine Funktionalität zur Verfügung – abstrakte Klasse kann eine Funktionalität zur Verfügung stellen Eine Klasse kann mehrere Interfaces implementierten, nicht aber von mehreren Klassen erben Ein Interface kann ein oder mehrere Interfaces erweitern. Eine Klasse kann Interfaces nicht erweitern, sondern nur (mit Funktionalität) „ausfüllen“ Die Klasse Vector Dient zum Speichern einer verketteten Liste Die gespeicheten Objekte müssen nicht von derselben Klasse sein, sondern nur von Object abgeleitet Zu finden im Package java.util.Vector Konstruktoren für Vector Vector() – kreiert default Vector mit der Größe Vector(Größe) – kreiert Vektor mit der Größe Vector(Größe, n) - kreiert Vektor mit der 10 „Größe“ Größe „Größe“, der bei Überschreitung der angegebenen Größe Platz für weitere n Elemente allokiert ACHTUNG!! Ist die Länge des Vectors n, so laufen Indices n-1. Befehle des Vectors clone() – kopiert Vector contains (Object object) – schaut ob der Vector das Object enthält Elemente hinzufügen addElement (Object object) – fügt ein Element ans insertElementAt(Object object, int Index) – fügt ein setElementAt(Object object, int index) – gibt Objekt Ende des Vectors an Element an die Stelle Index ein an die angegebene Stelle und überschreibt dabei das vorhandene Objekt Befehle des Vectors Elemente suchen lastElement() – gibt letztes Element zurück elementAt(int Index) – gibt Objekt das an der angegebenen Stelle steht zurück firstElement() – gibt erstes Objekt zurück indexOf(Object object) – gibt die Position des ersten Elements an, das mit dem angegebenen Objekt übereinstimmt (nicht vorhanden => –1) indexOf(Object object, int index) – gibt die Position des ersten Elements an, das mit dem angegebenen Objekt übereinstimmt – die Suche nach dem Objekt beginnt bei der angegebene Indexstelle (nicht vorhanden => –1) Befehle des Vectors lastIndexOf(Object object, int index) – gibt die Position des letzten Elements an, das mit dem angegebenen Objekt übereinstimmt – die Suche nach dem Objekt beginnt der angegebene Indexstelle (nicht vorhanden => –1) empty() – gibt an ob Vector leer ist Elemente entfernen removeElement(Object object) – löscht das erste Vorkommnis des angegebenen Elements removeElementAt(int indesx) – löscht Element an angegebener Stelle removeAllElement() – entfernt alle Elemente aus dem Vector Befehle für Vektorhandhabung capacity() – gibt die Anzahl der allokierten Elemente des ensureCapacity(int minCap) – vergrößert allokierten Platz Vectors an im Vector auf „minCap“. Falls der Vector bereits größer ist, wird der Befehl ignoriert setSize(int Größe) – setzt die Vectorgröße auf die angegebene Größe. Falls der Vector kleiner ist, wird er mit leeren Referenzen (null) angefüllt, ist er größer werden die überschüssigen Objekte gelöscht size() – gibt die Anzahl der Elemente im Vector an trimSize() – paßt die Größe des Vectors auf die aktuelle Größe an und gibt somit unnötig allokierten Speicherplatz frei Array-Deklaration Deklaration einer Variablen, die eine Referenz auf ein Array enthalten kann: Anlegen eines Arrays von n Elementen dieses Typs und Zuweisung der Referenz auf dieses Array an die Referenz-Variable: typ[ ] name; name = new typ [n]; Deklaration und Anlegen in einem: typ[ ] name = new typ [n]; ACHTUNG!! Ist die Länge des Arrays n, so laufen die Indizes von 0 bis n-1. Array-Wertzuweisung Zuweisen von Werten zu den Arrayelementen: Die Länge eines Arrays erhält man mit for (int i=0; i<name.length; i++) { name[i] = wert; } name.length Deklaration, Anlegen und Zuweisung von Anfangswerten in einem: int[] daysPerMonth = { 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31 }; String[] weekDay = { "So", "Mo", "Di", "Mi", "Do", "Fr", "Sa" }; Array für Objekte und mehrdimensionale Array Array von Objekten Classname[ ] name = new Classname [n]; for (int i=0; i<name.length; i++) { } name[i] = new Classname(); Zweidimensionales Array der Größe n mal m typ[ ][ ] name = new typ [n][ m]; z.B.: float[][] a3=new float[3][7]; Weitere Klassenbeispiele Stack Klasse Queue Klasse Hashtable Die Klasse Hashtable Dient zum Speichern eines Hashtables (das ist eine Datenstruktur, die ein Objekt zusammen mit einem Schüssel speichert) Die gespeicheten Objekte müssen nicht von derselben Klasse sein, sondern nur von Object abgeleitet Zu finden im Package java.util.Hashtable Konstruktoren von Hashtable Hashtable() – kreiert default Hashtable mit der Größe 101 Hashtable(Größe) – kreiert Hashtable mit der Größe „Größe“ - der „load factor“ (also jene Größe, bei der der Hashtable neu aufgebaut wird) ist in diesem Fall 75% der Größe Hashtable(Größe, loadFactor) - kreiert Vektor mit der Größe „Größe“, und dem „load factor“ loadfactor Befehle des Hashtable clear() – löscht den Hashtable clone() – kopiert Hashtable contains (Object aValue) – schaut ob der containsKey(Object aValue) – schaut ob der Hashtable das Objekt enthält Hashtable den Schlüssel enthält toString() – gibt Objekte und Schlüssel des Hashtable in einem String zurück rehash() –Hashtable wird neu aufgebaut Beispiel für einen Hashtable import java.util.Hashtable; public class Hash { public static void main(String args[]){ Hash h=new Hash (); h.Hash(); } public void Hash(){ Hashtable x=new Hashtable(); x.put("jjh","John"); x.put("msw","Maria"); Hashtable y=new Hashtable (); y=(Hashtable) x.clone(); System.out.println(t.toString()); System.out.println(y.get(„jjh")); } }