252-0027 Einführungin dieProgrammierungI 7.0 ... · 21 x Index 0 1 2 Element 0 0 0. ... public...
Transcript of 252-0027 Einführungin dieProgrammierungI 7.0 ... · 21 x Index 0 1 2 Element 0 0 0. ... public...
252-0027Einführung indie Programmierung I
7.0Arbeiten mit Objekten und KlassenThomasR.Gross
DepartmentInformatikETHZürichCopyright(c)Pearson2013.andThomasGross2016Allrightsreserved.
Uebersicht
6.9999Review
7.0Listenals Beispiel
Copyright(c)Pearson2013andThomasGross2016.Allrightsreserved.
2
Variableeines Basistyps,Methode
public static void someFct() {
int x = 0;
int y = 0;
int z = 0;
// first stmt
}3
x
y
z
Variableeines Basistyps,Methode
public static void someFct() {
int x = 0;
int y = 0;
int z = 0;
// first stmt
}4
x
y
z
0
0
0
5
Leider falsch.Lokale Variablemüssen explizit initialisiertwerden,siehe letzte Slides.
Variableeines Basistyps,Instanzmethode
void someFct() {
int x = 1;
int y = x + 1;
int z = 0;
// first stmt
}6
x
y
z
Variableeines Basistyps,Instanzmethode
void someFct() {
int x = 1;
int y = x + 1;
int z = 0;
// first stmt
}7
x
y
z
1
2
0
Variableeines Basistyps,Attributepublic class SomeClass {
int x = 1;
int y = x + 1;
int z;
void someFct() {
// first stmt
}
} 8
x
y
z
public class SomeClass {
int x = 1;
int y = x + 1;
int z;
}
public class OtherClass {
void otherFct() {
SomeClass s = new SomeClass();
// first stmt
}
} 9
x
y
z
public class SomeClass {
int x = 1;
int y = x + 1;
int z;
}
public class OtherClass {
void otherFct() {
SomeClass s = new SomeClass();
// first stmt
}
} 10
x
y
z
OtherClass.java
SomeC
lass.java
public class SomeClass {
int x = 1;
int y = x + 1;
int z;
}
public class OtherClass {
void otherFct() {
SomeClass s = new SomeClass();
// z set to 0 even w/o initialization
}
} 11
x
y
z
OtherClass.java
SomeC
lass.java 1
2
0
class SomeClass {
int x;
}
class OtherClass {
public static void main (String[] args) {
SomeClass x = new SomeClass();
System.out.println(x.x);
} // poor naming …
}
12
x
OtherClass.java
SomeC
lass.java
Variableeines Referenztypes (“referencevariable”)
public static void someFct() {
SomeClass c;
// first stmt
System.out.println(c);
}
Class2d.java:8: variable c might not have been initialized System.out.println(c)
^1 error 14
c
Variableeines Referenztypes (“referencevariable”)
§ Alle Variablen müssen ineiner Methode initialisiert werden§ Giltfür VariabledieReferenzen (Verweise)aufObjekte speichern§ Giltfür auch für Arrays
§ Verwenden auch Referenzvariable
§ Sonst gibt es eine CompilerErrorMessage§ Esmussfür denCompilerklar seindass eine Zuweisung stattfand§ Wenn möglich inDefinitioninitialisieren
15
17
Variableeines Referenztypes (“referencevariable”)
public static void someFct() {
int [] x;
// first stmt
System.out.println(x);
}
Class2d.java:8: variable x might not have been initialized System.out.println(x)
^1 error 20
x
Variableeines Referenztypes (“referencevariable”)
public static void someFct() {
int [] x = new int[3];
// first stmt
}
21
x
Index 0 1 2
Element 0 0 0
Variableeines Referenztypes (“referencevariable”)
public static void someFct() {
int [] x = {2, 5, 8};
// first stmt
}
22
x
Index 0 1 2
Element 2 5 6
Variableeines Referenztypes (“referencevariable”)
public static void someFct() {
String [] s = null;
// first stmt
}
23
s
Variableeines Referenztypes (“referencevariable”)
public static void someFct() {
String [] s = {“a”, “b”, “c”};
// first stmt
}
24
s
Index 0 1 2
Element “a” “b” “c”
Variableeines Referenztypes (“referencevariable”)
public static void someFct() {
String [] s = new String[3]
// first stmt
}
25
s
Index 0 1 2
Element null null null
Attributeeiner Klassepublic class SomeClass {
int i;
int [] ia;
OtherClass o;
}
26
i
ia
o
Variableeines Referenztypes (“referencevariable”)
public static void someFct() {
SomeClass c = new SomeClass();
// first stmt
}
28
c
i
ia
o
0
null
null
Variableeines Referenztypes (“referencevariable”)
public static void someFct() {
SomeClass [] ca = new SomeClass[3];
// first stmt
}
29
ca
Index 0 1 2
Element null null null
31
Variableeines Referenztypes (“referencevariable”)
public static void someFct() {
SomeClass [] ca = new SomeClass[3];
for (int i=0; i<3; i++){
ca[i] = new SomeClass();
ca[i].ia = new int[3];
}
}32
ca
32
Index 0 1 2
Element
i
ia
o
0
null
i
ia
o
0
null
i
ia
o
0
null
Index 0 1 2
Element 0 0 0
Index 0 1 2
Element 0 0 0
Index 0 1 2
Element 0 0 0
34
Attributeeiner Klassepublic class SomeClass {
int i;
int [] ia;
SomeClass o;
}
35
i
ia
o
39
41
Variableeines Referenztypes (“referencevariable”)
public static void someFct() {
SomeClass c = new SomeClass();
SomeClass d = null;
d = c;
d.i = 1;
c = null;
d = null;
} 42
c
i
ia
o
1
null
null
d
Variableeines Referenztypes (“referencevariable”)
public static void someFct() {
SomeClass c = new SomeClass();
SomeClass d = new SomeClass();
} 43
c
i
ia
o
0
null
null
d
i
ia
o
0
null
null
Variableeines Referenztypes (“referencevariable”)
public static void someFct() {
SomeClass c = new SomeClass();
SomeClass d = new SomeClass();
c.o = d;
}
44
c
i
ia
o
0
null
d
i
ia
o
0
null
null
Variableeines Referenztypes (“referencevariable”)
public static void someFct() {
SomeClass c = new SomeClass();
SomeClass d = new SomeClass();
c.o = d;
}
Wie kann ich d.i auf1setzen?
2Möglichkeiten … 45
c
i
ia
o
0
null
d
i
ia
o
0
null
null
46
Referenzen undObjekte
§ InJava, für Objekte undArraysgelten die”referencesemantics”Regeln.
Eine Klasse für Knoten einer Listepublic class ListNode {
int data;ListNode next;
}
§ Jeder Knoten der Liste speichert:§ DenWerteiner ganzen (int)Zahl§ Einen Verweis aufeinen anderen Listenknoten
§ ListNodes können zu einer Kette verbunden (“linked”) wer-denumeine Menge oder Liste vonWerten zu speichern.
data next42
data next-3
data next17
data next9 null
Verknüpfte Knoten -- Uebungsproblem 1
Welche Folge vonAnweisungen verändert diesesBild:
indieses?
list.next.next = new ListNode(30);
data next10
data next20
list
data next10
data next20
list data next30
Verknüpfte Knoten -- Uebungsproblem 2
Welche Folge vonAnweisungen verändert diesesBild:
indieses?
data next10
data next20
list
data next30
data next10
list data next20
list = new ListNode(30, list);
Verknüpfte Knoten -- Uebungsproblem 3
Welche Folge vonAnweisungen verändert diesesBild:
indieses?
data next10
data next20
list1
data next30
data next40
list2
data next10
data next30
list1
data next40
list2
data next20
rest = list2.next;
list2.next = list1.next;
list1.next = list2;
list2 = rest;
64
Referenzen vs. ObjektenVariable = Wert;
Eine Variable (linksvon= )ist ein Zeiger ("Referenzvariable")
Ein Wert(rechts von= )ist ein Objekt (ein Rechteck,;worauf der Zeiger zeigt)
§ Für dieListe rechts:§ a.next = value;
heisst anpassen worauf zeigt§ variable = a.next;
heisst dievariable setzen sodass sie aufzeigt
data next10
adata next201
2
1
2
Referenzen verändern
§ Wenn dasProgramm sagt:
§ a.next = b.next;
§ dann heisst das:§ ”LassedieVariable a.next aufdenselbenWert(Objekt) zeigen wieb.next."
§ Oder, ”Lasse a.next aufdenselben Ortwie b.next zeigen."
data next10
adata next20
data next30
bdata next40
Verknüpfte Knoten -- Uebungsproblem 4
Welche Folge vonAnweisungen verändert diesesBild:
indieses?
data next10
data next990
list...
data next10
data next990
list...
data next1000
Frage über verknüpfte Knoten
§ Nehmen wir anwir haben eine lange Kette vonKnoten:
§ Wir wissen nicht wie lang dieKette ist.
§ Wie könnten wir dieWerte inallen Knoten ausgeben?
data next10
data next990
list...
data next20
Algorithmus Pseudocode
§ Fangen wir amAnfang der Liste an,front ist der 1.Knoten
§ while(es gibt noch Knoten auszugeben):§ Gebe dendataWertdesKnotens aus§ Gehe weiter zum nächsten Knoten viadasnext Attribut.
data next10
data next990
list...
data next20
Algorithmus Pseudocode
§ Fangen wir amAnfang der Liste an,front ist der 1.Knoten
§ while(es gibt noch Knoten auszugeben):§ Gebe dendataWertdesKnotens aus§ Gehe weiter zum nächsten Knoten viadasnext Attribut.
§ Wie wissen wir obnoch Knoten auszugeben sind?§ Wir haben einen Verweis aufeinen Knoten§ Nach der Ausgabe desletzten Knotens ist nextnull.
data next10
data next990
list...
data next20
Algorithmus Pseudocode
§ Fangen wir amAnfang der Liste an,front ist der 1.Knoten
§ while(es gibt noch Knoten auszugeben):§ Gebe dendataWertdesKnotens aus§ Gehe weiter zum nächsten Knoten viadasnext Attribut.
§ Wie können wir uns durch dieListe arbeiten ?
list = list.next; // is this a good idea?
data next10
data next990
list...
data next20
Abarbeiten einer Liste?
§ Ein (schlechter)Weg jeden Wertinder Liste auszugeben :
while (list != null) {System.out.println(list.data);list = list.next; // move to next node
}
§ Wasist dasProblem?§ (Wir verlieren dieListe während wir sie ausgeben)
data next10
data next990
list...
data next20
Eine weitere Referenz:current
§ Wir wollen list nicht verändern.Wir deklarieren eineandere Variableundändern diese.§ Eine ListNode Variableist nicht ein ListNode Objekt§ …sondern eine Referenz (Verweis)aufein Objekt
ListNode current = list;
data next10
data next990
list...
data next20
current
Eine weitere Referenz:currentListNode current = list;
§ Waspassiert wenn wir jetzt diese Anweisung ausführen:
current = current.next;
data next10
data next990
list...
data next20
current
Korrektes Durchlaufen einer Liste
§ Der korrekte Weg jeden Wertder Liste auszugeben:
ListNode current = list;while (current != null) {
System.out.println(current.data);current = current.next; // move to next node
}
§ DasVerändern voncurrent hatkeinen Einfluss aufdieListe.
data next10
data next990
list...
data next20
Eine Klasse LinkedIntList
§ ListNodes sollen nicht vonKlienten direkt verändertwerden.
§ Alsoentwickeln wir eine Klasse diedieKnoten versteckt:LinkedIntList.
front
LinkedIntListListNode ListNode ListNode
data next42
data next-3
data next17
element 0 element 1 element 2
§ HatdieMethoden:§ add,add,get,indexOf,remove,size,toString
§ DieListe ist als Kette vonKnoten internimplementiert§ DasLinkedIntList Objekt enthält eine Referenz aufdasersteElementim front
§ null im next Attribut signalisiert Ende derListe§ Hatfront denWertnull soist dieListe leer
front
add(value)add(index, value)indexOf(value)remove(index)size()toString()
LinkedIntListListNode ListNode ListNode
data next42
data next-3
data next17
element 0 element 1 element 2
LinkedIntList Klasse v1public class LinkedIntList {
private ListNode front;
public LinkedIntList() {front = null;
}
// methodsgohere
}
front =
LinkedIntList
Dieadd Methode// Adds the given value to the end of the list.public void add(int value) {
...}
§ Wie wollen wir einen neuen Knoten amEnde hinzufügen?§ SinddieWerte inderListe vor diesem Schritt wichtig?
front = data next42
data next-3
data next17
element 0 element 1 element 2
Ein Elementneine leere Liste hinzufügen
§ Bevor20hinzugefügt wird: Danach:
§ Wir müssen einen Knoten erstellen undandieListe anhängen.
front = front = data next20
element 0
DieaddMethode,1.Versuch// Adds the given value to the end of the list.public void add(int value) {
if (front == null) {// adding to an empty listfront = new ListNode(value);
} else {// adding to the end of an existing list
...
}}
§ Bevor20amEnde hinzugefügt wird :
§ Danach:
front = data next42
data next-3
front = data next42
data next20
element 0 element 2
element 0 element 1
Aneine nicht-leere Liste anhängen
data next-3
element 1
data next-3
Vorsicht anderKante!
§ Umein Elementzur Liste hinzuzufügen (oder zu vonderListezu entfernen)müssen wir dasnext Attribut desvorherigenKnotens modifizieren.
front = data next42
element 0 element 1
data next-3
Vorsicht anderKante!
§ Umein Elementzur Liste hinzuzufügen (oder zu vonderListezu entfernen)müssen wir dasnext Attribut desvorherigenKnotens modifizieren.
§ Wie durchlaufen wir eine Liste?
front = data next42
element 0 element 1
data next-3
Vorsicht anderKante!
§ Umein Elementzur Liste hinzuzufügen (oder zu vonderListezu entfernen)müssen wir dasnext Attribut desvorherigenKnotens modifizieren.
§ Wie durchlaufen wir eine Liste?
front = data next42
element 0 element 1
current =
data next-3
Vorsicht anderKante!
§ Umein Elementzur Liste hinzuzufügen (oder zu vonderListezu entfernen)müssen wir dasnext Attribut desvorherigenKnotens modifizieren.
§ Wie durchlaufen wir eine Liste?§ Wasfür einen Typ musscurrent haben?
front = data next42
element 0 element 1
current =
data next-3
Vorsicht anderKante!
§ Umein Elementzur Liste hinzuzufügen (oder zu vonderListezu entfernen)müssen wir dasnext Attribut desvorherigenKnotens modifizieren.
§ Wie durchlaufen wir eine Liste?§ Wasfür einen Typ musscurrent haben?ListNode
front = data next42
element 0 element 1
current =
data next-3
Vorsicht anderKante!
§ Umein Elementzur Liste hinzuzufügen (oder zu vonderListezu entfernen)müssen wir dasnext Attribut desvorherigenKnotens modifizieren.
§ Worauf sollte current verweisen wenn wir 20amEnde einfügenwollen?
§ Welcher LoopTestlässt uns andieser Stelle anhalten?
front = data next42
element 0 element 1
DieaddMethode// Adds the given value to the end of the list.public void add(int value) {
if (front == null) {// adding to an empty listfront = new ListNode(value);
} else {// adding to the end of an existing listListNode current = front;while (current.next != null) {
current = current.next;}current.next = new ListNode(value);
}}