Referenz Frage

Migu

Mitglied
Hallo

Ich bin gerade am Versuche zu verstehen wie Referenzen in Java funktionieren, und je mehr ich darüber lese desto verwirrter bin ich.
Ich habe mir mal ein Minimalbeispiel:

Java:
import java.awt.Point;

public class Test {
    public static void add(Point p) {
        p.x++;
    }
    
    public static void add(Integer i) {
        i++;
    }
    
    public static void main(String[] args) {
        
        Point q = new Point(5, 5);
        System.out.println("q.x = " + q.x);
        add(q);
        System.out.println("q.x = " + q.x);
        
        Integer myInt = new Integer(10);
        System.out.println(myInt.intValue());
        add(myInt);
        System.out.println(myInt.intValue());

    }
}

So nun ist die Ausgabe
q.x = 5
q.x = 6
10
10

warum?
Ich hätte erwartet dass das Point-Object in der main-Funktion unverändert bleibt, also sowie bei Integer. Kann mir jemand erklären warum das so passiert?
Soweit ich weiss wird beim erzeugen eines Objects (zB q) eigentlich, unter der Haube einen Pointer definiert der auf den Speicherplatz zeigt. Also wie in C++
Code:
Point *q
.
Das würde aber wiederrum heissen das nur der Wert (der Pointer) an die Funktion übergeben wird, also call-by-value...

Ich checks nicht!

Danke im voraus
Migu
 

faetzminator

Gesperrter Benutzer
Vielleicht hilft dir folgender Beitrag bei deinem Verständnis Problem:
http://www.java-forum.org/allgemeines/4904-call-value-call-reference.html

Das kann man aber auch sehr viel einfacher formulieren :) Immer wenn du eine Zuweisung auf einen Parameter machst, arbeitest du in der Methode auf einem neuen Objekt und der Caller kriegt nichts davon mit.
Statt mit [c]Integer[/c] hier ein Beispiel mit [c]int[/c]:
Java:
public static void add(int i) {
    i++;
}
Ausformuliert heisst das sowas:
Java:
public static void add(int i) {
    i = i + 1;
}
Der Code für Integer kann ausformuliert etwa so lauten:
Java:
public static void add(Integer i) {
    i = Integer.valueOf(i.intValue() + 1);
}
Wie du siehst, haben wir hier ebenfalls eine Zuweisung. Das betrifft alle Objekte, welche immutable sind. Das sind z.B. die Wrapperklassen (Integer, Float) und natürlich String.
 

HimBromBeere

Top Contributor
Zusammengefasst: die Pointer aus C/C++ gibt´s erstmal in JAVA nicht, das, was dem am nächsten kommt, sind die Referenzen. Soweit erstmal richtig.
Das würde aber wiederrum heissen das nur der Wert (der Pointer) an die Funktion übergeben wird, also call-by-value...
Das stimmt aber nicht mehr. Wenn du an eine Funktion einen Pointer übergibst, ist deine Funktion call-By-Reference, denn du sagst damit der Methode, an welcher Stelle im Speicher die Variable steht und damit wie man sie verändern kann. Mit Referenzen (In JAVA, nicht zu verwechseln mit Referenzen in C/C++) ist es ähnlich, du übergibst eine Referenz AUF das Objekt und sagst somit, wie dieses verändert werden kann.

Noch kürzer: Call-By-Value gibt´s in JAVA nur für primitive Datentypen wie
Code:
int
und
Code:
double
.
Code:
String
und
Code:
Integer
(nicht int!) sind immutables (unveränderlich), die sind also ein bisschen außen vor. Objekte sind in JAVA immer Call-By-Reference.
 

EnHancEd[]

Aktives Mitglied
Hab dir mal was zusammen geschrieben:


Diese Beispiel zeigt in Java Call by Value.
Dies bedeutet, dass eine in der main Methode festgelegte Variable, in diesem Fall:
x= 5, an die Methode doSomething(int x) übergeben wird.

Der Parameter könnte auch ein String sein, wenn man in der main-Methode einen String
erstellen würde und diesen übergeben möchte.


Java:
public class CallBy {

  public static void main(String[] args) {
	int x = 5;
		   
	// die variable x wird kopiert und somit nicht durch die methode verändert
		   
	//CallBy test = new CallBy();
		   
	// immer noch 5
	 System.out.println(x);
		   
	doSomething(x);	  
	}

// Der in der Main-Methode festgelegte Wert von x wird der Methode übergeben(Call-by-Value)

	public static void doSomething(int x) {

	 System.out.println(x = x+1);

	}
}



Wie bereits erwähnt könnte man nun noch einen String ändern, der Parameter ist als int
nur ein Beispiel. Somit müsste das Programm so aussehen:


Java:
public class CallBy {

