Codeverständnis

BlackSalad

Bekanntes Mitglied
Ich hab ein Problem beim Verständnis eines Codes.


Hier mal der Code:


Java:
1 public class Poly2 {
2 public static void main ( String [] args ) {
3 IncCounter i0 = new IncCounter() ;
4 DecCounter i1 = new DecCounter () ;
}
}


Objektorientierung usw ist mir noch neu :bahnhof: und ich würds gern richtig begreifen.

Wie komme ich jetzt drauf was i0 für einen Wert hat?

Vielleicht kann mir das mal jm ausführlich erklären.

Würd mich sehr freuen!
 

eRaaaa

Top Contributor
Ohne die Klassen zu kennen kann hier wohl niemand wirklich viel zu schreiben. In Zeile 3 und 4 werden eben zwei Objekte erzeugt, einmal ein Objekt der Klasse IncCounter und einmal DecCounter.
i0 und i1 referenzieren nun auf diese Objekte!
 

Java4Life

Mitglied
Kann mich meinen Vorgängern nur anschließen...Weißt du was die Objekte an Methoden,... besitzen.

Dann zum Beispiel:
i0.getMyValue();

Wenn du eclipse benutzt, einfach mal i0 und den Punkt tippen...Eclipse hilft dir dann ein bisschen.
 

hdi

Top Contributor
i0 ist eine Referenz auf ein IncCounter-Objekt.

Ich würde auch lieber "hat eine Referenz" sagen. Es ist nur eine Variable die eine Referenz abspeichert, "ist" Referenz hört sich so an als würde man bei Änderungen an dieser Variable die Referenz an sich manipulieren. Und wir wissen ja, dass das nicht geht (Call By Value, keine Pointer).

Ist aber nur mein morgendlicher Klugschiss, sorry ich schreib das eigentlich nur weil ich grad drauf warte dass mein Kaffee fertig wird xD Aber ich weiß ja dass du auch Fan von haarspaltigen Diskussionen über solche Belanglosikgeiten bist ;)

PS: Das ist natürlich nicht für dich geschrieben, mir ist klar dass ich dich nicht aufklären muss. Das geht an den TO. Nicht, dass er vllt von C kommt und jetzt falsche Vorstellungen hat.
 
Zuletzt bearbeitet:

Andi_CH

Top Contributor
Ich würde auch lieber "hat eine Referenz" sagen. Es ist nur eine Variable die eine Referenz abspeichert, "ist" Referenz hört sich so an als würde man bei Änderungen an dieser Variable die Referenz an sich manipulieren. Und wir wissen ja, dass das nicht geht (Call By Value, keine Pointer).
Mal weiter Haare spalten ;-)

Java:
public class Haarspalterei {

	public static class Spalter {	}
	
	public static class Haar {
		private Spalter sp = new Spalter();
	}

	public static void main(String[] args) {
		Haar h = new Haar();
	}
}

main hat eine Referenz auf ein Objekt der Klasse Haar und die Klasse Haar hat eine Referenz auf ein Objekt der Klasse Spalter.
h ist eine Referenz auf ein Objekt der Klasse Haar und sp ist eine Referenz auf ein Objekt der Klasse Spalter.

Hm - wohin nun mit den Spaltabfällen :D
 

L-ectron-X

Gesperrter Benutzer
hört sich so an als würde man bei Änderungen an dieser Variable die Referenz an sich manipulieren.
Es werden die Werte eines Objektes manipuliert, eine Referenz ist eine Art Verweis oder Verknüpfung zu bzw. mit einem Objekt. Daher ist
Code:
i0
eine Referenz auf ein Objekt.

Ich würde eher bei hat verstehen, dass
Code:
i0
(was wäre das in diesem Fall?) eine Referenz auf ein Objekt hält. Das wäre zwar möglich, in diesem Fall aber nicht richtig.

Mal weiter Haare spalten ;-)
Nein, es geht nur um die richtige Benutzung und das Verständnis der Begriffe. :oops:
 

hdi

Top Contributor
Ich würde eher bei hat verstehen, dass i0 (was wäre das in diesem Fall?) eine Referenz auf ein Objekt hält. Das wäre zwar möglich, in diesem Fall aber nicht richtig.

Klar ist es richtig:

Java:
i0 = new Object();

i0 (Auf die Frage, was i0 ist: Eine Variable?!) hält jetzt die Referenz auf ein Object. zB 0x23A0F oder sowas. Aber i0 ist nicht 0x23A0F . Ja, der Wert von i0 ist die Referenz, aber i0 und 0x23A0F sind nicht ein und die selbe Sache. Das eine ist eine Referenz, das andere ist eine Variable, die die Referenz enthält.

Also ich verstehe das so:
Stelle dir eine Tür zu einem Raum vor, und der hat eine Nummer, zB R01. Das ist die Referenz. Wenn du nen Zettel hast auf dem R01 steht, dann hast du eine Variable. Wenn du das durchstreichst und drunter R02 schreibst, dann steht auf der Tür vor dem Raum noch immer R01. Also dein Zettel ist nicht die Raumnummer, es ist nur ein Ding, wo ne Nummer draufstand. Er enthält die Raumnummer.

