Vererbung Fragen zum Konstruktor

MacMurdock

Aktives Mitglied
Hi,

Ich bin noch relativ neu in Java und komme bei einer Aufgabe nicht wirklich weiter.

Wie kann ich meinen Konstruktor so einstellen, dass wenn einem Parameter ein ungültiger Wert übergeben wird alle Attribute ungültig gesetzt werden? Desweiteren soll der Konstruktor nur von weitergeleiteten Klassen aufgerufen werden dürfen. Ich habe mir das mal mit Super() durchgelesen aber das hat damit was ich machen will eigentlich nichts zu tun oder?

Danke für alle Hilfen!
 

TKausL

Top Contributor
Was meinst du mit weitergeleiteten Klassen? Wenn ein Argument ungueltig ist kannst du eine IllegalArgumentException schmeissen.
 
F

Firephoenix

Gast
Ich denke mal mit dem Konstruktor will er sowas haben wie eine Klasse Auto und der Konstruktor von Auto soll nur von Klassen wie Audi, Vw oder Opel aufgerufen werden können.
Die Lösung dafür wäre Auto abstrakt zu machen, dann kann man aus subklassen super(...) aufrufen, aber keine konkrete Instanz aus einer anderen Klasse heraus erstellen.

Falls das nicht gemeint war bleibt noch die Möglichkeit, die Sichtbarkeit der Klasse/des Konstruktors z.B. auf protected zu setzen.

Gruß
 

MacMurdock

Aktives Mitglied
Ich denke mal mit dem Konstruktor will er sowas haben wie eine Klasse Auto und der Konstruktor von Auto soll nur von Klassen wie Audi, Vw oder Opel aufgerufen werden können.
Die Lösung dafür wäre Auto abstrakt zu machen, dann kann man aus subklassen super(...) aufrufen, aber keine konkrete Instanz aus einer anderen Klasse heraus erstellen.

Falls das nicht gemeint war bleibt noch die Möglichkeit, die Sichtbarkeit der Klasse/des Konstruktors z.B. auf protected zu setzen.

Gruß



Genau das war gemeint, ich habe die Überprüfungen jetzt im Konstruktor drin, ich weiss aber nicht wirklich wie der Befehl lautet, dass ich bei einer falschen Eingabe alle Parameter ungültig mache.

hier mal mein Code:
Java:
public LagerArtikel(int regalNr, int fachNr, int artikelCode) {
		super();
		if ( regalNr <= 0 )
			 throw new IllegalArgumentException( "Keine RegalNr <= 0 erlaubt!" );
		this.regalNr = regalNr;
		if ( fachNr <= 0 )
		    throw new IllegalArgumentException( "Keine FachNr <= 0 erlaubt!" );
		this.fachNr = fachNr;
		if ( artikelCode <= 0 )
		    throw new IllegalArgumentException( "Kein ArtikelCode <= 0 erlaubt!" );
		this.artikelCode = artikelCode;
	}


Danke nochmal
 
B

bone2

Gast
was ist denn "ungültig" für ein zustand?
entweder wirfst du eine Exception, wie in deinem Fall oder du setzt alles null, -1, 0 was auch immer du gerne hättest. Das ist alelrdings viel unsauberer und fehleranfälliger.
Wenn du eine Exception wirfst, kommt kein Objekt zustande und deine Probleme sind gelöst.
Überprüfe auch erst alle wichtigen werte und setze die attribute dannach.
 

Landei

Top Contributor
Du brauchst nichts "ungültig machen". Wenn du einen Fehler wirfst, wird kein Objekt erzeugt, und das, was davon schon "da" ist, bekommt niemand zusehen, außer der Garbage-Collector, der es auffuttert - aus die Maus! Und das ist auch das übliche Vorgehen bei ungültigen Eingaben. Der aufrufende Code kann entscheiden, wie er mit dem Fehler umgeht (z.B. einen Nutzer auf den Fehler hinweist und nochmal zur Eingabe auffordert oder so)
 
