Java Methodenaufruf aus anderer Klasse

te one

Lt. Commander
Registriert
Apr. 2009
Beiträge
1.255
Hallo,
bin noch Anfänger in Java und komme gerade irgendwie nicht weiter. Es geht nur um einen Methodenaufruf.
Hintergrund:
Player ist eine Unterklasse von Object.
Ein Object hat die Methode getX()
Nun möchte ich in der gameloop-Methode (wird immer wieder ausgeführt und aktualisiert die Koordinaten), die zur Klasse Game gehört, auf den Rückgabewert von Object.getX() zugreifen.

Folgendes habe ich jetzt Programmiert:
Game.java:
Code:
public class Game extends Canvas
{
//usw...Konstruktor...
	public void gameLoop() {
//Zeit seit letzter Aktualisierung wird berechnet, Koordinaten werden berechnet
		if (player.getX()+800>=8000) {
//In der Zeile hier kann er nicht auf player.getX() zugreifen
		}
	}
	public static void main(String[] args) {
		Player player=new Player(1,1,"123",3);
		Game g =new Game();
		g.gameLoop();
		System.out.println(player.getX());
//Hier gehts zum Beispiel darauf zuzugreifen
	}
}

Hier die Überklasse von Player "Object":
Code:
public class Object {
//Attribute
	public int getX() {
	return this.coordx;
	}
}

Und noch die Unterklasse selbst ("Player"):
Code:
public class Player extends Object {
	private int lifes;
	public Player(int coordx, int coordy, String image, int lifes) {
		super(coordx, coordy, image);
//Hiermit sollte ja der Konstruktor von Object aufgerufen werden (public Object(int coordx, int coordy, String image))
		this.lifes=lifes;
	}
	public int getLifes() {
		return this.lifes;
	}
	public void changeLifes(int change) {
		this.lifes=this.lifes+change;
	}
	public void setLifes(int lifes) {
		this.lifes=lifes;
	}
	
}

Ich verstehs einfach nicht wieso ich von der gameloop() aus nicht auf player.getX() zugreifen kann
 
Wenn ich das so auf die Schnelle richtig sehe:
Du hast in main die Deklaration "Player player = new Player(...)", versuchst aber in einer anderen Methode (gameloop) darauf zuzugreifen. In dem Fall könntest du den Spieler global in der Klasse deklarieren, ganz oben mit "private static Player player;". In main kannst du dann "player = new Player(...)" aufrufen, hast aber in gameloop trotzdem Zugriff auf player.
 
Jo so seh ich das auch:

Die Lösung des Problems: du haust einfach in die game-classe als Klassenvariable (einfach ne Zeile über dem Konstruktor) nen Player player rein.
Dann machst du in der main nicht Player player=new Player(1,1,"123",3); sondern player=new Player(1,1,"123",3);

Oben kann er in deiner Version natürlich kein getX aufrufen, weils da player nicht gibt (Lokalvariable von main)
 
Zuletzt bearbeitet:
Dankeschön, das war die Lösung des Problems.

Wirklich ungewohnt wenn man immer nur PHP programmiert hat, dass man jetzt erstmal am besten allen Variablen einen Datentyp verpasst.

jetzt muss ich nur nochmal nachlesen warum:
static Player player;
und nicht:
Player player;
(oben wenn ich die Attribute angebe)
 
Gut, das Attribut private könnte man wirklich noch dazu schreiben...
Private würde dafür sorgen, dass das Objekt nur von der Klasse verändert und gelesen werden darf.

Das static finde ich in dem Zusammenhang nicht zwingend nötig aber schaden würde das auch nicht. Private static ist egtl. dennoch sinnlos (static ist da um Objekte in den Kontext von Klassen zu setzen, obwohl sie da nicht explizit und sinnvoll hinpassen. Solche Objekte sollen normal von außen manipuliert werden können, deswegen verwendet man normal public static). Deswegen würde ich das static streichen...
 
Zuletzt bearbeitet:
Also für was public usw. ist, weiß ich.

Allerdings hab ich das mit static nicht verstanden.
Aber ich glaube gerade eben hab ichs geblickt.
Gehe ich recht in der Annahme das die folgenden beiden Codeschnipsel den Unterschied verdeutlichen?:
Code:
static Player player;
player=new Player(...);
//später kann ich dann auf das Objekt player zugreifen

Code:
Player player;
new Player(...);
//hier wird ein nur ein neues Objekt erzeugt. Jetzt frage ich mich bloß: Wie kann ich da jemals wieder drauf zugreifen?
 
Zuletzt bearbeitet: (";" vergessen)
Soweit ich weiß gilt folgendes:

