Variablen in Klasse modifizieren

Status
Nicht offen für weitere Antworten.

michi2

Bekanntes Mitglied
Hallo,
Kann mir jemand sagen warum im folgendem Version 2 geht, Version 1 aber nicht?

Code:
class A
  {
  boolean x = false;
  A einAObj = new A();
  }
class B
  {
  methode()
    {
    //Version 1 - Geht nicht:
    A zweitesAObj = A.einAObj;
    zweitesAObj.x = true;
    A.einAObj = zweitesAObj:
  
    //Version 2 - Geht:
    A.einAObj.x = true;
    }
  }
 
Du meinst wohl sowas:
Code:
class A {
    private boolean x = false;
    private A einAObj = new A();
    class B {
        private void methode() {
            A zweitesAObj = einAObj;
            zweitesAObj.x = true;
            einAObj = zweitesAObj;
            einAObj.x = true;
        }
    }
}
Als innere Klasse hat B zugriff auf die Variablen von A.
 
Nein? Ich meine das was oben steht... und will wissen warum "Version 1" nicht geht, "Version 2" aber schon!?
 
inwiefern funktioniert es denn nicht, außer dass in der von dir geposteten Version viele Fehler sind?

Code:
class A {
    boolean x = false;

    static A einAObj = new A();

    public static void main(String[] args) {
        new B();
    }

}

class B {
    public B() {
        A zweitesAObj = A.einAObj;
        zweitesAObj.x = true;
        A.einAObj = zweitesAObj;
        System.out.println(A.einAObj.x);
    }
}
Ausgabe bei mir: true
 
hast zwar nicht die fehlermeldung gepostet aber
A zweitesAObj = A.einAObj;

du versuchst hier zweitesAObj die referenz von der public static variable einAObj zuzuweisen. Aber einAObj ist garkeine static variable von A sondern eine Instanzvariable.
 
Ja, sorry, das static von einAObj hab ich oben vergessen, gehört natürlich rein...

@SlaterB: Ja, so hab ich das auch aber bei mir giebt das false!?
Hier mal ein Teil vom Orginal-code (entspricht class B):
Code:
class cfile
   {
   boolean gespeichert = false;   //wert für X, wird von ausen gesetzt

   void laden()  //wird aufgerufen
      {
      Michis_Editor me1 = Michis_Editor.e1;    //Michis_Editor entspr. A
      System.out.println("me1.gespeichert: " + me1.gespeichert);       //Ausgabe: false
      System.out.println("gespeichert: " + gespeichert);                    //Ausgabe: true

      //...
      me1.gespeichert = gespeichert;
      //...

      Michis_Editor.e1 = me1;
      System.out.println("Michis_Editor.e1.gespeichert: " + Michis_Editor.e1.gespeichert);     //Ausgabe: false

      Michis_Editor.e1.gespeichert = gespeichert;
      System.out.println("Michis_Editor.e1.gespeichert: " + Michis_Editor.e1.gespeichert);     //Ausgabe: true
      }
   //....
   }
 
was meinst du?, ergibt mein Code bei dr true oder false?
kann ja nur true rauskommen,

zu deinem Code:
ändere mal
Code:
Michis_Editor.e1 = me1;
      System.out.println("Michis_Editor.e1.gespeichert: " + Michis_Editor.e1.gespeichert);     //Ausgabe: false
in
Code:
Michis_Editor.e1 = me1;
      System.out.println("me1.gespeichert: " + me1.gespeichert);     //Ausgabe: ?
      System.out.println("Michis_Editor.e1.gespeichert: " + Michis_Editor.e1.gespeichert);     //Ausgabe: false
nur wenn bei me1 true ausgegeben wird darfst du dich wundern,
das wird aber nach allen Regeln der Programmierung nicht sein 😉
insofern ist dann interessant was bei ... noch so alles passiert,

solche Probleme sind durchaus trickreich,
da greife ich immer auf die hasscode-Operation zurück, um zu vergleichen, welches Objekt überhaupt gerade benutzt wird,