F

Firephoenix

Gast
Ungültig musst du deine Attribute eigentlich nicht machen (außer das wird in irgend einer Übung explizit gefordert).
Durch die Exceptions verhinderst du direkt, dass dein Objekt mit einem illegalen Zustand erzeugt wird.
Egal welchen Parameter du falsch eingibst, dir fliegt die Exception um die Ohren (die je nachdem ob sie gefangen wird oder nicht dein Programm abstürzen lässt).

Möglich wäre zur Eingabe sowas:

Java:
LagerArtikel artikel = null;
do{
//parameter z.B. per Konsole eingeben
//..
try{
artikel = new LagerArtikel(int regalNr, int fachNr, int artikelCode);
}catch(IllegalArgumentException e){
//Dem Benutzer mit der Exception erklären, dass er Mist gebaut hat
}
while(artikel == null);

alternativ:
Java:
public LagerArtikel artikelAusEingabeErzeugen(){
try{
//parameter z.B. per Konsole eingeben
//..
return new LagerArtikel(int regalNr, int fachNr, int artikelCode);
}catch(IllegalArgumentException e){
//Dem Benutzer mit der Exception erklären, dass er Mist gebaut hat
artikelAusEingabeErzeugen();
}

Geht natürlich beliebig komplex, mit Abbruchmethoden, Exceptions weiterwerfen usw.

Gruß
 

MacMurdock

Aktives Mitglied
Ok, danke nochmal ich habs jetzt verstanden, eigentlich hätte ich da auch selbst drauf kommen können..

Ich hätte dennoch eine Frag bezüglich der Instanziierung und Konstruktorverkettung bei der Vererbung.

Ich habe einmal die Hauptklasse LagerArtikel und einmal die Subklasse HeimwerkerGeraet. Ich möchte, dass HeimwerkerGeraet die Attribute regalNr und fachNr von der Hauptklasse übernimmt, ist das in meinem Code richtig so?
Ausserdem ist laut meiner Aufgabe gefordert, dass alle Heimwerker Geräte in regal 17 liegen sollen. Ich verstehe nicht so wirklioch was damit gemeint ist, hat da jemand evtl. eine Idee?


Java:
public abstract class LagerArtikel {
	
	private int regalNr = 0;
	private int fachNr = 0;
	private int artikelCode;

	
	
	
	public LagerArtikel(int regalNr, int fachNr, int artikelCode) {
		if ( regalNr <= 0 )
			 throw new IllegalArgumentException( "Keine RegalNr <= 0 erlaubt!" );
		this.regalNr = regalNr;
		if ( fachNr <= 0 )
		    throw new IllegalArgumentException( "Keine FachNr <= 0 erlaubt!" );
		this.fachNr = fachNr;
		if ( artikelCode <= 0 )
		    throw new IllegalArgumentException( "Kein ArtikelCode <= 0 erlaubt!" );
		this.artikelCode = artikelCode;
	}

	
	public int getRegalNr(){
		return regalNr++;
	}
	
	public int getFachNr(){
		return fachNr++;
	}
	
	public int getArtikelCode(){
		if(artikelCode < 0)
			  throw new IllegalArgumentException("Fehler, artikelCode muss positiv sein!");
		return artikelCode++;
	}
	
}

Java:
public abstract class HeimwerkerGeraet extends LagerArtikel {

	private String hersteller;
	private String geraeteklasse;
	
	
	public HeimwerkerGeraet(int regalNr, int artikelCode, String hersteller, String geraeteklasse){
		super(regalNr, artikelCode);
		this.hersteller = hersteller;
		this.geraeteklasse = geraeteklasse;
		
	}
	
	
}
 
B

bone2

Gast
du hast die fachnummer in HeimwerkerGeraet vergessen.
Mit regal 17 ist sicher gemeint, das der Konstruktor HeimwerkerGeraet(foo, bar) keine möglichkeit enthält ein Regal zu übergeben, sondern super immer mit regalnr 17 aufgerufen wird.

Warum erhöhst du die Fach und Regalnummer jedes mal wenn du sie abfragst? Bewegt sich der Artikel jedes mal ein Stück weiter durch den Laden, wernn irgendwer wissen will wo er gerade ist? Zumal er sich nach der abfrage verschiebt, man findet ihn also nie.
 
F

Firephoenix

Gast
Im ersten Codestück fehlt eine [c]}[/c] vor [c]while[/c]

Warum hat das Forum auch keinen eingebauten Code-Parser der meckert :p

Was bei dem Code auch noch nicht ganz passen aussieht:
Java:
public int getRegalNr(){
        return regalNr++;
    }

Jedes mal wenn du die RegelNr abrufst rückst du das Objekt eins weiter, entweder muss das ++ weg, oder die Methode benötigt einen neuen Namen.

Gruß
 

MacMurdock

Aktives Mitglied
Ja da hab ich was komplett falsch gemacht, was ich eigentlich wollte ist, dass bei jedem erstellten Objekt der Wert um eins erhöht wird.
Ok das mit der Zuweisung müsste ja relativ einfach sein, wäre nett wenn ihr mir nochmal Feedback zu meinem Code geben könntet.


Java:
public abstract class LagerArtikel {
	
	private int regalNr = 0;
	private int fachNr = 0;
	private int artikelCode;

	
	
	
	public LagerArtikel(int regalNr, int fachNr, int artikelCode) {
		if ( regalNr <= 0 )
			 throw new IllegalArgumentException( "Keine RegalNr <= 0 erlaubt!" );
		this.regalNr = regalNr;
		regalNr++;
		if ( fachNr <= 0 )
		    throw new IllegalArgumentException( "Keine FachNr <= 0 erlaubt!" );
		this.fachNr = fachNr;
		fachNr++;
		if ( artikelCode <= 0 )
		    throw new IllegalArgumentException( "Kein ArtikelCode <= 0 erlaubt!" );
		this.artikelCode = artikelCode;
	}

	
	public int getRegalNr(){
		return regalNr;
	}
	
	public int getFachNr(){
		return fachNr;
	}
	
	public int getArtikelCode(){
		if(artikelCode < 0)
			  throw new IllegalArgumentException("Fehler, artikelCode muss positiv sein!");
		return artikelCode++;
	}
	
}


Java:
public abstract class HeimwerkerGeraet extends LagerArtikel {

	private String hersteller;
	private String geraeteklasse;
	
	
	public HeimwerkerGeraet(int regalNr, int fachNr, int artikelCode, String hersteller, String geraeteklasse){
		super(regalNr, fachNr, artikelCode);
		this.hersteller = hersteller;
		this.geraeteklasse = geraeteklasse;
		regalNr = 17;
	}
	
	
}
 
B

bone2

Gast
nix da.
Du kannst den nicht im Konstruktor erhöhen, dass muss irgendwo da passieren, das mitzählen, wo du die Lagerartikel erstellst.

Außerdem hat dein Heimwerkergerät immernoch eine RegalNr im Konstruktor, die gehört da nicht hin. Du musst Super(17) als regalnummer aufrufen.

wieso wird der ArtikelCode beim get überprüft und verändert? Vererbung und OOP ist logisch an der realen welt orientiert. Ein Artikelcode verändert sich doch nicht jedes mal, wenn du an der Information im Baumarkt fragst wie die Artikelnummer der Bohrmaschine ist.

Ein Lagerartikel kennt doch keine anderen, die nummern zu erhöhen ist nur falsch und unlogisch.
Wenn ich eine Säge ins Lager räumen will, bekommt sie ein Regal und Fach von mir und ich gebe es dem Lagerarbeiter, der packt die doch dann nicht einfach ins nächste Fach und Regal und überklebt den Strichcode den ich da drauf geklebt hab ohne es mir auch noch zu sagen. Ich finde die Säge ja nie wieder.
 
Zuletzt bearbeitet von einem Moderator:

MacMurdock

Aktives Mitglied
nix da.
Du kannst den nicht im Konstruktor erhöhen, dass muss irgendwo da passieren, das mitzählen, wo du die Lagerartikel erstellst.

Außerdem hat dein Heimwerkergerät immernoch eine RegalNr im Konstruktor, die gehört da nicht hin. Du musst Super(17) als regalnummer aufrufen.

wieso wird der ArtikelCode beim get überprüft und verändert? Vererbung und OOP ist logisch an der realen welt orientiert. Ein Artikelcode verändert sich doch nicht jedes mal, wenn du an der Information im Baumarkt fragst wie die Artikelnummer der Bohrmaschine ist.

Ein Lagerartikel kennt doch keine anderen, die nummern zu erhöhen ist nur falsch und unlogisch.
Wenn ich eine Säge ins Lager räumen will, bekommt sie ein Regal und Fach von mir und ich gebe es dem Lagerarbeiter, der packt die doch dann nicht einfach ins nächste Fach und Regal und überklebt den Strichcode den ich da drauf geklebt hab ohne es mir auch noch zu sagen. Ich finde die Säge ja nie wieder.



Also muss ich die Werte in den Settern erhöhen oder? Es ist Teil der Aufgabe, dass man den ArtikelCode überprüfen soll, was für einen Sinn das genau hat weiss ich auch nicht.
hier nochmal mein Code ich hoffe jetzt stimmts.

Java:
public abstract class LagerArtikel {
	
	private int regalNr = 0;
	private int fachNr = 0;
	private int artikelCode;

	
	
	
	public LagerArtikel(int regalNr, int fachNr, int artikelCode) {
		if ( regalNr <= 0 )
			 throw new IllegalArgumentException( "Keine RegalNr <= 0 erlaubt!" );
		this.regalNr = regalNr;
		if ( fachNr <= 0 )
		    throw new IllegalArgumentException( "Keine FachNr <= 0 erlaubt!" );
		this.fachNr = fachNr;
		if ( artikelCode <= 0 )
		    throw new IllegalArgumentException( "Kein ArtikelCode <= 0 erlaubt!" );
		this.artikelCode = artikelCode;
	}

	
	
	public void setRegalNr(int regalNr) {
		this.regalNr = regalNr;
		regalNr++;
	}

	public void setFachNr(int fachNr) {
		this.fachNr = fachNr;
		fachNr++;
	}

	public void setArtikelCode(int artikelCode) {
		this.artikelCode = artikelCode;
	}



	public int getRegalNr(){
		return regalNr;
	}
	
	public int getFachNr(){
		return fachNr;
	}
	
	public int getArtikelCode(){
		if(artikelCode < 0)
			  throw new IllegalArgumentException("Fehler, artikelCode muss positiv sein!");
		return artikelCode;
	}
	
}


Java:
public abstract class HeimwerkerGeraet extends LagerArtikel {

	private String hersteller;
	private String geraeteklasse;
	
	
	public HeimwerkerGeraet(int regalNr, int fachNr, int artikelCode, String hersteller, String geraeteklasse){
		super(17, fachNr, artikelCode);
		this.hersteller = hersteller;
		this.geraeteklasse = geraeteklasse;
		regalNr = 17;
	}
	
	
}
 
B

bone2

Gast
er wird überhaupt nie erhöht, wie kommst du darauf? Ich hatte schon geschrieben, das das nciht in einer Klasse passiert.
Wenn ich dem Lagerarbeiter sage (setFach) er möge die bitte in fach 20 packen, geht der doch nicht los udn packt sie in Fach 21...

Java:
public abstract class LagerArtikel {
    private int regalNr = 0;
    private int fachNr = 0;
    private int artikelCode;
    
    public LagerArtikel(int regalNr, int fachNr, int artikelCode) {
        if ( regalNr <= 0 )
             throw new IllegalArgumentException( "Keine RegalNr <= 0 erlaubt!" );
        this.regalNr = regalNr;
        if ( fachNr <= 0 )
            throw new IllegalArgumentException( "Keine FachNr <= 0 erlaubt!" );
        this.fachNr = fachNr;
        if ( artikelCode <= 0 )
            throw new IllegalArgumentException( "Kein ArtikelCode <= 0 erlaubt!" );
        this.artikelCode = artikelCode;
    }
    
    public void setRegalNr(int regalNr) {
        this.regalNr = regalNr;
    }
 
    public void setFachNr(int fachNr) {
        this.fachNr = fachNr;
    }
 
    public void setArtikelCode(int artikelCode) {
        this.artikelCode = artikelCode;
    }
 
    public int getRegalNr(){
        return regalNr;
    }
    
    public int getFachNr(){
        return fachNr;
    }
    
    public int getArtikelCode(){
        return artikelCode;
    }
    
}

Java:
public abstract class HeimwerkerGeraet extends LagerArtikel {
    private String hersteller;
    private String geraeteklasse;
    
    public HeimwerkerGeraet(int fachNr, int artikelCode, String hersteller, String geraeteklasse){
        super(17, fachNr, artikelCode);
        this.hersteller = hersteller;
        this.geraeteklasse = geraeteklasse;
    }
}

Java:
public class Test2 {
    public static void main(String[] args) {
        HeimwerkerGeraet bohrer = new HeimwerkerGeraet(20, 123456, "Bosch", "Bohrmaschine")
        HeimwerkerGeraet saege = new HeimwerkerGeraet(21, 123457, "Bosch", "Kreissäge")
    }
}
 

MacMurdock

Aktives Mitglied
Du hast Recht, ich hab da wohl ein bisschen was verwechselt.
Ich häng aber schon wieder bei der nächsten Aufgabe, ich soll eine Klasse "Stichsaege" erstellen, dass ein HeimwerkerGeraet ist und als solches von der geraeteKlasse "Stichsaege" ist.
Ich verstehe nicht wirklich wie ich die geraeteklasse aus der Klasse HeimwerkerGeraet verwenden kann.


Also folgendes geht schonmal nicht:
Java:
public class Stichsaege extends HeimwerkerGeraet {

	private int watt;
	private String modell;
	
	
	
	public Stichsaege(String geraeteklasse, String hersteller, int artikelCode, String modell){
		super("Stichsaege", hersteller, artikelCode);
		this.modell = modell;
	}
}
 

MacMurdock

Aktives Mitglied
Kann mir da keiner weiterhelfen?

Die Aufgabe lautet:

Eine Stichsäge hat das private Attribut watt (vom Typ int), das die Leistung angibt und das private Attribut Modell (vom Typ String).
Stichsäge hat einen Konstruktor, der Hersteller, Modell, Artikel-Code und die Leistung übergibt.

hier nochmal mein Code:

Java:
public abstract class LagerArtikel {
	
	private static final long groessterArtikelCode = 16012012;
	
	private int regalNr = 0;
	private int fachNr = 0;
	private int artikelCode;

	
	
	
	public LagerArtikel(int regalNr, int fachNr, int artikelCode) {
		if ( regalNr <= 0 )
			 throw new IllegalArgumentException( "Keine RegalNr <= 0 erlaubt!" );
		this.regalNr = regalNr;
		if ( fachNr <= 0 )
		    throw new IllegalArgumentException( "Keine FachNr <= 0 erlaubt!" );
		this.fachNr = fachNr;
		if ( artikelCode <= 0 )
		    throw new IllegalArgumentException( "Kein ArtikelCode <= 0 erlaubt!" );
		this.artikelCode = artikelCode;
	}

	
	
	public void setRegalNr(int regalNr) {
		this.regalNr = regalNr;
		regalNr++;
	}

	public void setFachNr(int fachNr) {
		this.fachNr = fachNr;
		fachNr++;
	}

	public void setArtikelCode(int artikelCode) {
		this.artikelCode = artikelCode;
	}



	public int getRegalNr(){
		return regalNr;
	}
	
	public int getFachNr(){
		return fachNr;
	}
	
	public int getArtikelCode(){
		if(artikelCode < 0)
			  throw new IllegalArgumentException("Fehler, artikelCode muss positiv sein!");
		return artikelCode;
	}
	
}	




public abstract class HeimwerkerGeraet extends LagerArtikel {

	private String hersteller;
	private String geraeteklasse;
	
	
	public HeimwerkerGeraet(int regalNr, int fachNr, int artikelCode, String hersteller, String geraeteklasse){
		super(17, fachNr, artikelCode);
		this.hersteller = hersteller;
		this.geraeteklasse = geraeteklasse;
		regalNr = 17;
	}
	
	
}






public class Stichsaege extends HeimwerkerGeraet {

	private int watt;
	private String Modell ;
	
	
	public Stichsaege(int regalNr, int fachNr, int artikelCode,
			String hersteller, String geraeteklasse, int watt, String modell) {
		super(regalNr, fachNr, artikelCode, hersteller, geraeteklasse);
		this.watt = watt;
		Modell = modell;
	}
	
	
}


Ich verstehe einfach nicht wie ich nur den Artikel Code aus der Klassse LagerArtikel und den Hersteller aus HeimwerkerGerät in den Konstruktor von Stichsäge übergeben kann.
 
Zuletzt bearbeitet:

Landei

Top Contributor
Eine Stichsäge wäre nun mal nicht "komplett", wenn du nicht alle Konstruktor-Argumente übergibst. [c]geraeteklasse[/c] wird z.B. zum Initialisieren der Oberklasse gebraucht.

Natürlich kannst du auch diesen Konstruktor anpassen, oder einen weiteren hinzufügen, der nur deine gewünschten Argumente enthält. Du musst aber aufpassen, dass das Ding auch "funktionsfähig" bleibt.

Was würde dir z.B. ein Date-Objekt nützen, das nur den Monat enthält? Nicht viel, deshalb wirst du nur Konstruktoren an Date finden, deren Argumente sich irgendwie zu einem kompletten Datum zusammenfriemeln lassen.
 

MacMurdock

Aktives Mitglied
Ok Danke,
ich habe noch eine weitere Frage, ich soll in einer anderen Aufgabe die Stichsäge in das fach mit der Nummer legen die den aktuellen Wochentag kennzeichnet, also ich soll dem Fach die Nummer quasi übergeben. Ich habe schonmal rumprobiert, es aber nicht wirklich hinbekommen.
Vielleicht kann ja nochmal jemand helfen.

Java:
import java.util.Calendar;

public class Stichsaege extends HeimwerkerGeraet {

	private int watt;
	private String Modell ;
	
	
	public Stichsaege(int regalNr, int fachNr, int artikelCode,
			String hersteller, String geraeteklasse, int watt, String modell) {
		super(regalNr, fachNr, artikelCode, hersteller, geraeteklasse);
		this.watt = watt;
		Modell = modell;
		fachNr = Calendar.getInstance().get(DAY_OF_MONTH);
	}
	
	
}

danke!
 

MacMurdock

Aktives Mitglied
Ich will ja nicht rumstressen oder so aber es wär echt cool wenn mir das mit dem Kalender nochmal jemand erklären könnte, ich kenne sonst leider niemanden der Java kann und bis Morgen brauche ich das Ganze.

Danke.
 

Spin

Top Contributor
Moin,

also wo liegt denn genau das Problem?

Ok Danke,
ich habe noch eine weitere Frage, ich soll in einer anderen Aufgabe die Stichsäge in das fach mit der Nummer legen die den aktuellen Wochentag kennzeichnet, also ich soll dem Fach die Nummer quasi übergeben. Ich habe schonmal rumprobiert, es aber nicht wirklich hinbekommen.

Die Stichsäge soll also in ein Fach gelegt werden. In welches Fach ? Die Stichsäge hatte eine Nummer beispielsweise 7 und soll dann am Tag 7 in MonatX , Jahr X gelegt werden?

Wenn die Nummer den aktuellen Wochentag kennzeichnet, kann diese ja nur von 0 -6 sein.

Was hast du vor, gib mal ein Beispiel !
 

MacMurdock

Aktives Mitglied
Danke erstmal für die Antwort,
Die Stichsäge soll in das Fach gelegt werden, dass den Tag der Woche kennzeichnet. Das ganze soll mit Calendar.getInstance() realisiert werden.
Ich habe das ganze im Konstruktor gemacht aber es scheint dabei noch einen Fehler zu geben, ich glaube ich hab da was falsch gemacht...


Java:
public Stichsaege(int regalNr, int fachNr, int artikelCode,
			String hersteller, String geraeteklasse, int watt, String modell) {
		super(regalNr, fachNr, artikelCode, hersteller, geraeteklasse);
		this.watt = watt;
		Modell = modell;
		fachNr = Calendar.getInstance().get(DAY_OF_WEEK);
	}
 

Spin

Top Contributor
Also hier siehst du schonmal wie Calendar funktioniert: Calendar Values

Java:
    java.util.Calendar c = java.util.Calendar.getInstance();
    c.get(java.util.Calendar.YEAR)
    c.get(java.util.Calendar.MONTH)
    c.get(java.util.Calendar.DAY_OF_MONTH)

Mt Day of Month, bekommst du den aktuellen Tag zurück.
Das bedeutet das die Stichsäge heute in das Fach 14 gelegt wird.

Java:
// ganz schön viele argumente !!!!
public Stichsaege(int regalNr, int fachNr, int artikelCode,
            String hersteller, String geraeteklasse, int watt, String modell) {
        super(regalNr, fachNr, artikelCode, hersteller, geraeteklasse);

        // klassen felder
        this.watt = watt;
        this.Modell = modell;

        java.util.Calendar c = java.util.Calendar.getInstance();
        this.fachNr = c.get(DAY_OF_MONTH);
    }

Fertig!
 

MacMurdock

Aktives Mitglied
Danke erstmal, ich bekomme wenn ich deinen Code verwende allerdings noch 2 Fehlermeldungen in der Zeile

Java:
this.fachNr = c.get(DAY_OF_MONTH);

Multiple markers at this line
- DAY_OF_MONTH cannot be resolved to a
variable
- The field LagerArtikel.fachNr is not visible
 

Spin

Top Contributor
Na hoppla, zeig mal deine ganze Klasse stichsäge:

Und nochmal, sry:

Java:
import java.util.*;
public class Stichsaege {

private int watt = 0;
private int fachNr = 0;
private String Modell = "";

public Stichsaege(int regalNr, int fachNr, int artikelCode,
            String hersteller, String geraeteklasse, int watt, String modell) {
        super(regalNr, fachNr, artikelCode, hersteller, geraeteklasse);
 
        // klassen felder
        this.watt = watt;
        this.Modell = modell;
 
        Calendar c = Calendar.getInstance();
        this.fachNr = c.get(Calendar.DAY_OF_MONTH);
    }
}

sorry :oops:
 

MacMurdock

Aktives Mitglied
Musst dich nicht entschuldigen, ich bin froh, dass ich überhaupt Hilfe bekomme.

Hier nochmal meine KLasse:

Java:
import java.util.Calendar;

public class Stichsaege extends HeimwerkerGeraet {

	private int leistung;
	private String modell;
	
	
	public Stichsaege(int regalNr, int fachNr, int artikelCode,
			String hersteller, String geraeteklasse, int watt, String modell) {
		super(regalNr, fachNr, artikelCode, hersteller, geraeteklasse);
		this.leistung = leistung;
		this.modell = modell;
		   Calendar c = Calendar.getInstance();
	       this.fachNr = c.get(Calendar.DAY_OF_MONTH);
	}


	public int getLeistung() {
		return leistung;
	}

	public void getLeistung(int leistung) {
		this.leistung = leistung;
	}

	public String getModell() {
		return modell;
	}

	public void setModell(String modell) {
		this.modell = modell;
	}
	
	
	
	
	
}

Jetzt bekomme ich folgeden Fehlermeldungen:

Multiple markers at this line
- Line breakpoint:Stichsaege [line: 15] - Stichsaege(int, int, int, String, String,
int, String)
- The field LagerArtikel.fachNr is not visible
 

Spin

Top Contributor
Hey ho,

bitte lass dich jetzt ein wenig von der IDE helfen. Deine Fehler sind nicht schwierig und wenn du bis heute abend nichts hinbekommen hast schaue ich nochmal. Am besten du gehst step by step nochmal ein ava Tutorial durch - das hilft , immer mit der Ruhe :)
The field LagerArtikel.fachNr is not visible

