Transcript
  • Prof. Dr. Nikolaus Wulff

    Java SchulungJava Schulung

    Objektorientierte Programmierung in JavaTeil III: Java Klassen und Objekte

  • Prof. Dr. Nikolaus Wulff 2

    Referenzvariablen

    a

    bnull

    00

    Referenzvariablen verweisen auf(unbenannte) Objekte im Speicher.

    Uninitialisierte Variablen enthalteneine Null-Referenz (null).

    Objekte werden zur Laufzeit erzeugt.

    Objekte sind anonym.

    Sie haben eine unvernderliche Identitt.

    Point a,b;

    new Point(0,0);

    aObjekt

    a 12

    a = new Point(1,2);

    :Point

    a:Point

  • Prof. Dr. Nikolaus Wulff 3

    Binden von Referenzvariablen

    a

    b

    00

    34

    Beim Zuweisen eines Objektes auf eineVariable wird eine Referenz zugewiesen:

    Beim Zuweisen von Referenzvariablenaufeinander werden nur die Referenzenkopiert, nicht die Objekte:

    Vorsicht! Das Objekt kann jetzt ber zweiPfade gendert werden:

    a = new Point(0,0);b = new Point(3,4);

    a.set(5,6);b.set(20,30);

    a = b; ab

    00

    34

    2030

  • Prof. Dr. Nikolaus Wulff 4

    Vergleichen von Objekten

    a

    b34

    34

    c

    a == b

    a != c

    d d == null

    Beim Vergleichen zweier Referenzvariablen werden die Referenzen verglichen, nicht die referenzierten Objekte. Es wird also auf Objektidentitt, nicht auf Inhaltsgleichheit geprft.

    ==(shallow equality)

  • Prof. Dr. Nikolaus Wulff 5

    Inhaltsvergleich

    Der Inhalt von zwei Objekten wird durch die Methode equals verglichen.

    Bei selbstdefinierten Klassen vergleicht equals (geerbt von Object) per Default auch nur die Objektidentit, d.h. verwendet shallow equality.

    Die Methode equals muss selbst neu berladen werden, damit sie die gewnschte Funktionalitt bietet.

    new Integer(1) != new Integer(1)new Integer(1).equals(new Integer(1))

    equals(deep equality)

  • Prof. Dr. Nikolaus Wulff 6

    Eine Klasse

    class Cell { private int value = 0; void setValue(int newValue){ this.value = newValue; } int getValue( ) { return this.value; } ...}

    Methoden

    Attribut

    Klassen-

    definition

  • Prof. Dr. Nikolaus Wulff 7

    Bestandteile einer Klasse

    Einleitung einer Klasse durch Schlsselwort class:

    Erzeugung eines Objektes mit new:

    Attribute:

    class EineKlasse { /* Klassenrumpf */ }

    EineKlasse a = new EineKlasse();

    class Datengrab { int i; float f; boolean b;}

    Jede Instanz (jedes Objekt) der Klasse Datengrab bekommt eine eigene Kopie der Attribute.

  • Prof. Dr. Nikolaus Wulff 8

    Methoden

    Methoden: Verhalten eines Objekts Inspizieren und ndern den Zustand eines Objekts. Berechnen von Rckgabewerten. Anstoen von weiteren Methoden ber das Senden von

    Nachrichten an andere Objekte. In anderen Sprachen: Funktionen oder Prozeduren. Nur innerhalb von Klassen (keine Methode ohne Klasse!).

    Aufruf einer Methode = Senden einer Nachricht:

    int x = a.f(); rufe Methode f von Objekt a bzw.sende Nachricht f an Objekt a

  • Prof. Dr. Nikolaus Wulff 9

    Organisatorisches Hands on Tutorien jeweils Mittwochs 15 17 Uhr

    im Lab4Inf D117 mit Rene Brggemann. Praktikumverschiebung Informatiker Donnerstags

    von 13 17 auf 14 18 Uhr Pool 3.

  • Prof. Dr. Nikolaus Wulff 10

    Parameterliste

    Die Parameterliste spezifiziert die Typen der Objekte, die als Argumente an die Methode bergeben werden knnen.

    Jedes Objekt (Parameter) erhlt einen lokalen Namen, ber den innerhalb der Methode auf das Objekt zugegriffen werden kann.

    Beachte: Es werden nicht die Objekte (Kopien), sondern Referenzen auf die Objekte bergeben!

    Cell aCel1 = new Cell();aCel1.setValue(4);reset(aCel1);aCel1.getValue();

    void reset(Cell c) { c.setValue(0);}

    Typ Name

    ==> 0

  • Prof. Dr. Nikolaus Wulff 11

    Rckgabewerte

    Methoden knnen Werte bzw. Objektreferenzen zurckliefern:

    Mit return wird die Methode sofort verlassen - auch wenn noch Befehle dahinter folgen!

    Methoden ohne Rckgabe haben den Rckgabetyp void:

    Integer berechne(int a, int b) { int sum = a + b; return new Integer(sum);}

    Rckgabetyp

    Rckgabe

    void print(int a, int b) { System.out.println("a + b = " + (a + b));}

  • Prof. Dr. Nikolaus Wulff 12

    Methodenrumpf

    Variablendeklarationen und -zuweisungen.

    Beachte: Lokale Variablen mssen initialisiert werden!

    void berechne() { int i; i++;}

    Compile-Fehler!

    void berechne(int a, int b) { int i; i = a * b;} Zuweisung

    Deklaration

  • Prof. Dr. Nikolaus Wulff 13

    Statische Attribute und Methoden

    Attribute und Methoden, die nicht fr einzelne Objekte, sondern fr die ganze Klasse definiert sind.

    D.h., jedes Attribut kommt nur einmal pro Klasse vor!

    Statische Attribute und Methoden knnen genutzt werden, ohne Objekte zu erzeugen. Der Zugriff erfolgt ber den Klassennamen:

    class Person { static int erzeugtePersonen = 0; static void printStatistik() { System.out.println("Erzeugt: " + erzeugtePersonen); }}

    Person.printStatistik();Person.erzeugtePersonen++;

    Vergleiche: System.out.println(...); main

  • Prof. Dr. Nikolaus Wulff 14

    Statische Attribute

    class Person { static int erzeugtePersonen = 0; String name;}

    Person

    erzeugtePersonen = 0

    peter

    class

    name = Peter

    mary

    class

    name = Mary

    Objekte mit Attributen

    Klasse mit statischen Attribut

    das Objekt kennt seine Klasse

  • Prof. Dr. Nikolaus Wulff 15

    Konstanten

    Konstanten = finale Werte von Basisdatentypen Konstanten zur bersetzungszeit werden vom Compiler ausgewertet:

    Konstanten zur Laufzeit sind nach der Initialisierung unvernderlich:

    final static: nur ein Wert pro Klasse, der seinen Wert nach dem ersten Laden der Klasse nicht mehr ndert.

    finale Referenzen: knnen nicht mehr an andere Objekte gebunden werden

    final int ANZAHL_MONATE = 12;

    final int ZUFALL = (int)(Math.random() * 20);

    final Integer NULL = new Integer(0);

  • Prof. Dr. Nikolaus Wulff 16

    this und super Auf das aktuelle Objekt, auf dem die Methode

    ausgefhrt wird (an das die Nachricht gesendet wurde), kann ber das Schlsselwort this zugegriffen werden.

    Auf das direkte Elternobjekt kann innerhalb einer Methode mit super zugegriffen werden.

    Achtung: In statischen Methoden gibt es kein this!

  • Prof. Dr. Nikolaus Wulff 17

    berladen von Methoden

    Eine Nachricht mit mehreren Signaturen und Methodenimplementationen.

    Die Methode wird (statisch) beim Senden der Nachricht anhand der Parameter ausgewhlt.

    class SuperWasher { void wash(Shirt s) { ... } void wash(Car c) { ... } void wash(Dog d) { ... } ...}

    SuperWasher sw = new SuperWasher();Dog aDog = new Dog();sw.wash(aDog);

  • Prof. Dr. Nikolaus Wulff 18

    Kein berladen bei Rckgabewerten

    Folgende berladene Methoden unterscheiden sich nur im Rckgabewert:

    Das geht nicht, denn der Compiler kann fr diesen Aufruf nicht bestimmen, welche Methode zu verwenden ist:

    void washAll() {...}int washAll() {...}

    washAll();

  • Prof. Dr. Nikolaus Wulff 19

    Default-Konstruktor

    Konstruktoren dienen zur Erzeugung und Initialisierung von Objekten einer Klasse.

    Wenn kein Konstruktor angegeben wird, ist implizit ein Default-Konstruktor (ohne Parameter) definiert.

    Aufruf des Konstruktors beim Erzeugen des Objekts:

    class Bird { String name;}

    Bird nc = new Bird();

    class Bird { String name;

    Bird() { super(); }}

    Aufruf der Konstruktorsder Superklasse

  • Prof. Dr. Nikolaus Wulff 20

    Konstruktordefinition

    Konstruktoren knnen berladen werden und Parameter erhalten, z.B. zur Initialisierung von Attributen:

    class Worker extends Person { String name;

    Worker() { super(); name = "Noname"; System.out.println("Erzeuge Noname"); };

    Worker(String name) { super(); this.name = name; System.out.println("Erzeuge " + name); }} Worker noname = new Worker();Worker peter = new Worker("Peter");

    Aufruf des Super-Konstruktors ist optional(erfolgt sonst automatisch vom Compiler)

  • Prof. Dr. Nikolaus Wulff 21

    Konstruktorverkettung

    Konstruktoren knnen sich gegenseitig aufrufen:

    Konstruktoren knnen Konstruktoren der Superklasse aufrufen:

    class Person { ... Person(String name, int alter) { this(name); ... }}

    Konstruktor dieser Klassemit Parameter String aufrufen

    class Mitglied extends Person { ... Mitglied(String name, int tarifgruppe) { super(name); ... }}

    Konstruktor der Superklassemit Parameter String aufrufen

  • Prof. Dr. Nikolaus Wulff 22

    Konstruktoraufrufe

    PersonAngestellter

    Beim Erzeugen eines Objektes einer Subklasse wird automatisch der Default-Konstruktor der Superklasse aufgerufen.

    class Person { Person() { System.out.println(" Person"); }}class Angestellter extends Person { Angestellter() { System.out.println(" Angestellter"); }}

    Angestellter peter = new Angestellter();

    Ausgabe:

  • Prof. Dr. Nikolaus Wulff 23

    Konstruktor mit Argumenten

    Ein Konstruktor der Superklasse mit Argumenten muss als erstes im Konstruktor explizit (ber super)

    aufgerufen werden.

    class Person { Person(String name) { System.out.println(" Person " + name); }}

    class Angestellter extends Person { Angestellter(String name) { super(name); System.out.println(" Angestellter " + name); }}


Recommended