	public static void main(String[] args){


		   
		   String s= "Hallo";
		   
		// s noch "Hallo"
		   System.out.println(s);

		// s nun: "Hallo, wie gehts?"
		   changeString(s);

		}

		
		public static void changeString(String s){
			System.out.println(s + " ,wie gehts?");
		}
}


Hoffe, du verstehst das Prinzip jetzt.

Gruß
 
B

bygones

Gast
mhm das Bsp zeigt nicht wirklich das Problem.

du erzeugst einen neuen String, dass der nicht der selbe wie s ist, das ist logisch.

ausserdem machst du nur was in den Methoden, es waere an sich interessant zu sehen, was nach dem Methodenaufruf mit der jeweiligen Variable geschieht.
 

EnHancEd[]

Aktives Mitglied
Nach dem Methodenaufruf haben die Variablen wieder den ursprünglichen Wert?
Oder was meinst..?

gut eig. müsste es so aussehen..

Java:
public static void changeString(String s){
			System.out.println(s= s + " ,wie gehts?");
		}
 
A

asdasdasdasdasd

Gast
EnHancEd[];865059 hat gesagt.:
Nach dem Methodenaufruf haben die Variablen wieder den ursprünglichen Wert?
Oder was meinst..?

gut eig. müsste es so aussehen..

Java:
public static void changeString(String s){
			System.out.println(s= s + " ,wie gehts?");
		}


Die Variable s aus deiner Main wurde nicht in der Methode angefasst. Es wurde eine Copy erstellt von s und mit der wird in der Methode gearbeitet. Daher ist die Aussage mit ursprünglichen Wert nicht korrekt.
 

EnHancEd[]

Aktives Mitglied
Es geht ja auch drum, dass eine Kopie erstellt wird.

Nimm eben das Beispiel wenn dir das andere nicht gefällt:

Java:
class ArrayAendern
{
  void ausgeben ( int[] x )
  {
    for ( int j=0; j < x.length; j++ )
      System.out.print( x[j] + " " );
    System.out.println( );
  }

  void setElementZero ( int[] x, int index )      // 6.
  {
    if ( index < x.length )                       // 7.
      x[ index ] = 0;                             // 8.
  }
}



class ArrayAendernTest
{
  public static void main ( String[] args )       // 1.
  {
    ArrayAendern arrAendern = new ArrayAendern(); // 2.
    int[] arr = {27, 19, 34, 5, 12} ;             // 3.
    System.out.println( "Vorher:" );              // 4.
    arrAendern.ausgeben( arr );

    arrAendern.setElementZero( arr, 0 );          // 5.
    System.out.println( "Nachher:" );             // 9.
    arrAendern.ausgeben( arr );
  }
}

Erläuterung der Schritte:

1) Das Programm beginnt mit der static main() Methode zu starten.
2) Ein ArrayAendern-Objekt wird konstruiert.
3) Das int[]-Objekt arr wird konstruiert und initialisiert.
4) Die in arr enthaltenen Werte werden ausgegeben.
5) Vorher: 27 19 34 5 12 wird ausgegeben
6) Die setElementZero() Methode wird mit den Parametern arr und 0 aufgerufen.
7) Eine Referenz auf das Array arr wird in den Parameter x kopiert und 0 wird in den Parameter index kopiert.
8) Die setElementZero() Methode überprüft, ob das gewünschte Element (hier 0) existiert
9) Element 0 des Arrays wird auf 0 gesetzt.
10) Die jetzt in arr enthaltenen Werte werden ausgegeben.
11) Nachher: 0 19 34 5 12 wird ausgegeben
 

Migu

Mitglied
Ja danke erstmal für euren Input.
Aber je mehr man liest desto verwirrter ist man... Im Internet steht es mal so, mal so.

Aber so wie ich das aus obigen Beiträgen verstehen konnte gibt es doch call-by-reference für Objekte, jedoch nur wenn sie keine Integer oder String oder eine der primitiven Datentypen sind.

Ist das so korrekt??

Den Beitrag vor mir, habe ich ähnlich mit einem Vektor ausprobiert

Java:
import java.util.Vector;

public class Test {
    
    public static void setToZero(Vector<Integer> vec) {
        for ( int i=0; i<vec.size(); i++ ) {
            vec.set(i, 0);
        }
    }
    
    public static void main(String[] args) {
        
        Vector<Integer> vec = new Vector<>();
        vec.add(5); 
        vec.add(155); 
        vec.add(41);
        for(Integer i : vec) {
            System.out.println(i);
        }
        setToZero(vec);
        for(Integer i : vec) {
            System.out.println(i);
        }
    }
}

Ausgabe ist
0
0
0

Es funktioniert also.

Was aber passiert bei Java intern wenn man so eine Referenz an eine Funktion übergibt??
Werden die Werte aus deren Speicherort kopiert und geändert oder ist das eher ein Vorgang wie bei einem Pointer in C/C++?

