Cannot refer to an instance field xxx while explicitly invoking a constructor

TarGeT

Mitglied
Moin! Hatte vor ein paar Tagen Java "in die Ecke geworfen" weil ich einfach nachfolgendes Problem nicht lösen konnte. Nun habe ich mich wieder zusammengerauft und komme trotzdem nicht weiter. Ich erhalte diesen Fehler "Cannot refer to an instance field Preis while explicitly invoking a constructor" bei folgendem Code:

Java:
class Gifts extends Laptops
{
	Gifts()
	{
		super(Preis, 2, 1000);
	}
	
}

Gebe ich den Preis statt der Variable Preis ein habe ich das Problem nicht. Woran liegts? Wäre echt dankbar wenn mich hier jemand erlösen könnte 😉

Gifts selbst soll beim Aufruf keine weiteren Parameter haben, allerdings hatte die Klasse Laptops diese Parameter (Preis, Ram, Festplattengröße) immer verlangt, wie schaffe ich das nun zu überschreiben?
 
Hi,

ist "Preis" eine Klasse? Du kannst nicht eine Klasse als Parameter eines Konstruktors
übergeben (höchstens über Preis.class, das hat aber nix mit deinem Problem zu tun)!

Gib doch statt "Preis" einfach einen Zahlenwert ein, so wie bei den anderen Parametern
auch.
 
Vermutlich sieht das so in der Art aus?

Java:
public class Laptops {
	protected int preis;
	protected int ramSize;
	protected int hdSize;
	
	public Laptops(int preis, int ramSize, int hdSize) {
		this.preis = preis;
		this.ramSize = ramSize;
		this.hdSize = hdSize;
	}
}

class Gifts extends Laptops {
	Gifts() {
		super(preis, 2, 1000);
	}
}

Das ergibt ja nicht so viel Sinn. Welchen Wert soll
Code:
preis
zu dem Zeitpunkt haben?
 
Ich muss zugeben der eingangs aufgeführte Codeschnippsel ist sicherlich von der Logik her falsch. Wieso sollte Gifts überhaupt etwas kosten und warum trage ich nicht einfach einen fixen Wert ein. Nun das ist mir bewusst, aber mir ist wichtig diese Fehlermeldung zu verstehen, denn dieser wird in meiner JAVA-Zukunft bestimmt wieder auftauchen. Dieser entsteht immer nur dann wenn ich bei
Java:
super(......)
eine Variable statt einen fixen Wert als Parameter eingebe.

Ok wenn es jemanden stört ich kann das auch anders schreiben 😉 Sagen wir ich programmiere ein Spiel und 3 kleine Monster spawnen an einem zufälligen Ort in der Welt = iRandomspawn, und haben das Level 2 und 1000 HP während das Bossmonster immer an einem fixen Punkt auf der Karte (X: 100, Y:100) erscheint. Dabei stammen diese Monster alle von dem Bossmonster ab und verlangen keine Parameter.

Java:
class Monster extends Bossmonster
{

int iRandomspawnX = Underworld.randomnumber();
int iRandomspawnY = Underworld.randomnumber();

    Monster()
    {
        super(iRandomspawnX, iRandomspawnY, 2, 1000);
    }
    
}

Die Variable iRandomspawnX und iRandomspawnY erhalten ihre Werte aus einer Methode einer anderen Klasse die Zufallszahlen vom Typ int ausgibt.

Nun stehe ich wieder vor dem Problem, das Variablen im Konstruktor stehen und das ganze mit der Fehlermeldung "Cannot refer to an instance field iRandomspawnX while explicitly invoking a constructor" quittiert wird. Warum stört sich JAVA daran dass ich eine int Variable statt einem fixen Wert dort eintrage? Ich verstehe das nicht. Wie lässt sich dieses Problem lösen? Ich beiss mir da echt die Zähne aus hehe


Der Konstruktor bzw. Aufruf für das Bossmonster und die kleinen Monster sieht evtl. dann wie folgt aus

Java:
Bossmonster Diablo = new Bossmonster(100, 100, 99, 10000);
Monster Ghul = new Monster();
Monster Zombie = new Monster();
Monster Ghost = new Monster();
 
