Variablen Variable soll ihren Wert nach Initialisierung nicht mehr ändern

andi11

Mitglied
Hallo zusammen,

in meinem Java-Programm (siehe unten) habe ich eine Klasse "GlobalVar" erstellt. Diese enthält Variablen, auf die ich von jeder anderen Klasse aus zugreifen kann.

Nun möchte ich in der Klasse "Weg" zu Beginn einen dieser Werte (Pack.GlobalVar.AktPos) in einer lokalen Variable (AusgangsPos) festhalten. Beim Durchlaufen der Methode "NaechstePos" wird der Wert "Pack.GlobalVar.AktPos" geändert. Am Ende soll er dann mit dem festgehaltenen Wert "AusgangsPos" verglichen werden.

Das Problem ist aber nun, dass sich die lokale Wert in den letzten beiden Zeilen (unter "else") zusammen mit der ebenfalls lokalen Variablen "Pos" ändert.
Das geschieht genau deshalb, weil ich zu Beginn sage "Pos = AusgangsPos;". Nehme ich den Ausdruck weg ändert sich die Variable "AusgangsPos" nicht.

Warum bleibt diese Bindung die ganze Klasse über erhalten, obwohl sie nur zu Beginn der Klasse aufgerufen wurde?

Java:
package Pack;

public class GlobalVar
{
   
   public static int[] StartPos = {1000,800};
   public static int[] SollPos = {500,400};
   public static int [] AktPos=StartPos;

}

--------------------------------------------

package Pack;

public class Weg
{

   int[] SollPos;
   int[] AusgangsPos;
   int[] Pos;
   int[] NeuePos={0,0};

   int Schrittweite=0;
   double AktHoehe=0.0;
   double Winkel=0.0;

   Position Position;
   GlobalVar GlobalVar;

   public Weg()
   {
     GlobalVar = new GlobalVar();
     Position = new Position();

     SollPos = Pack.GlobalVar.SollPos;
     AusgangsPos = Pack.GlobalVar.AktPos;
     Pos = AusgangsPos;
   }
   
   public void NaechstePos ()
   {
     ....
     ....
     ....
       
       if ((Winkel > 45 && Winkel < 135) || (Winkel < -45 && Winkel > -135))
       {
         
         Pos[1]=Pos[1]+Schrittweite;
         Pos[0]=Pos[0]+(int) (Math.round(Schrittweite*Math.tan(Math.PI/180*Winkel)));
       }
       else
       {
   
         Pos[0]=Pos[0]+Schrittweite;
         Pos[1]=Pos[1]+(int) (Math.round(Schrittweite*Math.tan(Math.PI/180*Winkel)));
       }
 
Ein Array ist ein Objekt wie alles andere auch in Java. Variablen, welche auf ein Array verweisen, sind also auch nur Referenzen. Folgendes Beispiel:

Java:
int[] intArray = new int[]{1, 2};
int[] array2 = intArray;

array2[0] = 5;

System.out.println(intArray[0]); // Ausgabe: 5

Um das zu umgehen musst du das Array im Konstruktor kopieren; dafür ist System.arraycopy die beste methode:

Java:
int[] intArray = new int[]{1, 2};
int[] array2 = new int[intArray.length];
System.arraycopy(intArray, 0, array2, 0, intArray.length);

array2[0] = 5;

System.out.println(intArray[0]); // Ausgabe: 1
System.out.println(array2[0]); // Ausgabe: 5
 
Jeder Arraytyp implementiert Cloneable und somit kann man viel einfacher (ohne System::arraycopy) ein Duplikat erstellen:
Java:
int[] a = {1, 2};
int[] b = a.clone();
 

Zurück
Oben