Migu
 
G

Gast2

Gast
Java erstellt eine Kopie des Zeigers. Du hast also zwei unterschiedliche Referenzen, die aber auf das selbe Objekt zeigen.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
V Frage zu Polymorphismus: Objekt der Subklasse in Referenz der Oberklasse Java Basics - Anfänger-Themen 4
W Die leidige Referenz-Frage Java Basics - Anfänger-Themen 9
P OOP-Theorie-Frage: Referenz auf Objekt Java Basics - Anfänger-Themen 27
Hzrfa Objekte, Referenz Java Basics - Anfänger-Themen 5
I Grundsatzfrage: Belegt eine Referenz auf 'null' RAM, und wenn ja - wieviel ;-) ? Java Basics - Anfänger-Themen 5
O Warum bekommen wir nicht die Referenz vom zurückgegebenen Objekt? Java Basics - Anfänger-Themen 4
P Wie rufe ich Methoden mit einer Referenz auf eine Klasse||Objekt auf Java Basics - Anfänger-Themen 4
C Kopie oder Referenz ? Java Basics - Anfänger-Themen 5
A Binärbaum rekursiv durchsuchen und Referenz zurückgeben Java Basics - Anfänger-Themen 4
B Neue Liste erstellen, wenn Objekte bestimmte Referenz hat / Gruppierung von Einträgen Java Basics - Anfänger-Themen 12
Y Pointer / Referenz - Theorie Java Basics - Anfänger-Themen 3
H Referenz Objekt aufrufen Java Basics - Anfänger-Themen 12
D Uebergabe per Referenz Java Basics - Anfänger-Themen 2
O Referenz - toString Java Basics - Anfänger-Themen 9
S This-Referenz Java Basics - Anfänger-Themen 6
F Referenz an ein Objekt in einer anderen Klasse erstellen(Nullpointer exception) Java Basics - Anfänger-Themen 6
I Referenz auf Klasse als Rückgabewert Java Basics - Anfänger-Themen 7
P Datentypen LinkedList: Kopie behält Referenz? Java Basics - Anfänger-Themen 3
J Referenz und Instanzierung Java Basics - Anfänger-Themen 25
I Erste Schritte Referenz zum Knoten davor, in einer Liste Java Basics - Anfänger-Themen 4
M Referenz geht bei Zwischenspeichern verloren (ArrayList) Java Basics - Anfänger-Themen 4
8 Referenz (Pointer, Zeiger) in Java Java Basics - Anfänger-Themen 9
O This-Referenz als Returnwert einer Methode? Java Basics - Anfänger-Themen 13
O This Referenz Java Basics - Anfänger-Themen 3
A top referenz bei queues Java Basics - Anfänger-Themen 1
J Rückgabe als Wert, keine Referenz Java Basics - Anfänger-Themen 3
Q Parameterübergabe - Objekt - Referenz Java Basics - Anfänger-Themen 5
C Dynamische Referenz & abstrakte Klassen Java Basics - Anfänger-Themen 3
T Aufgerufene Methode Inhalt der übergebenen Referenz Java Basics - Anfänger-Themen 5
B Referenz in Java Java Basics - Anfänger-Themen 5
C Referenz auf ein Objekt kopieren! Java Basics - Anfänger-Themen 2
J Methoden Referenz und Speicherplatz für Objekte reservieren Java Basics - Anfänger-Themen 2
M Wie komm ich an die Referenz eines Oberflächenelements Java Basics - Anfänger-Themen 2
A Klassenvariablen Referenz auf ein Objekt Java Basics - Anfänger-Themen 18
K OOP Probleme mit Objekt-Referenz in Methode Java Basics - Anfänger-Themen 6
B Arraycopy kopiert nur die Referenz?! Java Basics - Anfänger-Themen 3
S Speicheradresse auf die eine Referenz zeigt ausgeben Java Basics - Anfänger-Themen 12
E Compiler-Fehler kann Objekt-Referenz nicht erstellen Java Basics - Anfänger-Themen 3
B Referenz zu anderen Frame Java Basics - Anfänger-Themen 10
Blackskyliner Referenz ähnlicher Zugriff, aber wie? Java Basics - Anfänger-Themen 4
K Klassen this-Referenz und Klassen/Methodenaufruf Syntax Java Basics - Anfänger-Themen 3
C Referenz einer bereits instanziierten Klasse während des Programmablaufs Java Basics - Anfänger-Themen 16
H Objekt holen per Referenz als String. Java Basics - Anfänger-Themen 4
T Referenz einer Variable übergeben Java Basics - Anfänger-Themen 3
S Datentypen Objekt Integer Referenz Java Basics - Anfänger-Themen 5
B Referenz auf Referenz Java Basics - Anfänger-Themen 3
Luk10 Problem mit Singleton bzw statischer Referenz! Java Basics - Anfänger-Themen 16
H ArrayList Zugriffe per Referenz verkürzen? Java Basics - Anfänger-Themen 9
B Static Referenz auf Non-static Feld Java Basics - Anfänger-Themen 6
Luk10 Sinn von Instanzierung ohne Referenz Java Basics - Anfänger-Themen 7
C0FFEE Referenz auf Methode übergeben Java Basics - Anfänger-Themen 2
aze NullpointerException :Null Referenz anzeigen lassen Java Basics - Anfänger-Themen 2
D Fehlen einer Referenz auf Objekt Java Basics - Anfänger-Themen 14
N this.referenz erläuterung Java Basics - Anfänger-Themen 2
K Attribut als Referenz auf Objekt Java Basics - Anfänger-Themen 8
K 3 Threads bearbeiten 1 Referenz: Ich versteh's nicht... Java Basics - Anfänger-Themen 2
D Referenz auf Objekt Java Basics - Anfänger-Themen 5
P Methode BigInteger-Array übergeben als Referenz Java Basics - Anfänger-Themen 6
U null-referenz Java Basics - Anfänger-Themen 26
deetee Problem mit Referenz auf Map Java Basics - Anfänger-Themen 5
G Interface referenz probleme Java Basics - Anfänger-Themen 10
V Return - JA/NEIN - Parameterübergabe Array (Referenz) Java Basics - Anfänger-Themen 7
D enum und Referenz der umgebenden Klasse Java Basics - Anfänger-Themen 2
C Referenz Java Basics - Anfänger-Themen 11
A ClassNotFoundException: Referenz nicht aktualisiert Java Basics - Anfänger-Themen 2
P Textarea aktualisieren, Referenz fehlt Java Basics - Anfänger-Themen 4
T Die this Referenz Java Basics - Anfänger-Themen 21
C Größe einer Referenz ? Java Basics - Anfänger-Themen 16
D Array reverse Problem, da Referenz nicht auf tmpArray zeigt Java Basics - Anfänger-Themen 4
G primitive Datentypen als Referenz an eine Methode übergeben Java Basics - Anfänger-Themen 2
G Wie Referenz auf Objekt übergebn Java Basics - Anfänger-Themen 8
P Objekte als Attribut: Referenz oder Kopie? Java Basics - Anfänger-Themen 3
G Parameterübergabe als Referenz bzw. als Kopie Java Basics - Anfänger-Themen 4
S Prüfen, ob null Referenz? Java Basics - Anfänger-Themen 2
G Referenz-Problem Java Basics - Anfänger-Themen 3
J Referenz problem Java Basics - Anfänger-Themen 12
D tiefergehende Java-Referenz Java Basics - Anfänger-Themen 3
M Referenz auf Membervariable Java Basics - Anfänger-Themen 5
G Objektübergabe als Referenz bei RMI Java Basics - Anfänger-Themen 2
J referenz auf noch nicht erzeugte objekte? Java Basics - Anfänger-Themen 2
G Rückgabe einer Kopie bzw. Referenz Java Basics - Anfänger-Themen 22
M Parameter als Referenz übergeben Java Basics - Anfänger-Themen 5
F Referenz Pointer oder doch nochmal neu suchen ? Java Basics - Anfänger-Themen 2
D Unterschied zwischen Referenz auf Objekt/Instanz von Objekt Java Basics - Anfänger-Themen 9
K Referenz auf Funktion Java Basics - Anfänger-Themen 6
J Referenz auf ein Objekt Java Basics - Anfänger-Themen 2
javasdann Referenz als String ausgeben. Java Basics - Anfänger-Themen 10
B Was ist eine Referenz? Java Basics - Anfänger-Themen 6
Z Zugriff auf Attribute nach Zuweisung einer Referenz Java Basics - Anfänger-Themen 8
L Referenz vs. Kopie Java Basics - Anfänger-Themen 2
G Zeiger/Referenz auf int- Variable Java Basics - Anfänger-Themen 5
Zrebna Frage zu Test-Driven Development (TDD) Java Basics - Anfänger-Themen 3
I Frage Thymeleaf -> Fehler ignorieren und mit "" ersetzen? Java Basics - Anfänger-Themen 15
I Frage Thymeleaf -> Prefix / Suffix ändern? Java Basics - Anfänger-Themen 11
D Rekursions Probleme / frage Java Basics - Anfänger-Themen 4
T Frage zu Parse Java Basics - Anfänger-Themen 2
H Frage an die Profis Java Basics - Anfänger-Themen 4
J Eine konzeptionelle Frage zu OOP Java Basics - Anfänger-Themen 3
P Frage zu Rekursion und Backtracking Java Basics - Anfänger-Themen 2
H Frage zur Ausgabe Java Basics - Anfänger-Themen 4

Ähnliche Java Themen

Neue Themen


Oben