Also das wäre eine Beschreibung, in der "ist" denke ich nicht ganz richtig ist. Und De-Referenzierung ist nochmal was anderes. Der Vorgang von De-Referenzierung bezeichnet ja grade dass ich mir anhand der Referenz das Objekt hole. (Du folgst der Raumnummer auf dem Zettel). Ändert noch immer nix dran dass das nur ein Zettel ist, und nicht die Raumnummer ;)

Anders bei Pointern. Bei Pointer-Variablen ist die Variable tatsächlich die Referenz, denn wenn man sie verändert (ich meine hier Neuzuweisung, nicht De-Referenzierung) dann hat sich die Referenz verändert. Aber das gibts halt in Java nicht.
 
Zuletzt bearbeitet:

L-ectron-X

Gesperrter Benutzer
Hmm, ich glaub, ich war oben nicht genau genug und muss es noch etwas weiter zerlegen.
Code:
i0
ist im vorliegenden Fall eine Referenzvariable, die die VM-Speicheradresse zu einem Objekt vom Typ IncCounter als Wert enthält.
 

Andi_CH

Top Contributor
Nein, es geht nur um die richtige Benutzung und das Verständnis der Begriffe.
Ich habe ja nur auf die Klassennamen in meinem Beispiel angespielt ;-) (heute ist es zu heiss für einen Flammenkrieg :D )

Also ich verstehe das so:
Stelle dir eine Tür zu einem Raum vor, und der hat eine Nummer, zB R01. Das ist die Referenz. Wenn du einen Zettel hast auf dem R01 steht, dann hast du eine Variable. Wenn du das durchstreichst und drunter R02 schreibst, dann steht auf der Tür vor dem Raum noch immer R01. Also dein Zettel ist nicht die Raumnummer, es ist nur ein Ding, wo ne Nummer draufstand. Er enthält die Raumnummer.

Du schreibst ja auch: "hast du eine Variable" (bzw. einen Zettel) - eben du hast eine Variable, welche genau gesagt eine Referenz (und nicht ein int oder boolean oder ....) ist.
Kurz: Du hast eine Variable welche eine Referenz ist und die Referenz auf ein konkretes Zimmer enthält.

Ist das möglicherweise eine Doppelbedeutung? - hab ich nicht genau darüber nachgedacht
(Vorsicht - das ist verwirrend und nicht fertig gedacht und es verwirrt mich auch :bahnhof: )

Ich sehe das etwas so: Variable <> Object, Referenz <> konkreter Typ/Klasse.
Aber "Referenz" steht auch für einen konkreten Wert

Die Zimmernummer ist übrigens ein gutes Beispiel für eine Referenz - es ist eben nur die Nummer des Zimmers und nicht das Zimmer selbst und der Zettel ist die Referenz welche die Referenz speichert.
 

BlackSalad

Bekanntes Mitglied
Das wäre der ganze Quellcode:

Java:
public class Poly2 {
public static void main ( String [] args ) {
IncCounter i0 = new IncCounter() ;
DecCounter i1 = new DecCounter() ;
DiffIncCounter i2 = new DiffIncCounter(2) ;
IncCounter i3 = new IncCounter();
DiffIncCounter i5 = new DiffIncCounter(3);
IncCounter s0 , s1;
DecCounter s2 ;
DiffIncCounter s3;
s0=i0;
s0.count();
s0=i3;
s0.count();
++s0.sum;
s0=i1;
s0.count();
++s0.sum;
++s0.value;
s3=i2;
s3.count();
s1=i2;
s1.countOther(i5);
int res=i5.f();
}
 }


Also wird am anfang erst mal nur ne Referenz gemacht. Verstehe ichd as richtig? Man weiß quasi noch gar nicht den Wert, oder wie?

weiß man den wert dann quasi erst am Zeile 5?
 

jgh

Top Contributor
lass dich nicht von dem "ist" oder "hat" eine Referenz verwirren.
Zeig lieber mal die Klassen:
Code:
IncCounter , DecCounter, DiffIncCounter
 

Asgar13

Bekanntes Mitglied
Stell dir das mal als Deklaration vor.

Datentyp variablenname = wert;

Den "Datentyp" hast du in irgendeiner anderen Java-Datei erstellt und solange wir diese "andere Java-Datei" nicht sehen können, können wir dir auch nicht helfen.
 

BlackSalad

Bekanntes Mitglied
okay danke habs verstanden.




Und wenn ich nun für die Zeile int res=i5.f() ne methode implementieren will, die den Wert zurückgibt, der von dieser Zeile geändert wird?

Wie muss das denn dann aussehen?

müsste doch als ganz normale return anweisung gehen oder?
 

Cola_Colin

Top Contributor
Da wir die Implementierungen von den Klassen IncCounter , DecCounter, DiffIncCounter nicht kennen, können wir das eher schlecht sagen.

Vermutlich wird es auf soetwas herauslaufen:
Java:
public int f() {
  return value;
}

Aber das ist jetzt mehr ins Blaue hineingeraten.
 

njans

Top Contributor
Nujo
Java:
class DiffIncCounter 
{
     ....

     public int f ()
     {
     // Hier muss dann die Implementation hin
     return 0;
     }

    ....
}

Nebenbei solltest du die Methode dann lieber gleich, sinnvoll benennen, denn "f"ist nicht sonderlich selbst beschreibend :)
 
Ähnliche Java Themen

Ähnliche Java Themen

Neue Themen


Oben