Java Variable zwischen Klassen übergeben

1 Antwort

Vom Beitragsersteller als hilfreich ausgezeichnet

Ja, weil I nicht statisch ist.

class Klasse1{

    static int i=25;

}

class Klasse2{

    static int i=Klasse1.i;

}

Wenn du eine Variable public int deklarierst, dann wird jeder Instanz dieser Klasse diese Variable individuell gegeben.

Ohne static könntest du es so machen:

class Klasse1{

    public int i;

}
class Klasse2 extends Klasse1{}//Weiteres Vorgehen unnötig, Klasse2 hat i automatisch.

PerfectMuffin  23.02.2013, 20:29

Merke aber, dass Klasse2 (bei der Sache mit "extends") i nicht erben kann, wen i private ist.

DerGlueckliche 
Beitragsersteller
 23.02.2013, 22:05
@PerfectMuffin

aha danke das is genau das was ich wollte. Aber nochwas. wenn ich jetzt eine Variable habe die sich verändert kann ich die auch per static übergeben? Also z.B. so:

Klasse1:

public static int i = 0;
for (int x = 0; x>1;i++){
            try {
            Thread.sleep(200);
        } catch (InterruptedException e) {
            System.err.println(" Fehler! ");
            e.printStackTrace();
        }
}

Klasse2:

public static int i  = Klasse1.i;
System.out.println("i ist: "+ i);

Wenn ich das mache wird mir als i immer 0 angegeben ohne das sie sich "weiterbildet"

PerfectMuffin  24.02.2013, 07:21
@DerGlueckliche

Nun ja.

In Java werden primitive Datentypen einfach kopiert, während bei Objekten direkt die Adresse kopiert wird(Sodass beide dasselbe Objekt haben.) int ist ein primitiver Datentyp, aber Java kennt Alternativen dazu.

Die Umgehungsstraße: Arrays sind Objekte, aber man kann ihren Wert beliebig verändern.

Also entweder:

  • Du weist i jedes mal neu zu: System.out.println("i ist: "+ i=Klasse1.i);

oder:

  • Du verwendest ein alternatives Objekt oder ein Array, das einen int speichern kann.

Diesmal direkt lauffähiger code:

class Klasse1 implements Runnable{

    static int[] i={0};
    public void run(){

        try{Thread.sleep(200)}catch(InterruptedException e){}
        i[0]++;

    }

}

class Klasse2{

static int[] i=Klasse1.i;

    public static void main(String[] args){

        new Thread(new Klasse1).start();

        while(true){

            System.out.println("i ist:"+i[0]);
            try{Thread.sleep(200);}catch(InterruptedException e){}

        }

    }

}
PerfectMuffin  24.02.2013, 07:43
@PerfectMuffin

Sorry, der Code war nicht ganz korrekt.

Klasse1 Zeile 6/7 Die Anweisungen müssen zusammen in einer while(true)-Schleife stehen.
Klasse1 Zeile 6: Nach Thread.sleep(200) fehlt ein Semikolon.
Klasse2 Zeile 7: Es muss heißen: new Klasse1()

DerGlueckliche 
Beitragsersteller
 24.02.2013, 11:33
@PerfectMuffin

aha ok also wenn ich den code jetzt richtig verstehe verwendest du in beiden Klassen den Array i lässt ihn aber in beiden selber hochzähle, richtig? So hab ich mir das auch vorhin überlegt und kam zum selben schluss das ich eigl. nur in der bsp. main() den zähler in der anderen klasse starten muss.

Vielen Dank bekommst auch das Sternchen :).

PerfectMuffin  24.02.2013, 11:51
@DerGlueckliche

Nicht ganz, das Array wurde in Klasse1 erstellt und Klasse2 hat eine Referenz des Arrays. Hochgezählt wird nur in Klasse1, Klasse2 arbeitet automatisch mit den aktuellen Werten.

Das liegt daran, dass i jetzt kein primitiver Datentyp mehr ist. Die Adresse ändert sich jetzt durch Neuzuweisen nicht mehr, wodurch auch in der Referenz des Arrays der Wert geändert wird.

DerGlueckliche 
Beitragsersteller
 24.02.2013, 19:19
@PerfectMuffin

achso klar fällt mir gerade auch auf. Danke für die ganze Hilfe :) Mal ganz nebenbei kennst du dich eigl. auch mit Bukkit aus? Du hast ja auf deinem Profil minecraft angegeben und da stellt sich mir die frage ob du plugins oder so schreibst