Java 6 - ips.tu-braunschweig.de · 5} 6} OOP mit Java Zugri sbeschr anker Zugri sbeschr anker...
Transcript of Java 6 - ips.tu-braunschweig.de · 5} 6} OOP mit Java Zugri sbeschr anker Zugri sbeschr anker...
Institut für Programmierungund Reaktive Systeme
Java 6
Markus Reschke
13.10.2014
OOP mit Java
OOP
Objekte = Verhalten (durch Methoden) + Daten (durch Attribute)
Klassen = Bauplane fur Objekte
Kapselung von Programmteilen
Einfacheres Andern von Programmen
Wiederverwendung von Programmteilen
Markus Reschke | Java 6 | 2Institut für Programmierung
und Reaktive Systeme
OOP mit Java
Klassen in Java
1 ZugriffsBeschraenker class KlassenName {
2 // Attribute
3 // Methoden
4 }
Eine Klasse mit public-Zugriffsbeschranker pro .java-Datei
OOP mit Java
Attribute in Java
Attribute beschreiben die Daten, die jedes Objekt speichert
Klasse gibt an, welche Attribute Objekte dieser Klasse haben
Jedes Objekt verfugt uber eine eigene Kopie dieser Attribute
Anderungen an den Attributen eines Objektes wirken sich nur aufdieses Objekt aus
Attribute sollen fast immer private sein.
Werden fast wie lokale Variablen definiert.
1 ZugriffsBeschraenker class KlassenName {
2 T attributsName;
3 T attributsName = Initialisierungswert.
4 // Methoden
5 }
OOP mit Java
Methoden
Methoden sind die Aktionen, die mit einem Objekt ausgefuhrtwerden konnen
Statische Methoden kennen wir schon
Unterschied zu statischen Methoden: Sie arbeiten auf einzelneObjekte
1 ZugriffsBeschraenker class KlassenName {
2 // Attribute
3 Zugriffsbeschraenker Rueckgabetyp name(T1 Paramter1 ,...) {
4 // Anweisungen
5 }
6 }
OOP mit Java
Zugriffsbeschranker
Zugriffsbeschranker erlauben es, Elemente von Klassen vor dem Zugriffvon außen versteckt. Dies erschwert unsachgemaße Verwendung vonObjekten und erleichtert Kapselung.
Beschranker Klasse Paket Unterklassen Rest
public Y Y Y Y
protected Y Y Y N
keine Angabe Y Y N N
private Y N N NNormalerweise reichen public und private.
Markus Reschke | Java 6 | 6Institut für Programmierung
und Reaktive Systeme
OOP mit Java
Beispiel: Counter
1 public class Counter {
2 private int count;
3
4 public void increase () {
5 count ++;
6 }
7
8 public int getCount () {
9 return count;
10 }
11
12 public void reset() {
13 count = 0;
14 }
15 }
OOP mit Java
Erzeugen von Objekten
Wir konnen nun selber Klassen erstellen, wie werden diese nunverwendet?
new erzeugt neue Objekte auf dem Heap.
Syntax: new Klassenname(Konstruktorparameter)
new gibt eine Referenz auf das neue Objekt zuruck
obj, Counter,
Stack
Counter {count, int, 1description, String,
}
Heap
String {...
}
1 Counter c = new Counter ();
OOP mit Java
null
Nullreferenz
Variable von Referenztyp zeigt auf nichts
Standardwert von Attributen mit Referenzdatentyp
1 Counter c = null;
OOP mit Java
Der . Operator
Wir konnen jetzt neue Objekte erzeugen.
Wie benutzt man nun ein Objekt?
Der .-Operator kann auf eine Referenz angewendet werden, um aufdie Attribute und Methoden des referenzierten Objekteszuzugreifen.
Voraussetzung ist, dass der Zugriff erlaubt ist (Beschranker)
Syntax: referenz.element
1 Counter c = new Counter ();
2 c.increase ();
3 c.increase ();
4 c.reset();
Markus Reschke | Java 6 | 10Institut für Programmierung
und Reaktive Systeme
OOP mit Java
Konstruktoren
Oft mussen beim Erzeugen von Objekten Attribute initialisiertwerden
Vom Benutzer der Klasse zu verlangen, dass er die Attribute selbernach dem Erzeugen setzt, kann zu Fehlern fuhren
Konstruktoren sind Methoden, die beim Erzeugen des Objektesaufgerufen werden.
Kein Ruckgabetyp, Gleicher Name wie Klasse
Falls keiner selber definiert: Default Konstruktor ohne ParameterKlassenname() wird automatisch erzeugt
Konstruktoren werden nicht vererbt
OOP mit Java
Beispiel: Counter1 public class Counter {
2 private int count;
3
4 public Counter () {
5 this (1);
6 }
7
8 public Counter(int start) {
9 count = start;
10 }
11
12 public void increase () {
13 count ++;
14 }
15
16 public int getCount () {
17 return count;
18 }
19
20 public void reset() {
21 count = 0;
22 }
23 }
OOP mit Java
Verdecken von Attributen und this
Lokale Variablen und Methodenparameter konnen Attributeverdecken
Zugriff auf lokale Variable anstatt aufs Attribut
this ist eine Referenz auf das aktuelle Objekt.
Kann benutzt werden, um trotz des Verdeckens auf das Attributzuzugreifen.
Markus Reschke | Java 6 | 13Institut für Programmierung
und Reaktive Systeme
OOP mit Java
Was Passiert?
1 public class Counter {
2 private int count = 100;
3
4 public void nichtVerdeckt () {
5 System.out.println(count);
6 }
7
8 public void verdeckt () {
9 int count = 0;
10 System.out.println(count);
11 }
12
13 public void verdecktParam(int count) {
14 System.out.println(count);
15 }
16
17 public void verdecktThis () {
18 int count = 0;
19 System.out.println(this.count);
20 }
21 }
OOP mit Java
static
static markiert Elemente von Klassen als statisch
Wird normalerweise hinter dem Zugriffsbeschranker angegeben
Fur statische Attribute existiert nur eine einzige Kopie, die von allenObjektinstanzen dieser Klasse geteilt wird.
Statische Methoden konnen ohne Objektinstanz genutzt werden,durfen aber auch nur auf statische Elemente der Klasse zugreifen
Nicht-statische Attribute existieren ja nur fur Objektinstanzen,statische Methodenaufrufe operieren auf keinem Objekt
Zugriff mit Klassenname.Element
Markus Reschke | Java 6 | 15Institut für Programmierung
und Reaktive Systeme
OOP mit Java
Was Passiert?
1 public class Statisch {
2 public int a = 0;
3 public static int b = 1;
4
5 public static void main(String [] args) {
6 Statisch n1 = new Statisch ();
7 n1.a = 1;
8 Statisch n2 = new Statisch ();
9 n2.a = 2;
10 System.out.println(n1.a);
11 System.out.println(n2.a);
12 n1.b = 5;
13 System.out.println(n1.b);
14 System.out.println(n2.b);
15 System.out.println(Statisch.b);
16 }
17 }
OOP mit Java
Uberladen von Methoden
Mehrere Methoden in einer Klasse konnen den selben Namen haben
Mussen sich in der Parameterliste unterscheiden (durch andereTypen, andere Anzahl von Parametern oder beidem)
Ruckgabetyp wird nicht zur Unterscheidung herangezogen
Auswahl der passenden Methode geschieht zur Kompilierzeit
Markus Reschke | Java 6 | 17Institut für Programmierung
und Reaktive Systeme
OOP mit Java
Was Passiert?
1 public class Overload {
2
3 public void foo(Object a) {
4 System.out.println("Das war ein Object");
5 }
6
7 public void foo(String a) {
8 System.out.println("Das war ein String");
9 }
10
11 public static void main(String [] args) {
12 Overload o = new Overload ();
13 Object obj = new String("Foobar");
14 o.foo(obj);
15 String str = new String("Foobar");
16 o.foo(str);
17 }
18
19 }
OOP mit Java
final
final vor Attributen und lokalen Variablen verhindert das Andern derer Werte
Fur Referenttypen heißt dies: Es kann nicht geandert werden, worauf dieReferenz zeigt.
Das referenzierte Objekt ansich ist jedoch noch veranderbar.
final vor Klassen: Von der Klasse kann nicht geerbt werden
final vor Methoden: Kein Uberschreiben moglich
1 import java.util .*;
2 public class Fin {
3 public static final List <String > l = new ArrayList <String >();
4 public static final int ANSWER = 42;
5
6 public static void main(String [] args) {
7 System.out.println(l);
8 //Geht nicht , da l final ist
9 //l = new ArrayList <String >();
10 //Das referenzierte Objekt selbst kann geaendert werden
11 l.add("Test");
12 System.out.println(l);
13 }
14 }
OOP mit Java
Demo: Flexiblere Arrays
Live in der VorlesungDemo: Ein Listenimplementierung mit Arrays in Java
Markus Reschke | Java 6 | 20Institut für Programmierung
und Reaktive Systeme
OOP mit Java
Demo: Binarer Suchbaum
Live in der VorlesungDemo: Ein binarer Suchbaum in Java
Markus Reschke | Java 6 | 21Institut für Programmierung
und Reaktive Systeme
OOP mit Java
Uberblick und Ausblick
Klassen
Attribute
Methoden
Modifier
null
Datenstrukturen
Montag: Vererbung und Interfaces
Markus Reschke | Java 6 | 22Institut für Programmierung
und Reaktive Systeme