Variablen, Referenzen, Listen Aufgabe Ref 1: Gegeben ist die Klasse Schueler public class Schueler { private String name, vorname, kurs; // Konstruktor public Schueler(String n, String vn, String k) { name=n; vorname=vn; kurs=k; } public String getName(){ return name; } public void setName(String n){ name =n; } public String getKurs(){ return kurs; } public void setKurs(String x) { kurs =x; } } // Schueler und verwenden die Klasse im Programm SchuelerTest: public class SchuelerTest ... .... Schueler p,q,r; ..... p= new Schueler("Wurst","Hans","Informatik"); jTextArea1.append("(1): "+p.getName()+" "+p.getKurs()+"\n"); p.setKurs("Mathematik"); jTextArea1.append("(2): "+p.getName()+" "+p.getKurs()+"\n"); q = p; jTextArea1.append("Variable q/1: "+q.getName()+" "+q.getKurs()+"\n"); p.setKurs("Sport"); jTextArea1.append("Variable q/2: "+q.getName()+" "+q.getKurs()+"\n"); q=new Schueler("Kuh","Milka","Biologie"); jTextArea1.append("Variable q/3: "+q.getName()+" "+q.getKurs()+"\n"); jTextArea1.append("p/1: "+p.getName()+" "+p.getKurs()+"\n"); p = null; jTextArea1.append("p/2: "+p.getName()+" "+p.getKurs()+"\n"); p = q; jTextArea1.append("p/3: "+p.getName()+" "+p.getKurs()+"\n"); // Ende der Klasse Schueler Aufgaben NF 11; Seite 1 Variablen, Referenzen, Listen Fragen 1. Warum ist die Anweisung p.name="Maier"; nicht möglich? 2. Welche Wirkung hat Anweisung p.setKurs("Mathematik"); ? 3. Was wird nach q = p; ausgegeben? 4. Welche Ausgaben erfolgen nach p.setKurs("Sport"); ? 5. Was bewirkt q = new Schueler("Kuh","Milka","Biologie"); ? 6. Warum erzeugt p = null; eine NullPointerException in der nachfolgenden Ausgabe? 7. Welche Wirkung hat p = q; ? Objekt-Orientierung Die ersten objektorientierten Sprachen wurden ab 1967 entwickelt (Simula, Smalltalk). Die Grundidee besteht darin, Objekte der realen Welt abzubilden. Objekte besitzen Attribute; Methoden implementieren das Verhalten des Objekts. Eine Klasse beschreibt die Struktur und das Verhalten aller Objekte, die mit Hilfe der Klasse erzeugt werden können (Klasse = Bauplan). Als Klasse (class) bezeichnet man die Definition einer Idee, eines Konzepts, eines Bauplans, einer Schablone. Die Deklaration und Objekterzeugung Deklaration: Schueler p; Objekterzeugung durch den Konstruktor Schueler(String n, String vn, String k): Der Konstruktor dient zur Erzeugung des Objekts und der Initialisierung der Attributvariablen. Der Konstruktor muss denselben Namen wie die Klasse tragen. Zur Erzeugung des OBJEKTS (INSTANZ) vom Typ Ballon wird der Konstruktor mit new aufgerufen: p= new Schueler("Wurst","Hans","Informatik"); Die Initialisierung wird durch den Konstruktor gesetzt; das neue Objekt weist einen sinnvollen Anfangszustand auf. Die Laufzeitumgebung von Java reserviert so viel Speicher, dass ein Objekt vom Typ Schueler mit allen Attributen und Methoden darin Platz hat. Kann das System nicht genügend Speicher bereitstellen, so generiert die Laufzeitumgebung einen OutOfMemoryError. Ein Beispiel aus dem Alltagsleben: Das blaue Auto mit dem Namen golfi ist eine Instanz des Autotyps Golf. Der Bauplan des Typs Golf wird bei der Produktion (=Instanziierung) dieses blauen Autos ausgeführt: golfi = new Golf( ...) . Aufgaben NF 11; Seite 2 Variablen, Referenzen, Listen Aufgabe Was ist in folgenden Anweisungen falsch? Knoten k = new Knoten; Knoten p; p= null; k.nachfolger=p; Gib die Datenstruktur grafisch an Knoten k1 = new Knoten("b", null); Knoten k2 = new Knoten("a", k1); k1.setzeNachfolger(k1); Der ADT Liste Konstruktor Liste0() kopf = null, d.h. kein Nachfolger Beschreibung der Operationen/Methoden public boolean listeLeer(Knoten k); //TRUE, wenn Liste leer public void einfuegen(Object element); // Fügt Knoten am Listenkopf an public boolean einfuegen(Object element, int index); // Fügt Knoten hinter Stelle index ein; index >=0; index =0 Einfügen am Listenkopf public int suchen(Object element); //gibt Index des Vorkommens an; -1, wenn element nicht in Liste vorhanden public boolean loeschen(Object element); //True, wenn element gelöscht wurde public String toString(Knoten k) // Gibt die Listenelemente aus Gib schrittweise die (ADT-)Operationen zu folgenden Aufgaben an List 1: Aufbau obiger Liste List 2: Suchen der Position des Knotens mit dem String-Element 4 List 3: Einfügen eines Knotens mit dem Inhalt 9 hinter dem zweiten Knoten. List 4: Löschen des Knotens mit dem Inhalt 2. Aufgaben NF 11; Seite 3 Variablen, Referenzen, Listen Zeichne die Liste, die durch folgende Anweisungen entsteht: (1) Liste0 li = new Liste0( ); (2) if ( li.listeLeer(kopf) ) { li.einfuegen(”zehn”); } (3) li.einfuegen(”acht”); li.einfuegen(”vier”, 2); (4) li.einfuegen(”sechs”, 2); Stelle die Auswirkung der Anweisungen grafisch dar. Welche Ausgaben erfolgen? Knoten k = new Knoten("eins", null); Knoten p = new Knoten("zwei",k); System.out.println(p.liefereElement() ); // (1) Knoten r = p.liefereNachfolger(); // (2) System.out.println(r.liefereElement() ); r.speichereElement("drei"); // (2a) System.out.println(r.liefereElement() ); // (3) r.setzeNachfolger(p); // (4) System.out.println(r.liefereNachfolger().liefereElement()); // (5) Aufgabe Formuliere eine rekursive eine Methode public void durchlaufen(Knoten k) { // durchläuft die Liste ab der Referenz k Stapel (Stack) Konstruktor Stack( ) Bedeutung: Neuer Stapel (Stapel ist leer) Attribut-Methoden boolean isEmpty() Object peek() (= inspizieren der Stapelspitze) true, wenn Stapel leer liefert das oberste Element, ohne den Stapel zu verändern Modifizierende Methoden Object push (Object element) legt ein Element oben auf den Stapel; Object pop( ) Die Operation entfernt das oberste Element; Fehler, wenn Stapel leer Aufgaben NF 11; Seite 4 Variablen, Referenzen, Listen Aufgabe Stack: Was liefern folgende Operationen? Stack s; s.isEmpty(); s = new Stack(); s.isEmpty(); s.push ("x"); s.peek(); s.push("z"); s.pop(); s.push("y"); s.isEmpty(); s= new Stack(); s.pop(); Schlange (Queue): Methoden/Interface public interface QueueIF { public boolean isEmpty(); //TRUE, wenn Schlange leer public Object add(Object e); // Einfügen am Ende public Object remove(); // Entfernt Element am Anfang public Object element(); // Element am Anfang erfragen public String toString(); // Gibt Schlange aus } // Interface Doppelt verkettete Liste Zum Ergänzen! public class DKnoten { // // // private Object element; //(fast) beliebiges Datenelement private DKnoten nachfolger; private DKnoten vorgaenger; Die Konstruktoren: DKnoten() { Leerer Knoten , kein Nachfolger, KEIN DUMMY-Knoten .. .. } Knoten mit Nachfolger und Vorgänger DKnoten(Object element, DKnoten nachfolger, DKnoten vorgaenger) { } Aufgaben NF 11; Seite 5 Variablen, Referenzen, Listen DKnoten(Object element) { } public void speichereElement(Object element) { } public void setzeNachfolger(DKnoten nachfolger) { } public void setzeVorgaenger(DKnoten vorgaenger) { } DKnoten liefereNachfolger() { } DKnoten liefereVorgaenger() { } Object liefereElement() { } } // DKnoten Aufgaben 1. Fertige ein Klassendiagramm zu DKnoten an. 2. Schreibe eine Methode public String toStringReverse(DKnoten k) {… }, welche die Liste rückwärts ausgibt. Aufgaben NF 11; Seite 6