Static gibt spätestens dann Probleme, wenn du eine static Methode hast und aus der eine Aufrufst die nicht static ist, z.B. eine Objektmethode ( x.getLives(); ) oder umgekehrt.
Ich tendiere dazu static nur zu benutzen, wenn es wirklich nötig ist (wenn eine main existiert sollte sie immer public static void sein). Solange du am PC arbeiten darfst würde ich dazu raten Eclipse oder eine andere gute Programmierumgebung zu verwenden, dann werden solche static und non-static Probleme sofort angezeigt. Tiefer bin ich in der static-Thematik leider nicht drin, da hat auch die Programmierungs-Vorlesung nicht viel mehr geholfen.

Ich bin mir nicht sicher ob dein Codervergleich sowas zeigen sollte oder nicht, tendiere aber zu nein.
 
Zuletzt bearbeitet: (Smiley statt ; ))
Static-Variablen existieren nur einmalig, auch wenn die Klasse in der Sie sich befinden mehrmals instanziiert wird.
Hättest du in der Klasse Player beispielsweise die Zeile
privat static int lives;
dann wäre der int-Wert für alle Spieler gleich (was keinen Sinn macht).
Wenn du einen Player wie oben geschrieben global in deiner Haupt-Klasse anlegen willst, so muss der static sein, andernfalls kannst du nicht aus der main-Methode darauf zugreifen ("non-static variable cannot be referenced from a static context" oder sowas in der Art dürfte die Fehlermeldung sein).
 
Oh, das seh ich jetzt erst...
Dann würde ich das static streichen und die Player-initialisierung dahin machen wo sie hingehört, in den Konstruktor (von Game).
Die Spielelogik gehört übrigens imo genau so wenig in eine main, nur als Anmerkung wenn du an der rumbaust...
 
Zuletzt bearbeitet:
Du solltest übrigens die Klasse nicht Object nennen, weil System.Object ist schon ne Standard-Java-Klasse... Object ist auch sehr nichtssagend,

Sinnvoller wäre sowas wie GUIElement, AbstractGUIElement, ...
 
Anub1s schrieb:
Static-Variablen existieren nur einmalig, auch wenn die Klasse in der Sie sich befinden mehrmals instanziiert wird.
Hättest du in der Klasse Player beispielsweise die Zeile
privat static int lives;
dann wäre der int-Wert für alle Spieler gleich (was keinen Sinn macht).
Wenn du einen Player wie oben geschrieben global in deiner Haupt-Klasse anlegen willst, so muss der static sein, andernfalls kannst du nicht aus der main-Methode darauf zugreifen ("non-static variable cannot be referenced from a static context" oder sowas in der Art dürfte die Fehlermeldung sein).

Aso ok, dann hab ich den Unterschied glaub ich jetzt verstanden.
Fehlermeldung war genau die von dir genannte^^

platin91 schrieb:
Oh, das seh ich jetzt erst...
Dann würde ich das static streichen und die Player-initialisierung dahin machen wo sie hingehört, in den Konstruktor (von Game).
Die Spielelogik gehört übrigens imo genau so wenig in eine main, nur als Anmerkung wenn du an der rumbaust...

Hm, das stimmt eigentlich. Eigentlich könnte ich den Player echt durch den Game-Konstuktor erzeugen.
Denn nen Game ohne Player macht ja wenig Sinn.
Die Spielelogik werde ich noch i-wohin auslagern. Bin mir nur noch nicht so sicher, wie ich das dann mit Plattformen bastel, damit der darauf stehen kann. (Hab zwar schon einige Ansätze, aber so richtig gut gefällt mir davon noch nichts. Ich habe allerdings den Code eines anderen Spiels, da müsste auch irgendwo so ne Kollisionserkennung laufen. Mal gucken was der Programmierer dort gemacht hat)

Eclipse nutze ich zurzeit auch. Aber die Fehlermeldung helfen mir noch nicht sehr viel weiter. Ich nutze Java erst seit 2 Tagen ein bisschen, da fehlt einfach noch ein bisschen die Erfahrung.

1668mib schrieb:
Du solltest übrigens die Klasse nicht Object nennen, weil System.Object ist schon ne Standard-Java-Klasse... Object ist auch sehr nichtssagend,

Sinnvoller wäre sowas wie GUIElement, AbstractGUIElement, ...

Der Name wird sowieso nochmal geändert, wenn ich mir dann im Klaren darüber bin, wie ich die Gegner usw. erzeuge (KI wird auch noch so ein Thema...).
Aber danke für den Hinweis.
 
Zuletzt bearbeitet:
Zurück
Oben