Ist ja auch klar du hast dafür kein Feld angelegt, also kein:


Java:
private int fachNr = 0;

Aber Eclipse oder irgend eine andere Umgebung würde meckern! :toll:
 

MacMurdock

Aktives Mitglied
Aber wieso muss ich das Feld nochmal anlegen wenn ich es doch per super() mit übergebe?

Dann habe ich nochmal eine Frage zu einer Methode die die Arraylist durchsucht ich bekomme es einfach nicht hin vielleicht kann mir da nochmal jemand helfen:

Java:
public void durchsuche(){
          if (artikelliste.contains(String suchwort)) {
                System.out.println("True");
            } else {
                throw new LagerException(getModell(),"Dieses Modell ist nicht vorhanden");
            }
        
    }

Wie kann ich in der Liste nach einem String, das eingegeben werden soll suchen
 
S

SlaterB

Gast
dass die Oberklasse LagerArtikel bereits ein Attribut fachNr hat ist zwar strenggenommen aus der Fehlermeldung ersichtlich,
aber nicht allgemein klar, jedenfalls nicht auf verschiedenen Seiten, wenn nach Tagen andere antworten,
durchaus solche relevanten Details ansprechen

neues Thema wäre deutlicher, dann aber die alten möglichest beenden, von neuen auf die alten verweisen, damit man evtl. nachlesen kann was schon besprochen wurde
(sage ich, da ich gerade das zweite parallele geschlossen habe)

von der Subklasse kannst du nichts an das private Attribut der Oberklasse zuweisen, da braucht es eine set-Methode,

der Konstruktor hat ja auch schon ein Parameter fachNr, was ist mit dem?
strenggenommen könnte man hoffen, die neue fachNr beim super-Aufruf weiterzugeben, das ist hier aber schwer,
der super-Aufruf muss immer der erste sein, da kann man nicht vorher groß rechnen,

ok in einer Zeile geht es auch:
Java:
super(regalNr, Calendar.getInstance().get(Calendar.DAY_OF_MONTH), artikelCode, hersteller, geraeteklasse);
oder sonst per Methode beliebig langen Code:
Java:
super(regalNr, rechneLangeNeueNummer(), artikelCode, hersteller, geraeteklasse);
aber schön ist das nie


-------------

Java:
public void durchsuche(String suchwort){
          if (artikelliste.contains(suchwort)) {
das war nun schwer?
man man man, aber bevor du dich ewig über mich ärgerst soweit mal ein Tipp
 
Zuletzt bearbeitet von einem Moderator:

Neue Themen


Oben