Variablen Speicheradresse beibehalten

A

azazcx

Gast
Wie kriege ich es hin, dass dieser Code 2 ausgibt?
dh. Ich will, dass b immer noch auf die selbe Speicheradresse wie a zeigt und nicht kopiert wird.

Java:
Integer a = 1;
String ret = a.toString()+"";
Integer b = a;
b= b+1;
ret += a.toString()+"";
System.out.println(ret);
return ret;

mfg Gast
 
Zuletzt bearbeitet von einem Moderator:

André Uhres

Top Contributor
Hallo Gast,

wie Volvagia schon andeutete, geht das so nicht, weil Integer "immutable" ist. Wir brauchen also eine eigene Wrapperklasse, die "mutable" ist. Beispiel:

Java:
    private String test() {
        MyInteger a = new MyInteger(1);
        String ret = a.toString();
        MyInteger b = a;
        b.setInteger(b.getInteger() + 1);
        ret += a.toString();
        System.out.println(ret);
        return ret;
    }
    private class MyInteger {
        private Integer integer;
        MyInteger(int integer) {
            this.integer = integer;
        }
        public Integer getInteger() {
            return integer;
        }
        public void setInteger(Integer integer) {
            this.integer = integer;
        }
        @Override
        public String toString() {
            return String.valueOf(integer);
        }
    }

Gruß,
André
 
A

azzacx

Gast
Heisst also das bei Objekten immer die Referenz übergeben wird....
Dann kann ich mir meinen Fehler nicht erklären.
Der Code macht in etwa das:
Java:
Field[][] feld = new Field[9][9];
/*Feld füllen*/
Field[] f = new Field[9];
/*Mit elementen aus Feld füllen*/
if(f[i] instanceof Unfilled & f[i].isTrue()){
   f[i] = new Filled(x);
}
Von Field erben Filled und Unfilled, wenn ich jetzt das array feld komplett durchgehe hat sich aber nichts verändert...
 

Cola_Colin

Top Contributor
Es wird immer eine Kopie der Referenz übergeben.

Aus deinem Code-Schnipsel werde ich so nicht ganz schlau.
Zeig das mal inklusive der Schleife.
 
S

SlaterB

Gast
Zeile 6 wird jedenfalls nie ausgeführt, denn das Array ist anfangs leer, ergo liefert instanceof immer false,
zum Glück, sonst gäbe es bei f.isTrue() eine NullPointerException
 
A

azzacx

Gast
Java:
public Solver(int[] arraay){
Field[][] feld = new Field[9][9];
for (int[] is : array) {
			for (int i : is) {
				if (i != 0) {
					feld[z][za] = new Filled(i);
				} else {
					feld[z][za] = new Unfilled(z, za);
				}
				za++;
			}
			za = 0;
			z++;
		}
}
/*
... 
*/
checkRow(){
   Field[] f = new Field[9];
    for (int i = 0; i < 9; i++) {// Reihe
	Field[] toc = new Field[9];
		for (int j = 0; j < 9; j++) {
			toc[j] = feld[j][i];
		}
		        arrcheck(toc);
		}
   
}
arrcheck(Field[] f){
   for(int i=0;i<9;i++{
      if(f[i] instanceof Unfilled & f[i].isTrue()){
            f[i] = new Filled(x);
       }
   }
}
 
A

azzacx

Gast
Ka. Jedenfalls kommt er in den Teil rein, habe ich per Testausgabe überprüft.
new Filled() wird also auch wirklich ausgeführt...
 
S

SlaterB

Gast
@Volvagia
bestimmt,
und der Code hat sich ja inzwischen geändert, kein null

@azzacx
und was ist nun genau die Frage?
toc und f sind neue eindimensionale Array, wenn du diesen Arrays neue Werte zuweist, wird dadurch im zweidimensionalen feld nichts geändern,
änderst du dagegen die Objekte, die ja in mehreren Arrays drinstehen, wirkt sich das auf alle Arrays aus, eben weil alle dieselben Objekte enthalten

ganz nett möglich ist noch [c]Field[] toc = feld[j];[/c],
dann legst du kein neues eindimensionales Array an, sondern verweist auf einen Teil des zweidimensionalen Arrays
 

azzacx

Mitglied
Okay, heisst also:
Ich kann die Objekte bearbeiten, dass wirkt sich Global aus.
Sobald ich das Objekt per [= new] neu definiere wirkt sich das nicht Global aus.
Wie kann ich das Ding dann trotzdem im 2-Dimensionalen direkt ändern?

@SlaterB:
Leider reicht mir das nicht... Ich brauche Horizontale Reihen, Vertikale Reihen und Kästen.
 
Zuletzt bearbeitet:
S

SlaterB

Gast
schon Field[] toc = feld; ausprobiert?
ansonsten z.B. das gesamte zweidimensionale Array übergeben + den Index i

oder nach Änderung von toc dessen Werte wieder ins 2D-Array schreiben
 

azzacx

Mitglied
Kann es sein, dass wenn ich im Object ne static Methode habe, die das Objekt neu Definiert, die referenz verloren geht?

Java:
public static void fillMe(Field u, int i) {
		u = new Filled(i);
	}
Habe mal bei jedem ersetzen des Objekts die Speicheradresse ausgeben lassen...
Sind immer 2-er pärchen die eig die selbe Speicheradresse haben sollten, bin mir aber nicht ganz sicher. Teste das mal im Scrapbook.
Code:
Unfilled@527736bd
Filled@4178460d
Unfilled@49938039
Filled@23abcc03
Unfilled@63deeb40
Filled@3acafb56
Unfilled@643ae941
Filled@57a7ddcf
Unfilled@4dd36dfe
Filled@73da669c

Okay bewiesen, das:
Java:
Object a = new Object();
String text = "" + a;
a = new Object();
text += "/" + a;
erzeugt das:
Code:
java.lang.Object@18203c31/java.lang.Object@6c4fc156

Damit sind Referenzen auf das Urspüngliche Objekt nicht die selben wie auf das neue.

Wie kann ich das jetzt umgehen?
 
Zuletzt bearbeitet:
S

SlaterB

Gast
du bist für mich nach wie vor zu undeutlich, was ist 'das', welches du umgehen willst?
welche Ausgaben willst du z.B. stattdessen haben?

Speicheradressen gehören übrigens immer zu Objekten, nicht zu Variablen,
Java:
Object a = new Object();
Object b = a;
dann ist a vielleicht Object@6c4fc156 und b exakt genauso, denn b zeigt auf DASSELBE Objekt wie a
 

azzacx

Mitglied
Hätte eigentlich erwartet, dass meine Variable keine neue Speicheradresse zugewiesen bekommt, wenn ich der Variable nen neues Objekt zuweise... Habe jetzt aber nen einfacheren Weg gefunden, als mich damit rumzuärgern.
 
S

SlaterB

Gast
eine Variable hat in der Tat immer dieselbe Speicheradresse, nur interessiert diese niemanden, du kannst sie auch nicht sehen,
du kannst nicht unterscheiden ob sie Teil eines Objektes im Heap ist oder eine lokale Variable im Stack einer Methoden-Ausführung

die Ausgabe zeigt das referenzierte Objekt
 

Ähnliche Java Themen

Neue Themen


Oben