Zuletzt bearbeitet:
Ja, weil es diese Variablen nicht gibt.

Schreibe
Java:
class Monster extends Bossmonster
{
    Monster(int iRandomspawnX, int iRandomspawnY)
    {
        super(iRandomspawnX, iRandomspawnY, 2, 1000);
    }
    
}
 
Ja dann kannst du da keine Variablen benutzen.

Axo dann verstehe ich es ^^
Dann musst du deine beiden Randoms static machen oder

Die Methoden direkt da einfügen

oder einen neuen Konstrukor bauen, der diese dann setzt.
 
Ja dann kannst du da keine Variablen benutzen.

Axo dann verstehe ich es ^^
Dann musst du deine beiden Randoms static machen oder

Die Methoden direkt da einfügen

oder einen neuen Konstrukor bauen, der diese dann setzt.

Ja es funktioniert! Besten Dank! Also man muss die beiden Randoms static machen.

also
Java:
class Monster extends Bossmonster
{
 
static int iRandomspawnX = Underworld.randomnumber();
static int iRandomspawnY = Underworld.randomnumber();
 
    Monster()
    {
        super(iRandomspawnX, iRandomspawnY, 2, 1000);
    }
    
}

So jetzt muss ich mir mal die "static" Beschreibung durchlesen hehe
 
Das Beispiel überzeugt mich noch immer nicht, da jedes Monster bei dir dadurch ein Bossmonster ist. Es sollte eher andersherum sein: Jedes Bossmonster ist ein Monster.

Code:
static
ist hier sicherlich nicht die Lösung. Dadurch startet jedes Monster an derselben Stelle.

Funktionieren würde dies:
Java:
class Monster extends Bossmonster {
    Monster() {
        super(Underworld.randomnumber(), Underworld.randomnumber(), 2, 1000);
    }
}
 
Oder auch die Variablen erst im Konstruktor initialisieren.
Java:
class Monster extends Bossmonster
{
 
         int iRandomspawnX;
         int iRandomspawnY;
 
    Monster()
    {
        iRandomspawnX = Underworld.randomnumber();
        iRandomspawnY = Underworld.randomnumber();
        super(iRandomspawnX, iRandomspawnY, 2, 1000);
    }
 
Ich hätte mich auch eher für die 2. Variante entschieden.

Jedoch kannst du das nicht so machen, wie DarkRose es angezeigt hat, da das erste, was da gemacht werden muss ist der super() aufruf.

Du musst diesen Random direkt als Parameter übergeben.
 
Oder auch die Variablen erst im Konstruktor initialisieren.
Java:
class Monster extends Bossmonster
{
 
         int iRandomspawnX;
         int iRandomspawnY;
 
    Monster()
    {
        iRandomspawnX = Underworld.randomnumber();
        iRandomspawnY = Underworld.randomnumber();
        super(iRandomspawnX, iRandomspawnY, 2, 1000);
    }

Das geht nicht, da wie bereits gesagt wurde der erste Aufruf in einem Konstruktor der super Call sein muss. Ist nur ein Standard-Konstruktor vorhaben, so ist dieser impliziert automatisch.


Warum sollte das nicht gehen?

Probier's aus 😉
 
Code:
static
ist hier sicherlich nicht die Lösung. Dadurch startet jedes Monster an derselben Stelle.

.....


Stimmt! ...Hab hier sowieso den Wald vor lauter Bäumen nicht mehr gesehen 😉 ... Ok!

Ja stimmt... und die Methode Underworld.randomnumber() gibt sowieso als return einen static int zurück, und daher dann den Rückgabewert in einer Variable zu speichern ist natürlich schlecht, weil es sollen ja gerade nicht alle an einem Punkt spawnen... hehe das habe ich jetzt auch gemerkt.

Aber nichtsdestotrotz der Hinweis mit dem int auf static int war schon mal ein gute Lösungsmöglichkeit falls ich in einem anderen Fall als in diesem Beispiel mit der Fehlermeldung (siehe Titel) konfrontiert werde. Muss mich echt bei allen hier bedanken für die vielen Tipps und Verbesserungsmöglichkeiten :toll:
 

Zurück
Oben