[Progra] Programmanalyse

[Progra] Programmierung
[DSAL] Datenstrukturen und Algorithmen
[SWT] Softwaretechnik
[DB] Datenbanken und Informationssysteme

Programmanalyse

Beitragvon Max11 » 14.12.08 17:46

Code: Alles auswählen
public class A {
protected int x = 1;
public A() {
this(4);
}
public A(int x) {
this.x += x;
}
protected void f(B b) {
this.x += b.x;
}
}
public class B extends A {
protected static int y = 3;
public B() {
}
public B(int x) {
super(x);
y--;
}
protected void f(B b) {
x += b.y;
}
protected void f(A a) {
a = this;
}
}
public class M {
public static void main(String[] args) {
A a = new A();
System.out.println(a.x); // OUT: 5
B b = new B(10);
System.out.println(b.x+" "+b.y); // OUT: 11 2
a.f(b);
System.out.println(a.x); // OUT: 16
b.f(b);
System.out.println(b.x+" "+b.y); // OUT: 13 2
b.f(a);
System.out.println(a.x); // OUT: 16
b.f(new B());
System.out.println(b.x); // OUT: 15
}
}


Kann mir jemand die letzten beiden Ausgaben genau erklären?[/code]
Max11
 
Beiträge: 11
Registriert: 24.03.08 21:51

Beitragvon C-Otto » 14.12.08 18:36

http://verify.rwth-aachen.de/programmie ... thoden.pdf Folie 20/21

Wo ist das Problem bei der letzten Ausgabe?
Dr. rer. nat. Carsten Otto
http://verify.rwth-aachen.de/otto/
Benutzeravatar
C-Otto
 
Beiträge: 568
Registriert: 10.08.06 00:20
Wohnort: Schwalbach am Taunus
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon Max11 » 14.12.08 19:14

C-Otto hat geschrieben:http://verify.rwth-aachen.de/programmierungWS08//vorlesung/II22_Methoden.pdf Folie 20/21

Wo ist das Problem bei der letzten Ausgabe?


so wie ich es sehe ruft man mit new B() zuerst den public B(), der durch super den public A() {this (4)} aufruft, der dann public A (int 4) {this.x=this.x+4 } aufruft. Was man da für this.x einsetzt ist mir unklar, dann wird protected void f(B b) aufgerufen wo man für b.y 2 einsetzt, x auch unklar.
Und zu vorletzem Aufruf : Wenn ich Methode Aufrufe, zeigt doch "a" wegen "this" auf Objekt "b", das die Methode aufgerufen hat.
Wie kann ich dann auf a.x zugreifen ?
Max11
 
Beiträge: 11
Registriert: 24.03.08 21:51

Beitragvon biza » 14.12.08 19:26

edit:

ok, fangen wir mit der vorletzten Methode an:
es wird protected void f(A a) aufgerufen, wo a = this; ausgeführt wird.
a ist in in diesem Fall aber nicht das Objekt a, was du übergeben hast, sondern nur die Referenz a, die durch die Methode erzeugt wurde. Also ändert sich dadurch für das Objekt (was dann mit System.out.println() ausgegeben wird) gar nichts.

Im letzten Schritt wird erst ein neues Objekt erstellt, was aber nur an die Referenzvariable b der Methode übergeben wird (also nach Ende der Methode f nicht mehr aufrufbar ist).
Der parameterlose Konstruktor von B, ruft automatisch den parameterlosen Konstruktor von A auf. this(4) ruft den Konstruktor A(int x) mit x=4 auf. Dieser erhöht den Initialwert von this.x=1 um die übergebene 4 auf 5.
Das von dir erwähnte x ist dann das x des b Objekts, was den Wert 13 hatte und dann um den y Wert des b-Objekts aus der Methode erhöht wird. Hierbei ist aber zu beachten, dass y eine statische Variable aus der Klasse B ist. Also auch den Wert 2 hat.

Hoffe das war deine Frage und ich hab mich jetzt durch wildes Fensterrumgeswitche nicht selbst verwirrt :)
huch, war ich das?
Benutzeravatar
biza
 
Beiträge: 139
Registriert: 20.11.08 21:02
Studiengang: Informatik (M.Sc.)
Studiert seit: WS 09/10
Anwendungsfach: Medizin

Beitragvon Max11 » 15.12.08 00:49

mir ist nicht ganz klar, worauf "this" zeigt. Ich dachte "this" zeigt auf das Objekt, für das die Methode aufgerufen wird, also das Objekt b. In diesem Fall folgt a=b und a ist dann die Referenzvariable aufs Objekt b.
Max11
 
Beiträge: 11
Registriert: 24.03.08 21:51

Beitragvon biza » 15.12.08 01:42

Nabend. Du denkst da schon richtig.