alternativ bietet sich eine Laufvariable an, jedes Objekt bekommt eine Nummer, 1, 2, 3 ..,
dann mache e1 private, ersetze alle Zugriffe durch
setE1(boolen newE1) {
System.out.println("Object "+hashcode() oder number+", e1 gesetzt auf: "+newE1);
e1 = newE1;
}

und es kann langsam nichts mehr schiefgehen,
so findet man jeden Fehler
 
Hm... Hab den zweiten Teil nicht verstanden, sorry...

Die Ausgabe:
[Edit: siehe unten]

Der komplette Code:
Code:
void laden()
   {
   Michis_Editor me1 = Michis_Editor.e1;
   System.out.println("cf1: me1.gespeichert: " + me1.gespeichert);
   System.out.println("cf1: gespeichert: " + gespeichert);
   
   
   me1.suchen = suchen;
   me1.suchindex = suchindex;
   me1.einausgabedatei = einausgabedatei;
   me1.dateiname_Name = dateiname_Name;
   me1.dateiname_Path = dateiname_Path;
   me1.dateiname_gueltig = dateiname_gueltig;
   me1.dokSearcher = dokSearcher;
   me1.search_up = search_up;
   me1.bgenau = bgenau;
   me1.bcursor = bcursor;
   me1.aktText = aktText;
   me1.undoTextNr = undoTextNr;
   me1.last_used = last_used;
   me1.item1_6_ = item1_6_;
   me1.item2_11c_ = item2_11c_;
   me1.undoNumber = undoNumber;
   me1.markerNumber = markerNumber;
   me1.gespeichert = gespeichert;
   me1.TA = TA;
   me1.p_neu = p_neu;
   me1.p_font = p_font;
   me1.scroll = scroll;
   
   //p_neu.remove(me1.textanzeige);
   //System.out.println("Rammstein - " + me1.textanzeige.param());
   me1.textanzeige = textanzeige;
   //System.out.println("Rammstein2 - " + me1.textanzeige.param());
   me1.textanzeige.setText(aktText);
   //System.out.println("blabla aktText: " + aktText + " TAtext: "+ me1.textanzeige.getText());
   me1.textanzeige.setCaretPosition(cursorposition);
   //p_neu.add(me1.textanzeige);
   me1.fontAktualisieren();
   
   
   if(!dateiname_Name.equals(""))
      me1.e1.setTitle("Michi's Editor 3 - " + dateiname_Name);
   else
   me1.e1.setTitle("Michi's Editor 3");
   //      System.out.println("load - aktText: "+ aktText);
   
   System.out.println("d");
   
   Michis_Editor.e1 = me1;
   System.out.println("cf2a: me1.gespeichert: " + me1.gespeichert);     //Ausgabe: ?
   System.out.println("cf2b: Michis_Editor.e1.gespeichert: " + Michis_Editor.e1.gespeichert);
   
   Michis_Editor.e1.gespeichert = gespeichert;
   System.out.println("cf2c: Michis_Editor.e1.gespeichert: " + Michis_Editor.e1.gespeichert + "\n");
   }

PS: ja ich weiß der Code ist unübersichtlich, wird verbessert...
 
der zweite Teil meines vorherigen Posts handelte von der Frage :
was bedeutet es wenn true oder false ausgegeben wird bei der Betrachtung mehrerer Objekte?,
wie kann man genauer vorgehen?

-------

spielt ja im Moment keine Rolle, deine zuletzt gepostete Ausgabe ist eine andere als zuvor und vor allem scheint kein Fehler aufzutreten?

me1 ist erst true, wird dann auf false gesetzt und bleibt dann auf false,
noch ein Problem vorhanden?
 
Sorry, nein das Problem ist noch da! Ich hab einen falschen aoutput gepostet, der Fehler tritt hier auf:
me1.gespeichert: false
cf1: me1.gespeichert: false
cf1: gespeichert: true
d
cf2a: me1.gespeichert: false
cf2b: Michis_Editor.e1.gespeichert: false
cf2c: Michis_Editor.e1.gespeichert: true
 
Problem gelöst:
Hab nicht bedacht das auch JTextArea.setText(String txt) die Actionlistener auslöst... 😳

Thy an alle!
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben