Veränderung einer Variable von einer anderen Klasse aus

killabeez

Mitglied
Hallo Leute

Mein Problem:
Ich habe zwei Klassen, Beispielsweise Klasse A und Klasse B.
Klasse A speichert einen Wert der in B generiert wird.
Code Beispiele:

Java:
public class A{
    private int wert;

    public A()
    {
        wert = 0;
    }
    
    public int getWert()
    {
        return wert;
    }

public class B
{
    private int x;
    private A a;

    public Zaehler()
    {
        x = 10;
        a= new A();
    }
    
    public void erzeugeZahlen()
    {
// Hier soll beispielsweise eine Zahl/Wert erzeugt werden. 
//Wie kann ich diese auf die Variable Wert in der Klasse A speichern/ablegen?
}
        }
    }

Meine hauptsächliche Frage ist, wie kann ich die erzeugten Werte in der Klasse B, in die Klasse A speichern. Wie greife ich auf die Klasse A am besten zu?

Ich habe versucht eine set Methode in A zu erzeugen, auf die ich über Parameter aus B zugreifen konnte. Doch bei der Ausgabe der methode gibWert() erhielt ich immer 0.

Es würde mich freuen, wenn mir jemand weiterhelfen könnte 🙂
lg
 
Klasse A hat zwar eine int Variable wert, ich sehe aber keinen setter dafür. Woran sind deine Versuche "eine set Methode in A zu erzeugen" gescheitert? Solange du den Wert nicht setzt, bleibt er natürlich bei 0.
 
Hier der ganze Code:
Java:
public class A{
	
	private int wert;
		
	public A()
	{
		wert = 0;
	}
	
	public void speichereWert(int n)
	{
		wert = n;
	}
	
	public void ausgabe()
	{
		System.out.println(wert);
	}
	
	public int gibWert()
	{
		return wert;
	}
}

public class B{
	
	private A a;
	private int x;
	
	public B()
	{
		a = new A();
		x = 10;		
	}
	
	public void uebergebeZahl()
	{
		{
			a.speichereWert(x);
		}
	}
	
}

	public static void main(String[] args)
	{
		A a = new A();
		B b = new B();
		
		b.uebergebeZahl();
		a.ausgabe();
	}

Bei der Main Methode, a.ausgabe(); erhalte ich 0. Doch eigentlich wollte ich den wert x = 10 übergeben. Wieso kommt trotzdem 0 bei der Ausgabe von Wert in A heraus?
Zusätzlich möchte ich in einer anderen Klasse C auf den Wert in A zugreifen und ihn eigentlich dort ausgeben. Doch zuerst muss ich diesen schritt bewältigen.
Was mache ich falsch?
 
Du hast zwei Instanzen a. Wenn du ein B erstellst, wird im Konstruktor ein A erzeugt. In deiner main baust du ein weiteres a.
P.S Mach es dir nicht so kompliziert, mach dir setter/getter in A
Java:
public void setWert(int x){
          this.wert = x;
}

Java:
public int getWert(){
          return this.wert;
}

Dann bau dir ein Objekt B, rufe innerhalb dessen die setter der Instanzvariable deines A auf und übergib deinen Wert. Wie du darauf zugreifen willst musst du wissen. Entweder aus B, dann brauchst du in B noch eine Methode die dir den Wert aus deiner InstanzVariable a aufruft, oder von aussen indem du dir noch einen getter für diese Instanzvariable baust
Java:
public int getWertVona(){
          return this.a.getWert()
}
 
Zuletzt bearbeitet:
Du hast zwei Instanzen von A: eine wird in der main angelegt, und ihre speichereWert-Methode wird nie aufgerufen. Die zweite A-Instanz ist eine private Instanzvariable der B-Klasse. Ihr Wert wird in uebergebeZahl-Methode von B geändert, aber ihre ausgabe-methode wird nie aufgerufen.
Lösungsmöglichkeiten: du brauchst einen Weg, um entweder der Klasse B eine Instanz von A zu verpassen (z. B: im Konstruktor von B), oder du brauchst eine Möglichkeit, an die private Instanzvariable ranzukommen, z. B. durch einen getter. Die erste Möglichkeit erscheint mir die bessere:
Java:
public class B{
    private A a:
    public B(A a){
        this.a = a;
    }
    public static void main(String[] args){
        A a = new A();
        B b = new B(a);
        b.uebergebeZahl();
        a.ausgabe();
    }
}
Edit: zu langsam.
 
Zuletzt bearbeitet:
Super ich danke euch, jetzt weiss ich mehr über das Arbeiten mit Objekten.
Ich habe meine Klassen nach euren Tipps erstellt und jetzt herrschen andere Bedingungen. Beim weiteren bearbeiten bin ich auf ein neues Problem gestossen.

Ich habe jetzt 3 Klassen. A, B, C
B erzeugt Zahlen mit einer Schleife, von 0 bis 1000.
Diese werden an A der variable wert übergeben.
Zu aller letzt müssen diese Werte in C ausgeben werden, durch Zugriff auf A.

Doch bei der Ausgabe erhalte ich immer nur einen Wert, nämlich den letzten Wert aus der Schleife.
Irgendwie muss ein Wert das in der schleife erzeugt wird an A der variable Wert übergeben werden, dann dieser Wert in C ausgegeben. Erst nach diesem Vorgang müsste die Schleife einen neuen Wert erzeugen, mit dem gleichen Ablauf. Ziel ist es, dass die Ausgabe in C:
0
1
2
3
4
.
.
Ausgibt. Ich habe vieles probiert, mir ist auch klar dass ein getter nur einen Wert zurückliefert.
Code der Klassen:

