Getter von Super-Klasse funktioniert nicht

Avarion

Mitglied
Hey zusammen :=)

Habe ein Problem: In meinem Programm (siehe unten) gibt die Konsole bei der Methode beispiel() immer "0" aus, wenn ich den Wert der Variable "b" mit dem Getter abrufen möchte. Zur Verständlichkeit: Klasse A ist die Superklasse von B und in C will ich auf den Getter von Klasse B zugreifen der von Klasse A vererbt worden ist. Aber wie gesagt ich erhalte immer nur null. Wenn ich direkt in Klasse B den setter aufrufe erhalte ich kurioser Weise ein richtiges Ergebnis:

Java:
public class A{

    protected float dx;

    public A(){
        //Konstruktor etc..
    }

    public float getDX(){
        return this.dx;
    }
}


//Klasse B erbt von A

public class B extends A{

    public B(){
        super();
        dx = 1; //überschreibt dx von A
    }
}


public class C{

    private A a;

    public C(A a){    //Hier gebe ich später new B() ein, da B ja von A geerbt hat und somit auch ein Objekt A ist.
        this.a = a;
    }

    public void beispiel(){
        System.out.println(a.getDX());

        //irgendwie kommt hier immer 0 raus?!!
    }
}
 
Zuletzt bearbeitet:
@Avarion
Bei mir funktioniert der Code wie erwartet. Kann es sein, dass du etwas anderen Code hier gepostet als du bei dir ausführst?
 
Interessant wäre mal die main methode und zu sehen was genau du vor ausführung deiner beispiel methode intanziierst 😉

Das hier funktioniert übrigends wie zu erwarten , und gibt 2 aus:

Java:
public class Test{
	
	public static void main(String[] args){
		C c = new C(new B());
		
		System.out.println(c.getX());
	}
	
}

class A{
	
	protected int x;
	
	int getX(){return x;}
}

class B extends A{
	
	public B(){
		x = 2;
	}
}

class C{
	private A a;
	
	
	public C(A a){
		this.a = a;
	}
	
	String getX(){
		return String.valueOf(a.getX());
	}
}
 
Zuletzt bearbeitet:
Interessant wäre mal die main methode und zu sehen was genau du vor ausführung deiner beispiel methode intanziierst 😉

Das hier funktioniert übrigends wie zu erwarten , und gibt 2 aus:

Java:
public class Test{
	
	public static void main(String[] args){
		C c = new C(new B());
		
		System.out.println(c.getX());
	}
	
}

class A{
	
	protected int x;
	
	int getX(){return x;}
}

class B extends A{
	
	public B(){
		x = 2;
	}
}

class C{
	private A a;
	
	
	public C(A a){
		this.a = a;
	}
	
	String getX(){
		return String.valueOf(a.getX());
	}
}

Meine Klasse C liegt in einem anderen Paket als A und B, kann es vielleicht daran liegen? Meine mal sowas ähnliches gelesen zu haben..
Mein richtiger Code ist ziemlich groß, wäre vlt unübersichtlich alles ohne einen Kontext zu posten
 
Nein in welchem Paket die Klassen liegen ist hier eigentlich unrelevant.

Kannst du sichergehen das an den Konstruktor von C ein Objekt von B übergeben wird?
Das wäre der einzige logische Grund (den man anhand des Beispiels erkennen kann) warum "a.getX()" einen falschen Wert liefert.
Erweitere die Methode deine Methode "getX()" einfach mal:

Java:
class C{
.......
 
String getX(){
   if(a instanceof B) {
      System.out.println("C.getX - bin ein B!");
   }
   return String.valueOf(a.getX());
}
}
 
Ist der Wirkungsbereich von protected nicht nur package intern zwischen erbenden Klassen, mir war so !?
 
Zuletzt bearbeitet:
Nein eigentlich sollte protected zwischen erbenen Klassen wirksam sein egal welches Package.
Siehe: java - subclass inheritance with different packages? - Stack Overflow

Ich habe das jetzt mal mit dem instanceof ausprobiert und ich habe sogar mal eine Zahl erhalten, nämlich 0.9284767, immerhin schon einmal nah an der erhofften 1 dran, allerdings zeigt er mir die Zahl nur 1x an und dann konstant eine null.

Ich poste jetzt mal meinen ganzen Code wo mein Fehler drinnen auftaucht:


Java:
//Superklasse Entity
public class Entity {

	protected float x;
	protected float y;
	protected float dx;
	protected float dy;
	protected float speed;
	
	public Entity(float x, float y, float speed){
		this.x = x;
		this.y = y;
		this.speed = speed;
	}
	
	public float getDX(){
		return this.dx;
	}
	
	public float getDY(){
		return this.dy;
	}
}


////////////////////////////////////////////////////////////

public class Player extends Entity{ //erbt von Entity

//bis hier hin habe ich mal den Code gekürzt, damit es für euch übersichtlicher ist ;)

       public Player(){
          //Konstruktor etc...
       }

	public void update(){
		hb.update();
		animation.update();
		
		if(left && !Playstate.map.isColliding(new Point((int)x, (int)y + 4), new Point((int)x, (int)(y + height - 4))) && !down && !up && !right){

		        dx = -speed; //Hier wird dx einen Wert zugewiesen!     <----WICHTIG

		}
		
		if(right && !Playstate.map.isColliding(new Point((int)(x + width), (int)y + 4), new Point((int)(x + width), (int)(y + height - 4))) && !down && !left && !up){

			dx = speed;  //Hier wird dx einen Wert zugewiesen!     <----WICHTIG

		}

		x += dx;
		y += dy;
		
		dx = 0;
		dy = 0;
	}
}

////////////////////////////////////////////////////////////

public class Animation{

        public Animation(Entity entity){
		this.entity = entity;
	}
	
	
	 public void update(){
		
	       System.out.println(entity.getDX()); //HIER ERHALTE ICH 0, warum???!
		
         } 
}
 
Zuletzt bearbeitet:
Vielleicht, weil du (in Zeile 56) ganz explizit dx=0 setzt? Nur so ne Idee... 😛opcorn:
 
Zuletzt bearbeitet:
Vielleicht, weil du (in Zeile 56) ganz explizit dx=0 setzt? Nur so ne Idee... 😛opcorn:

̶k̶̶a̶̶n̶̶n̶̶ ̶̶e̶̶i̶̶g̶̶ ̶̶n̶̶i̶̶c̶̶h̶̶t̶̶,̶̶ ̶̶i̶̶n̶̶ ̶̶d̶̶e̶̶r̶̶ ̶̶u̶̶p̶̶d̶̶a̶̶t̶̶e̶̶ ̶̶m̶̶e̶̶t̶̶h̶̶o̶̶d̶̶e̶̶ ̶̶v̶̶o̶̶m̶̶ ̶̶p̶̶l̶̶a̶̶y̶̶e̶̶r̶̶ ̶̶ü̶̶b̶̶e̶̶r̶̶w̶̶e̶̶i̶̶s̶̶e̶̶ ̶̶i̶̶c̶̶h̶̶ ̶̶d̶̶e̶̶n̶̶ ̶̶w̶̶e̶̶r̶̶t̶̶ ̶̶1̶

Achsoo.. jetzt habe ich den Fehler gefunde, vielen Dank nochmal an Alle!! 🙂 lag wirklich daran.. 😉
 
Zuletzt bearbeitet:

Zurück
Oben