Das "fiese" hierbei ist aber, dass du der Methode ein A Objekt mit der Referenzvariable a als Methodenvariable mit gleichen Namen übergibst. Das eigentliche a Objekt wird davon aber nicht betroffen, da ja nur eine Referenz auf a gesetzt wird (und damit der Zugriff auf die "normale" Referenzvariable a verdeckt wird.
mit a = this; (also in dem Fall ist this == b) wird also lediglich der Methodenvariable a die Referenz nach b zugewiesen.
huch, war ich das?
Benutzeravatar
biza
 
Beiträge: 139
Registriert: 20.11.08 21:02
Studiengang: Informatik (M.Sc.)
Studiert seit: WS 09/10
Anwendungsfach: Medizin

Beitragvon Max11 » 15.12.08 15:41

ich glaube Du beschreibst call-by-value für primitive Datentypen wo der formale Parameter der Methode eine Kopie des aktuellen Parameters ist.
Aber hier ist ja eine Art von call-by-reference wegen der Referenzvariable, dabei hat der kopierte Parameter einen direkten Einfluss auf das originale Objekt A.
Max11
 
Beiträge: 11
Registriert: 24.03.08 21:51

Beitragvon Coolcat » 18.12.08 12:58

ich glaube Du beschreibst call-by-value für primitive Datentypen

richtig. Java kann streng genommen auch nur call-by-value. In diesem Fall machst du call-by-value einer Referenz:

Eine Referenz ist nichts anderes als eine Speicherstelle, also eigentlich eine Art int-Variable. Und diese int-Variable wird als call-by-value übergeben. Dein a in der Methode ist also eine Kopie dieser int-Variable.
Da du die Speicherstelle kennst, kannst du natürlich das Objekt direkt verändern. Wenn du aber mit a = this etwas anderes zuweist, wird nur die Kopie der Speicherstelle überschrieben. Dies hat keine Auswirkungen außerhalb der Methode. Nur wenn du jetzt auf a.x oder a.f(...) zugreifst, könntest du das Objekt verändern.

Echtes call-by-reference gibt es in Java nicht.
My software never has bugs. It just develops random features.
Benutzeravatar
Coolcat
Promoter
 
Beiträge: 2574
Registriert: 28.11.05 21:26
Wohnort: Kohlscheid / Düsseldorf
Studiengang: Informatik (Dipl.)
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon HE » 18.12.08 21:17

Coolcat hat geschrieben:Echtes call-by-reference gibt es in Java nicht.


Was ist denn "echtes" call-by-reference? Was anderes als 'nen Pointer rumschubsen können andere Sprachen auch nicht.
Benutzeravatar
HE
 
Beiträge: 453
Registriert: 09.03.07 12:20
Wohnort: Aachen
Studiert seit: WS 06/07
Anwendungsfach: Mathe

Beitragvon C-Otto » 18.12.08 21:19

Siehe Progra-Folien! :)
Dr. rer. nat. Carsten Otto
http://verify.rwth-aachen.de/otto/
Benutzeravatar
C-Otto
 
Beiträge: 568
Registriert: 10.08.06 00:20
Wohnort: Schwalbach am Taunus
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon HE » 18.12.08 21:24

Wenn ich 'nen Termin bei dir in der Sprechstunde mache, liest du sie mir dann vor?
Benutzeravatar
HE
 
Beiträge: 453
Registriert: 09.03.07 12:20
Wohnort: Aachen
Studiert seit: WS 06/07
Anwendungsfach: Mathe

Beitragvon C-Otto » 18.12.08 21:25

Da meine Termine montags ganz frueh sind, gerne.
Dr. rer. nat. Carsten Otto
http://verify.rwth-aachen.de/otto/
Benutzeravatar
C-Otto
 
Beiträge: 568
Registriert: 10.08.06 00:20
Wohnort: Schwalbach am Taunus
Studiert seit: fertig
Anwendungsfach: BWL

Beitragvon HE » 18.12.08 21:42

Ich biete einfach mal 5. Januar, so früh wie der Lehrstuhl auf hat. Ich bring dir sogar den Kaffee den weiten Weg von der Maschine ins Büro.
Benutzeravatar
HE
 
Beiträge: 453
Registriert: 09.03.07 12:20
Wohnort: Aachen
Studiert seit: WS 06/07
Anwendungsfach: Mathe

Beitragvon C-Otto » 18.12.08 21:43

Israel.
Dr. rer. nat. Carsten Otto
http://verify.rwth-aachen.de/otto/
Benutzeravatar
C-Otto
 
Beiträge: 568
Registriert: 10.08.06 00:20
Wohnort: Schwalbach am Taunus
Studiert seit: fertig
Anwendungsfach: BWL


Zurück zu Praktische Informatik