# Auf Methode zugreifen von anderen Klassen



## SteveT (23. Jun 2015)

Hallo,

ich programmiere ein TextAdventure und habe in einer Klasse ein Objekt (Raum) erstellt. In der selben Klasse möchte ich nun auch übersichtshalber die Räume deklarieren. Wenn kein Modifier vor der Methode steht ist es doch vom selben Package aus zugänglich oder? Dann müsste es doch eig kein Problem sein oder?
Alternativ habe ich in der selben Klasse eine Methode erstellt (ist im Hauptcode auskommentiert) aber darauf kann auch nicht zugegriffen werden.
Als Fehlermeldung kommt in Zeile 77: "r cannot be resolved to a variable"

Hier der Code zur Raum Klasse:

```
package com.Steve.tak;

public class Raum {


    String beschra;
    int[] hr = new int[4];


    Raum(String beschr, int n, int s, int o, int w) {
        beschra = beschr;
        hr[0] = n;
        hr[1] = s;
        hr[2] = o;
        hr[3] = w;
    }
    void räume() {
        Raum[] r = new Raum[2];
        r[0] = new Raum("", -1, 2, 3, 4);
        r[1] = new Raum("", 2, 4, -1, -1);


    }
}
```

Und zum "Hauptcode":

```
package com.Steve.tak;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;


public class Norden extends Activity implements View.OnClickListener {


    Button norden;
    Button süden;
    Button osten;
    Button westen;
    Button untersuchen;
    TextView tv;
    TextView ausgabe;
    int derraum = 0;
    int gesundheit = 3;


    @Override
    protected void onCreate(Bundle savedInstanceState) {
        // TODO Auto-generated method stub
        super.onCreate(savedInstanceState);


        setContentView(R.layout.activity_main);


        initialize();
        // räume();


    }


    private void initialize() {
        // TODO Auto-generated method stub
        norden = (Button) findViewById(R.id.norden);
        süden = (Button) findViewById(R.id.sueden);
        osten = (Button) findViewById(R.id.osten);
        westen = (Button) findViewById(R.id.westen);
        untersuchen = (Button) findViewById(R.id.untersuchen);


        tv = (TextView) findViewById(R.id.tv1);
        ausgabe = (TextView) findViewById(R.id.ausgabe);


        Spieler spieler = new Spieler(0, 3, 1, "", new String[] {});
    }




      /*private void räume() {
      Raum[] r = new Raum[2]; r[0] = new Raum("", -1, 2, 3, 4); 
      r[1] = new Raum("jfasdf", 2, 4, -1, -1);
     }*/




    @Override
    public void onClick(View btn) {
        // TODO Auto-generated method stub
        while (gesundheit > 0) {


            tv.setText(r[derraum].beschr);


        }
    }


}
```

Vielen Dank für eure Hilfe!
PS. Das ist mein erster Post, seid Gnädig


----------



## camelCase90 (23. Jun 2015)

Man gibt immer public, protected oder private an.

Gibt man das nicht an, wird automatisch der Default-Modifikator angewendet. Sichtbarkeit im eigenen Package ja.

Aber in der Hauptklasse rufst Du die Methode räume() überhaupt gar nicht auf. Du rufst stattdessen eine Variable r auf, die Du in der Klasse auskommentiert hast.

Außerdem müsstest Du den String beschra und nicht beschr aufrufen, da beschr im Kontrukter als Parameter-Variable dient.

Wenn Du die räume() Methode in der Hauptklasse aufrufen möchtest brauchst Du erstmal eine Objektreferenz oder Du musst die Methode static machen, dann kannst Du die Methode über Raum.räume(); ohne Objektreferenz aufrufen.


----------



## SteveT (23. Jun 2015)

Ich habe meinen Code jetzt geändert, aber ich muss noch irgendwas falsch gemacht haben,denn die Fehlermeldung bleibt.


```
package com.Steve.tak;

public class Raum {


	String beschr;
	int[] hr = new int[4];


	Raum(String beschra, int n, int s, int o, int w) {
		beschr = beschra;
		hr[0] = n;
		hr[1] = s;
		hr[2] = o;
		hr[3] = w;
	}
	public static void räume() {
		Raum[] r = new Raum[2];
		r[0] = new Raum("", -1, 2, 3, 4);
		r[1] = new Raum("", 2, 4, -1, -1);


	}
}
```


```
package com.Steve.tak;

import android.app.Activity;
import android.os.Bundle;
import android.view.View;
import android.content.Intent;
import android.os.Bundle;
import android.view.Menu;
import android.view.MenuItem;
import android.widget.Button;
import android.widget.TextView;


public class Norden extends Activity implements View.OnClickListener {


	Button norden;
	Button süden;
	Button osten;
	Button westen;
	Button untersuchen;
	TextView tv;
	TextView ausgabe;
	int derraum = 0;
	int gesundheit = 3;


	@Override
	protected void onCreate(Bundle savedInstanceState) {
		// TODO Auto-generated method stub
		super.onCreate(savedInstanceState);


		setContentView(R.layout.activity_main);


		initialize();
		Raum.räume();


	}


	private void initialize() {
		// TODO Auto-generated method stub
		norden = (Button) findViewById(R.id.norden);
		süden = (Button) findViewById(R.id.sueden);
		osten = (Button) findViewById(R.id.osten);
		westen = (Button) findViewById(R.id.westen);
		untersuchen = (Button) findViewById(R.id.untersuchen);


		tv = (TextView) findViewById(R.id.tv1);
		ausgabe = (TextView) findViewById(R.id.ausgabe);


		Spieler spieler = new Spieler(0, 3, 1, "", new String[] {});
	}


	@Override
	public void onClick(View btn) {
		// TODO Auto-generated method stub
		while (gesundheit > 0) {


			tv.setText(r[derraum].beschr);


		}
	}


}
```


----------



## camelCase90 (23. Jun 2015)

Mach bei der räume Methode aus void -> raum[] und füge ein return r am ende der Methode ein. Füge am Anfang der Klasse unter den anderen Attributen private Raum[] r; und mach aus Raum.räume() -> r = Raum.räume();


----------



## SteveT (23. Jun 2015)

Es klappt jetzt, aber nicht, wenn ich Raum[] r = Raum.räume(); in eine andere Methode reinschreibe. An sich ist das nicht schlimm, aber mich würde es interessieren wieso das so ist. Sind initialisierte Objekte global oder wie kann ich mir das vorstellen?


----------



## camelCase90 (23. Jun 2015)

Variablen, die du innerhalb von Methoden erzeugst nennt man lokale Variablen und können nur innerhalb der Methoden genutzt werden. Um Variablen in der kompletten Klasse nutzen zu können musst Du den Statischenteil (Objektname Variablennamen innerhalb der Klasse und außerhalb von Methoden deklarieren, als sogenannten Membervariablen oder auch Attribute.Die dynamischen Werte(new Raum() z.B) kannst Du dann innerhalb von Methoden etc ändern. 

Das ganze kannst Du zum Beispiel auch hier nochmal nachlesen:

Tutorial / Java Grundlagen / Variablen


----------



## SteveT (23. Jun 2015)

Ok Danke für die Hilfe!!


----------