Java:
public class A{
	
	private int wert;
	
	public A()
	{
		wert = 0;
	}
	
	public void  speichereWert(int i)
	{
		wert = i;
	}
		
	public int gibWert()
	{
		return wert;
	}
}

public class B{
	
	private A a;
				
		public B(A a){
		this.a = a;
	}
	
	public void erzeugeWerte()
	{
		{
			int i = 0;
			while(i<=1000)
			{
				a.speichereWert(i);
				i++;
			}
		}
	}

	
}


public class C {
	
	private A a;
	
	public C(A a)
	{
		this.a =  a;
	}
	
	public void ausgeben()
	{
		{
			System.out.println(a.gibWert());
		}
	}

}


public class Programm {
	public static void main(String[] args)
	{
		 A a = new A();
		 B b = new B(a);
		 b.erzeugeWerte();
		 C c = new C(a);
		 c.ausgeben();
	}		 


}

Mit nur einem Wert den ich an A übergebe besteht dieses Problem nicht, nur bei der Erstellung mehrerer Werte in der Schleife. Zu diesem Problem fällt mir eine Lösung ein, so dass ich die Schleife in B erst inkrementiere wenn bestimmte Bedingungen, wie zum Beispiel die Ausgabe in C stattgefunden hat. Ich kriege es nicht hin, programmiertechnisch das zu realisieren. Setze ich überhaupt am richtigen Ort an?
 
Das hört sich so an, als ob du ein Producer-Consumer Problem erzeugen möchtest. Dies ist aber nur mit mehreren Threads möglich.

Aber was du berwerkstelligen möchtest, kann man auch so lösen:

Java:
public class Programm {
	public static void main(String[] args) {
		A a = new A();
		C c = new C(a);
		B b = new B(a, c);
		b.erzeugeWerte();
	}
}

class A {
	private int wert = 0;
	
	public void speichereWert(int i) {
		wert = i;
	}
	
	public int gibWert() {
		return wert;
	}
}

class B {
	private A a;
	private C c;
	
	public B(A a, C c) {
		this.a = a;
		this.c = c;
	}
	
	public void erzeugeWerte() {
		for (int i = 0; i < 1000; i++) {
			a.speichereWert(i);
			c.ausgeben();
		}
	}
}

class C {
	private A a;
	
	public C(A a) {
		this.a = a;
	}
	
	public void ausgeben() {
		System.out.println(a.gibWert());
	}
}
 
Ach so, dann funktioniert das nur mit Threads. Threads wollte ich auch einsetzen, doch ich dachte das wäre auch möglich zuerst zu lösen ohne Threads.
C muss den Wert nämlich von A holen, lesen und ausgeben.
Producer - Consumer Problem, werde ich recherchieren.
Mit Threads habe ich gerade das gleiche probiert, heisst mit B und C Threads erzeugt, die dann auf A arbeiten "sollten". Die Methode erzeugeWert() aus B und ausgeben() aus C habe ich zu einer run() methode geändert. In der main Methode habe ich sie gestartet.
Bei sonst gleichem Code, erhalte ich ein gleiches Resultat.
Ich wüsste nicht, wo ich eine Änderung vornehmen sollte, vielleicht an den abrufen in der Main-Methode?

Java:
public class A{
	
	private int wert;
	
	public A()
	{
		wert = 0;
	}
	
	public void  speichereWert(int i)
	{
		wert = i;
	}
		
	public int gibWert()
	{
		return wert;
	}
}

public class B extends Thread{
	
	private A a;
				
		public B(A a){
		this.a = a;
	}
	
	public void run()
	{
		{
			int i = 0;
			while(i<=1000)
			{
				a.speichereWert(i);
				i++;
			}
		}
	}

	
}


public class C extends Thread{
	
	private A a;
	
	public C(A a)
	{
		this.a =  a;
	}
	
	public void run()
	{
		{
			System.out.println(a.gibWert() );
		}
	}

}


public class Programm {
	public static void main(String[] args)
	{
		 A a = new A();
		 B b = new B(a);
		 b.start();
		 C c = new C(a);
		 c.start();
	}		 


}
 
Super Leute, das letzte Problem habe ich auch gelöst. Hab mich mit dem Producer Consumer Problem auseinander gesetzt. Für die get und set methoden habe ich synchronized, wait und notify angewendet, und in C habe ich die werte mit einer Schleife aus der getMethode in A ausgelesen.

Besten Dank an Euch!
 
Klar 🙂

Java:
public class A{

    private int wert;
    private boolean verfügbar= false;

    public synchronized int getWert() {
        while (verfügbar== false) {
            try {
                wait();
            } catch (InterruptedException e) { }
        }
        verfügbar= false;
        notifyAll();
        return wert;
    }

    public synchronized void speichereWert(int i) {
        while (verfügbar== true) {
            try {
                wait();
            } catch (InterruptedException e) { }
        }
        wert = i;
        verfügbar= true;
        notifyAll();
    }
}

public class B extends Thread {

    private A a;

    public B(A a) 
{
        this.a= a;
    }

    public void run() {
        for (int i = 0; i < 100; i++) {
            a.speichereWert(i);
        }
    }

public class C extends Thread {

    private A a;

    public C(A a) 
{
        this.a = a;
    }

    public void run() {
        int wertX= 0;
        for (int i = 0; i < 100; i++) {
            wertX = a.getWert();
            System.out.println(wertX);
        }
    }
}




public class Test{
    public static void main(String[] args) {
        A a = new A();
        B b = new B(a);
        C c = new C(a);

        b.start();
        c.start();
    }
}
}
 

Zurück
Oben