Sub- und Superklassen

K

kneitzel

Gast
Ich fürchte, dass wird genauso ein Drama, wie beim letzten Mal.

Das ist mehr als überdeutlich. Und ich sehe hier auch keinen wirklichen Angriffspunkt zu unterstützen.

Aus meiner Sicht ist es existenziell, dass Xknight eigenständig fehlende Grundlagen erarbeitet. Wir können bei Verständnisproblemen aushelfen, aber wir können keine Java Grundlagen für den TE erarbeiten!

Also ganz konkret für @Xknight:
Du hast keine Ahnung, was Getter und Setter sind? Dann schau Dich mal da um:
https://www.google.com/search?q=java+getter+setter+erklärung

Du hast Probleme, das zu verstehen? Dann sind evtl. diese Links sinnvoll:
https://www.google.com/search?q=java+einführung

Es fehlt die Typangabe für den Parameter anzahlVorhanden.

Allerdings hat die Methode produzieren() laut Aufgabe nur einen Parameter...
Und der Code macht wenig Sinn. Getter so aufrufen soll was bringen? Wenn er eine neue Zutat Instanz erzeugt, dann geht es wohl auch mehr um das Setzen von Werten und nicht um das Abfragen eines Wertes. Ich finde es toll, wie Du hier heran gehst, aber ich sehe da ehrlich gesagt keinen Sinn. Grundlagen muss er sich erarbeiten wollen und dazu gibt es genug Möglichkeiten. Würde zeitlich sogar schneller gehen als die Scharade hier und der Erfolg wäre ein Verständnis und nicht nur ein herumraten ohne irgendwas verstanden zu haben.
 

temi

Top Contributor
Aus meiner Sicht ist es existenziell, dass Xknight eigenständig fehlende Grundlagen erarbeitet. Wir können bei Verständnisproblemen aushelfen, aber wir können keine Java Grundlagen für den TE erarbeiten!

Das ist tatsächlich ein Problem. Wenn er konkrete Verständnisfragen formulieren könnte, dann wäre dafür auch Hilfe möglich, aber so wird es wirklich schwierig.
 

temi

Top Contributor
Die Methode produzieren bekommt die Anzahl der zu produzierenden Einheiten als int Parameter. Wenn bei jeder einzelnen Zutat mindestens genauso viele Einheiten verfügbar sind, dann kann die anzahlVorhanden um die produzierte Anzahl erhöht und die anzahlVerfuegbarerEinheiten bei den Zutaten um die produzierte Anzahl erniedrigt werden. Wenn es erfolgreich war, soll true, andernfalls falls, zurückgegeben werden.

Versuch doch erst mal zu verstehen, was hier gefordert ist und es steht ja haarklein alles da.

1. Die Methode bekommt einen int Parameter für die zu produzierenden Einheiten
2. Für jede Zutat in Milchprodukt muss geprüft werden, ob die ausreichende Anzahl vorhanden ist (jede = Schleife)
3. Mach mal selbst weiter!
 

Xknight

Aktives Mitglied
Ja, die Schleife habe ich auch ausversehen mit rauskopiert, um erstmal die 2 Attribute aus zwei anderen Klassen aufzurufen, ohne eine Fehlermeldung zu bekommen, die Schleife hatte mich da gestört. Die habe ich aber, ich hatte ja eben einen Versuch gemacht, es mit dem getter in der Methode zu tun, jedoch darf man ja nur ein Parameter übergeben, weshalb ich jetzt gerade bezüglich dessen nicht weiter weiß. Den Rest(welcher auch nicht so einen hohen Schwierigkeitsgrad hat) habe ich ja schon selbst gemacht, bis auf die Methode "produzieren" um die es ja gerade geht , scheint auch alles zu funktionieren. Es geht doch wirklich nur um diese "Kleinigkeit" die ich durch Grundlagenwissen im Internet auch nicht erlange , da das nicht unbedingt eine allgemeingültige Anwendung des Getters ist, die ich jetzt vornehmen soll, da wir ja auch keine main benutzen sollen ?
 

Xknight

Aktives Mitglied
Ja, aber den Getter kann ich nicht aufrufen in der produzieren Methode, laut Aufgabe. Außerhalb der Methode bekommt man auch eine Fehlermeldung wenn ich es so mache wie @temi eben sagte in #45.
 

temi

Top Contributor
Ja, aber den Getter kann ich nicht aufrufen in der produzieren Methode, laut Aufgabe. Außerhalb der Methode bekommt man auch eine Fehlermeldung wenn ich es so mache wie @temi eben sagte in #45.
Das war nur eine generelle Antwort auf die Frage, wie man einen Getter aufruft. Die Antwort passt nicht genau zu deinem Problem. Du musst die Getter für jede einzelne Zutat in Milchprodukte aufrufen.

Außerdem kannst du bitte aktuellen Code posten und nicht irgendwelche Experimente.
 

Xknight

Aktives Mitglied
Java:
public boolean produzieren(int anzahl) {
       
        for(int i = 0;i<zutat.length;i++) {
        if(anzahl>=zutat.length) {
            Produkt.getAnzahlVorhanden()+=anzahl;
            Zutat.getAnzahlVerfügbarerEinheiten()-=anzahl;
           
            return true;
        }
    }
        return false;
    }
 

temi

Top Contributor
anzahl < zutat.length liefert dir die Größe des Zutaten-Arrays (= 10). Hilft dir das an dieser Stelle?

Du brauchst die vorhandene Anzahl der Zutat. Du erinnerst dich vage? Zugriff auf ein Array-Element?

Das ist die erste Hälfte der Methode:
Code:
für jede zutat in zutaten {
    wenn die zutat nicht null ist und die anzahl der zutat < anzahl, dann beende mit false;
}
Die Methode produzieren schlägt sofort fehl, sobald eine Zutat nicht in ausreichender Menge vorhanden ist.
 
Zuletzt bearbeitet:
K

kneitzel

Gast
Zusätzlich zu der Anmerkung von temi fallen natürlich auch zwei Zeilen noch massiv ins Auge:

Java:
Produkt.getAnzahlVorhanden()+=anzahl;
Zutat.getAnzahlVerfügbarerEinheiten()-=anzahl;

Daher würde ich noch einmal ganz eindringlich empfehlen, Dass Du einmal bei 0 Anfängst und die Grundlagen von Java lernst, ehe Du irgend etwas anderes versuchst. Dabei ist egal, ob Du Vorlesungs-Mitschriften verwendest und danach lernst (und bei Problemen Google nutzt!) oder ob Du irgend eine andere Quelle nutzt. (Es gibt gute Bücher - den Thread kann ich gerne noch einmal raus suchen. Ich meine "Java von Kopf bis Fuß" und "Schrödinger programmiert Java" sind da beide gut weg gekommen.)

Diese ganzen Versuche hier sind unsinnig aus meiner Sicht und führen zu nichts. Die Probleme von der letzten Aufgabe tauchen hier wieder unverändert auf. Zugriffe auf ein Array, ein Array durchlaufen ... das wurde ganz offensichtlich nicht verstanden. Ich würde mit meinem etwas mehr an Abstand in diesem Thread sogar behaupten, dass die Grundlagen so weit fehlen, dass die Aufgabenstellung nicht einmal verstanden werden kann von Dir (Eine Grundvoraussetzung für die Lösung!) ....

@temi: Ich fürchte, dass dies so nichts bringt. Ich schlage einen Kurswechsel hier vor.

@Xnight: Vergiss alles rund um Java. Erledige erst diese Punkte. Und zwar wirklich zu 100% nur diese Punkte - nicht eine einzige Zeile Java will ich sehen!
a) Beschreibe in eigenen Worten etwas ausführlicher, was die Aufgabe verlangt.
b) Beschreibe in eigenen Worten die Grundlage: Was hast Du in welchen Objekten? Und was für Eigenschaften / Inhalte haben diese Objekte.
c) Was musst Du mit dem aus b) machen um a) zu erledigen?

Wie stelle ich mir das vor? Such Dir ein Szenario aus. Fabrik mit Lager, Küche mit Vorratsschrank, was auch immer. Da darfst Du gerne etwas Fantasie walten lassen. (aber nicht zuviel Fantasie. Die Heinzelmännchen, die Nachts kommen und alles erledigen, so dass Deine Lösung einfach ist: "Schlafen gehen, damit die Heinzelmännchen kommen können" soll es bitte nicht geben!)
 

Xknight

Aktives Mitglied
Java:
public boolean produzieren(int anzahl) {
        
        for(int i = 0;anzahl<zutat.length;i++) {
        if(anzahl>=zutat.length) {
            
            Produkt.getAnzahlVorhanden+=anzahl;
            Zutat.getAnzahlVerfügbarerEinheiten-=anzahl;
            
            return true;
        }
    }
        return false;
}

Da musste ich nur bei Produkt und Zutat was adden steht in der ersten Zeile mit static
Java:
public abstract class Produkt{
    public static int getAnzahlVorhanden;
    private String name;
    private int anzahlVorhanden;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAnzahlVorhanden() {
        return anzahlVorhanden;
    }
    public void setAnzahlVorhanden(int anzahlVorhanden) {
        this.anzahlVorhanden = anzahlVorhanden;
    }
    Produkt(String name, int anzahlVorhanden) {
    
     this.name=name;
    this.anzahlVorhanden=anzahlVorhanden;
        
    }
    
    public abstract class  Milchprodukt extends Produkt{

        Milchprodukt(String name, int anzahlVorhanden) {
            super(name,anzahlVorhanden);
        }
        
        
        
    }
    
    public class Obst extends Produkt{
        
        Obst(String name, int anzahlVorhanden){
            super(name,anzahlVorhanden);
        }
    }
}

Java:
public class Zutat {
    public static int getAnzahlVerfügbarerEinheiten;
    private String name;
    private int anzahlVerfügbarerEinheiten;
    public String getName() {
        return name;
    }
    public void setName(String name) {
        this.name = name;
    }
    public int getAnzahlVerfügbarerEinheiten() {
        return anzahlVerfügbarerEinheiten;
    }
    public void setAnzahlVerfügbarerEinheiten(int anzahlVerfügbarerEinheiten) {
        this.anzahlVerfügbarerEinheiten = anzahlVerfügbarerEinheiten;
    }
    
    Zutat(String name, int anzahlVerfügbarerEinheiten){
        this.name=name;
        this.anzahlVerfügbarerEinheiten=anzahlVerfügbarerEinheiten;
    }
    
    
    public int nachkaufen(int einheiten) {
     anzahlVerfügbarerEinheiten+=einheiten;
        
        return anzahlVerfügbarerEinheiten;
    }
    

}
 

temi

Top Contributor
Ok. Damit bin ich raus. Viel Spaß noch damit!

Falls du wissen willst warum: In dem gezeigten Code ist null komma nichts umgesetzt von dem, was in den letzten 66 Beiträgen diskutiert wurde. Alles ist falsch, alles ist Scheiße!
 
K

kneitzel

Gast
Ich habe jetzt keine Fehlermeldungen. Ich habe die jetzt alle beseitigt. ^^
Ja, das mit den keine Fehlermeldungen bekommen ist ein ganz wichtiges Kriterium. Da dies offensichtlich das wichtigste Kriterium für Dich ist, möchte ich einfach eine Musterlösung teilen:

Java:
public class Loesung {
    public static void main(String[] args) {}
}

Keine Fehlermeldung! Also Kriterium erfüllt.

Da gewisse Basics fehlen, möchte ich noch vorsichtshalber erläutern, wie der Code zu verwenden ist:
a) Eine Datei Loesung.java erstellen mit genau dem gegebenen Code.
b) Übersetzen einfach innerhalb des Verzeichnisses mit dieser Datei mit javac Loesung.java
==> Keine Fehlermeldung
c) Testen, ob zur Laufzeit Fehler kommen: Wieder in diesem Verzeichnis ein einfaches: java Loesung
==> Keine Fehlermeldung

Also ich hoffe, dass niemand böse ist, dass ich jetzt eine Musterlösung erstellt habe. Aber so habe ich es evtl. etwas abkürzen können.

@Xknight: Mein Hinweis bezüglich Java Basics solltest Du befolgen. Und wenn Du da Zeit investiert hast: Dann bitte einfach #65 die Punkte a), b) und c) von mir beherzigen und damit dann als erstes die Aufgabe und den Lösungsweg verstehen.
Und bis zu dem Zeitpunkt ist die Musterlösung oben eine super Sache - vor allem habe ich die Hoffnung, dass Du den Code verstanden hast. (Den Code würde ich zur Not aber auch noch erläutern, so es daran scheitern sollte.)
 

jono

Top Contributor
Ich verstehe nicht wieso ihr so antwortet, man kann das doch normal klären, ohne sich so zu äußern(auch wenn es schwer fällt für euch als Profis). Wir beschäftigen uns nun mal erst seit kurzem damit. @temi Was ist denn daran alles scheiße ? Wäre sehr nett von dir wenn du sagst wo genau da ein Fehler liegt , es ging hier letztendlich nur darum, wie man die Attribute einer anderen Klasse in der Methode einer wieder anderen Klasse auruft. Wenn du sonst noch einen Fehler siehst, wäre es lieb wenn du diesen einfach konkret benennst. :)
@JustNobody Ich weiß nicht was du mit deinem letzten Beitrag forderst? Was daran ist eine Musterlösung, zur Lösung des Problems (die Attribute in einer Klasse in einer anderen aufrufen) trägt es nichts bei?
Ich finde es auch sehr sinnvoll, auch wenn ihr das anders seht, aber es ist doch verständlich, dass man fragt, wie das funktioniert , wenn man im Internet nichts Hilfreiches dazu findet wie genau man das jetzt macht? Dass man dann hier mal fragt, ist dann die letzte Option, die man (was ich euch nicht unterstellen will!!!) nicht mit Füßen treten sollte. Mit der Zeit sollte man merken, dass es immer besser wird und zu sagen die Grundlagen sind in keiner Hinsicht vorhanden stimmt doch überhaupt nicht. Ich bitte da einfach um Verständnis bei dem Text hier.
 

temi

Top Contributor
Was ist denn daran alles scheiße?

So ziemlich alles, bis auf die automatisch erzeugten Getter und Setter.

Klingt hart, ist es auch. Schon der Hinweis in Beitrag #2 ist trotz mehrmaliger Erwähnung im weiteren Verlauf nicht verbessert worden. Sorry, da gibt es nicht viel mehr zu sagen und ihr geht weder auf Hinweise ein, noch fragt ihr, was ihr nicht verstanden habt.

Du hast ja vermutlich die gleiche Aufgabe und bist vermutlich ebenso überzeugt, dass alles ganz toll ist: Fang bei #2 an und arbeite dich durch. Falls du eine Frage dazu hast, dann stell sie.
 
K

kneitzel

Gast
Ich verstehe nicht wieso ihr so antwortet, man kann das doch normal klären, ohne sich so zu äußern(auch wenn es schwer fällt für euch als Profis). Wir beschäftigen uns nun mal erst seit kurzem damit. @temi Was ist denn daran alles scheiße ? Wäre sehr nett von dir wenn du sagst wo genau da ein Fehler liegt , es ging hier letztendlich nur darum, wie man die Attribute einer anderen Klasse in der Methode einer wieder anderen Klasse auruft. Wenn du sonst noch einen Fehler siehst, wäre es lieb wenn du diesen einfach konkret benennst. :)
@JustNobody Ich weiß nicht was du mit deinem letzten Beitrag forderst? Was daran ist eine Musterlösung, zur Lösung des Problems (die Attribute in einer Klasse in einer anderen aufrufen) trägt es nichts bei?
Ich finde es auch sehr sinnvoll, auch wenn ihr das anders seht, aber es ist doch verständlich, dass man fragt, wie das funktioniert , wenn man im Internet nichts Hilfreiches dazu findet wie genau man das jetzt macht? Dass man dann hier mal fragt, ist dann die letzte Option, die man (was ich euch nicht unterstellen will!!!) nicht mit Füßen treten sollte. Mit der Zeit sollte man merken, dass es immer besser wird und zu sagen die Grundlagen sind in keiner Hinsicht vorhanden stimmt doch überhaupt nicht. Ich bitte da einfach um Verständnis bei dem Text hier.
Sorry, aber der erste Thread mit euch war schon recht extrem. Vieles wurde mehrfach gesagt. Und Lerneffekt war - wie man hier dann erkennt - annähernd null. Und im Internet findet sich extrem viel. Erste Links habe ich schon gebracht. Für die Abgabe sehe ich schwarz - das war schon beim letzten Thread mehr als grenzwertig und da wurde euch auch schon ein "Vergesst es" gesagt.

Ich hoffe, ihr wollt mir nicht erzählen, dass ihr jetzt erst angefangen habt und der böse Prof. euch gleich so eine Aufgabe gegeben hat. Ihr habt nicht eine Vorlesung oder Übung zum Thema Java gehabt .... Auch an der Uni wird Stoff erst vorgetragen, in Übungen vertieft und dann in Aufgaben muss man dann das Erlernte praktisch umsetzen.

Wenn man Hinweise gibt ... und sich immer wieder wiederholt ... und dann bekommt man Code wie in 66 gezeigt mit einem tollen "Ich habe alle Fehlermeldungen beseitigt", dann fühle ich mich schlicht etwas verarscht. Und so hart es auch klingen mag: Versucht erst einmal die Grundlagen zu beherrschen. Ihr scheint euch massiv zu überschätzen. Schon im letzten Thread aber auch hier. Angeblich habt ihr Getter und Setter verstanden und dann kommen gewisse Dinge, die das Gegenteil beweisen.

Fang ganz am Anfang an! Was für Typen kennt Java, was sind Geltungsbereiche von Variablen, und und und. Nutzt dazu ein Lehrbuch das Kapitel für Kapitel auch eine Lernkontrolle hat. Wenn ihr da auch Probleme stößt: Fragt nach. Wir helfen gerne - auch wenn ihr hier nicht unbedingt den Eindruck habt. Und Grundlagen werden auch sehr ausdauernd erläutert, bis es verstanden wurde....

Aber Threads sind kein "wir lehren euch alles von Grund auf am Beispiel einer Aufgabe".

Ja, an dem Code hätte man einfach Dinge hinterfragen können. So wäre dies denkbar:
Was macht denn der Code hier:
public static int getAnzahlVerfügbarerEinheiten;
in Zutat oder eben der Code:
public static int getAnzahlVorhanden;
aus Produkt.
Also bitte erst erläutern, was der Code genau macht und dann bitte erläutern, wozu der in der Aufgabe genau gut sein soll (außer irgendwie Fehlermeldungen zu beseitigen).

ABER: Das ist nicht zielführend. Ihr macht etwas (ich unterstelle euch, dass ihr nicht versteht, was ihr da überhaupt macht), bekommt Fehlermeldungen (die ihr nicht versteht) und versucht dann irgendwie irgendwas, nur um die Fehlermeldung los zu werden. Das bringt nichts und so kommt man generell nicht zum Ziel.

Bei jeder Aufgabe ist das Vorgehen immer gleich:
a) Aufgabe im Detail verstehen! Was ist gegeben? Was wird verlangt?
b) Lösungsweg finden -> Da ist noch nichts mit Java oder so. Überlegt euch erst einmal, wie alles zusammenhängen soll und wo was gemacht werden muss.
c) Die Lösungswege, die man sich in b) überlegt hat kann man dann umsetzen. Erst hier kommt dann Java ins Spiel.

Wenn ihr a) und b) habt, dann kann man immer noch überlegen, ob und wie man euch leitet. Da kann man das, was ihr konkret braucht, zur Not ja in "Java ist auch eine Insel" aufzeigen, so dass ihr da dann das notwendige Wissen anlest.
 

jono

Top Contributor
Java:
public class Milchprodukt implements Produzierbar {
    private double fettgehalt;
    Zutat[] zutaten = null;

    public double getFettgehalt() {
        return fettgehalt;
    }

    public void setFettgehalt(double fettgehalt) {
        this.fettgehalt = fettgehalt;
    }

    Milchprodukt(double fettgehalt, Zutat[] zutaten) {
        this.zutaten = zutaten;
        this.fettgehalt = fettgehalt;
        this.zutaten = new Zutat[10];

    }

    public class Kaese extends Milchprodukt {
        public Kaese(double fettgehalt, Zutat[] zutaten) {
            super(fettgehalt, zutaten);

        }

    }

    public class Yoghurt extends Milchprodukt {

        public Yoghurt(double fettgehalt, Zutat[] zutaten) {
            super(fettgehalt, zutaten);

        }
    }

    public boolean produzieren(int anzahl) {

        if (anzahl <= zutaten.length) {

            Produkt.getAnzahlVorhanden += anzahl;
            Zutat.getAnzahlVerfuegbarerEinheiten -= anzahl;

            return true;
        }

        return false;
    }

    public boolean addZutat(Zutat zutat) {
        for (int i = 0; i < zutaten.length; i++) {
            if (zutaten[i] == null) {
                zutaten[i] = zutat;
                return true;
            }
        }
        return false;

    }

    public boolean removeZutat(Zutat zutat) {
        for (int i = 0; i < zutaten.length; i++) {
            if (zutaten[i] == zutat) {
                zutaten[i] = null;
                return true;
            }
        }
        return false;
    }

}
Ja, @JustNobody, du hast schon Recht.
Den Code auf der ersten seite von @Xknight hatte ich nicht durchgeschaut. Ich habe es mal gemacht, wie ich es meine korrekt gemacht zu haben. Mir geht es darum, ist das korrekt, wenn nein dann bitte nur sagen, was genau nicht und ich versuche es selbst zu analysieren. Ich will nicht nach schon besagter Strategie "Mal Raten und Herumprobieren" vorgehen, sondern ernsthaft darüber Gedanken machen und nicht ständig irgendeinen Code posten und wieder fragen: Ist dieser korrekt? Sondern ich werde konkrete Fragen stellen.
 

temi

Top Contributor
Wäre sehr nett von dir wenn du sagst wo genau da ein Fehler liegt , es ging hier letztendlich nur darum, wie man die Attribute einer anderen Klasse in der Methode einer wieder anderen Klasse auruft.

Das ist nun also die Antwort auf die oben gestellt Frage:
Java:
class Foo {
    
    private int value = 42;
    
    public int getValue(){
        return value;
    }
}

class Bar {
    
    private Foo foo = new Foo();
    
    public void doSomething() {
        int value = foo.getValue();
    }
}
 

temi

Top Contributor
Ich habe es mal gemacht, wie ich es meine korrekt gemacht zu haben. Mir geht es darum, ist das korrekt, wenn nein dann bitte nur sagen, was genau nicht und ich versuche es selbst zu analysieren.

Nicht korrekt. Schau dir auf der zweiten Seite des Themas das Klassendiagramm von @mihe7 an. Ihr habt lauter freie Klassen. Warum gibt es in deinem Code innere Klassen? Lies dazu auch die Beiträge auf Seite 1 und 2.

Fang mal damit an und korrigier das.
 
K

kneitzel

Gast
Java:
public class Milchprodukt implements Produzierbar {
    private double fettgehalt;
    Zutat[] zutaten = null;

    public double getFettgehalt() {
        return fettgehalt;
    }

    public void setFettgehalt(double fettgehalt) {
        this.fettgehalt = fettgehalt;
    }

    Milchprodukt(double fettgehalt, Zutat[] zutaten) {
        this.zutaten = zutaten;
        this.fettgehalt = fettgehalt;
        this.zutaten = new Zutat[10];

    }

    public class Kaese extends Milchprodukt {
        public Kaese(double fettgehalt, Zutat[] zutaten) {
            super(fettgehalt, zutaten);

        }

    }

    public class Yoghurt extends Milchprodukt {

        public Yoghurt(double fettgehalt, Zutat[] zutaten) {
            super(fettgehalt, zutaten);

        }
    }

    public boolean produzieren(int anzahl) {

        if (anzahl <= zutaten.length) {

            Produkt.getAnzahlVorhanden += anzahl;
            Zutat.getAnzahlVerfuegbarerEinheiten -= anzahl;

            return true;
        }

        return false;
    }

    public boolean addZutat(Zutat zutat) {
        for (int i = 0; i < zutaten.length; i++) {
            if (zutaten[i] == null) {
                zutaten[i] = zutat;
                return true;
            }
        }
        return false;

    }

    public boolean removeZutat(Zutat zutat) {
        for (int i = 0; i < zutaten.length; i++) {
            if (zutaten[i] == zutat) {
                zutaten[i] = null;
                return true;
            }
        }
        return false;
    }

}
Ja, @JustNobody, du hast schon Recht.
Den Code auf der ersten seite von @Xknight hatte ich nicht durchgeschaut. Ich habe es mal gemacht, wie ich es meine korrekt gemacht zu haben. Mir geht es darum, ist das korrekt, wenn nein dann bitte nur sagen, was genau nicht und ich versuche es selbst zu analysieren. Ich will nicht nach schon besagter Strategie "Mal Raten und Herumprobieren" vorgehen, sondern ernsthaft darüber Gedanken machen und nicht ständig irgendeinen Code posten und wieder fragen: Ist dieser korrekt? Sondern ich werde konkrete Fragen stellen.
Also da ist schon einiges gesagt worden. Was direkt auffällt ist, dass da verschachtelte Klassen sind. So ihr nicht wirklich spezielle Anforderungen habt, dann gewöhnt euch immer an: Jede Klasse kommt in eine eigene Datei die genau so heißt, wie die Klasse (nur mit .java dran).

Dann fällt auf:
Ihr vergleicht Zutaten mit ==. Das ist etwas, das in euren Tests evtl. funktioniert, aber das liegt einfach nur daran, dass ihr Zutaten einmal erzeugt und das war es. Referenztypen werden mit equals verglichen. Oder - so ihr equals in Zutat nicht überschrieben habt - ggf. über die getName() Eigenschaft.

Über die Vererbungshirarchie wurde viel gesprochen. Milchprodukt ist doch ein Produkt....
Wenn das korrekt wäre, dann würde man wohl auch nicht auf solche Ideen kommen:
Produkt.getAnzahlVorhanden += anzahl;
a) getAnzahlVorhanden in Produkt? Soll Produkt ein solches, statisches Element haben? Dann ist es ein Attribut - wieso fängt das mit einem Verb an? Mit Verben fangen nur Methoden an!
b) Getter / Setter nutzen. Wenn ich ein Attribut per Getter auslesen und per Setter setzen kann: Wie kann ich denn dann einen Wert auslesen, etwas dazu addieren und dann wieder setzen? Tipp: mit += geht das nicht!

Das reicht hoffentlich für den Anfang ...
 

temi

Top Contributor
@temi ,Was genau meinst du mit freien Klassen?

Damit sind ganz normale Klassen gemeint. Das "Gegenstück" dazu sind sogenannte innere Klassen oder nested classes oder verschachtelte Klassen. Ihr habt eine Anzahl von ganz normalen Klassen, die wie @JustNobody geschrieben hat, jede in ihre eigene Datei kommen. Siehe auch #35 und #39, sowie #40

Bis auf die Klasse Milchprodukte handelt es sich dabei um ganz simple Klassen mit einem oder mehreren Attributen, einem Konstruktor und Getter/Setter Methoden. Mehr oder weniger kann euch eine gute IDE fast die komplette Klasse automatisch erstellen.

Nur bei Milchprodukte sind drei Methoden zu implementieren, die etwas mehr Nachdenken erfordern.
 

jono

Top Contributor
Wie meide ich die inneren Klassen?
Java:
z.B.:
public class Kaese extends Milchprodukt {

}

statt:
public class Milchprodukt extends Produkt implements Produzierbar {

public class Kaese extends Milchprodukt {
}
}
 

temi

Top Contributor
Wie meide ich die inneren Klassen?
Java:
z.B.:
public class Kaese extends Milchprodukt {

}

statt:
public class Milchprodukt extends Produkt implements Produzierbar {

public class Kaese extends Milchprodukt {
}
}
Ja. In dem "statt:"-Teil ist Kaese eine innere Klasse von Milchprodukt.
So ihr nicht wirklich spezielle Anforderungen habt, dann gewöhnt euch immer an: Jede Klasse kommt in eine eigene Datei die genau so heißt, wie die Klasse
 

jono

Top Contributor
Ich habe doch für jede Klasse eine eigene Datei angelegt mit dem Namen Kaese.java, Produkt.java,Produzierbar.java,... .
 

jono

Top Contributor
Java:
public class Kaese extends Milchprodukt {

}
Das wäre dann also die Klasse Kaese in Klasse Milchprodukt?
 

temi

Top Contributor
Java:
public class Kaese extends Milchprodukt {

}
Das wäre dann also die Klasse Kaese in Klasse Milchprodukt?
Wenn dass innerhalb der Klasse Milchprodukt steht, ja. Die Klasse Kaese in der Datei Kaese.java sieht ja genauso aus.

Warum steht das da drin? Was hast du damit bezweckt?
 

jono

Top Contributor
Das steht nicht in der Klasse Milchprodukt sondern das ist die Klasse Kaese.
Damit bezweckt man, dass die Klasse Milchprodukt von Kaese überschrieben wird?
 

jono

Top Contributor
Habe die ganze Zeit versucht, darauf zu kommen, was jetzt genau mit innerer Klasse gemeint war, das Problem war aber, dass ich nicht präzise genug auf mich gehört habe, konkrete Überlegungen anzustellen und bei Verständnisproblemen einfach mal nachzufragen. Oder einfach , ich habe mich dumm gestellt ? Vielleicht kann man es so nennen...
 

Rahza

Mitglied
Ganz ehrlich Leute: Beherzigt einfach, was temi und JustNobody euch empfohlen haben, dass ihr die Grundlagen aufarbeiten solltet. Ich bin im selben Modul wie ihr und ich weiß, dass man einfach nur die Lösung will um die Punkte zu kriegen, aber damit werden ihr auf die Nase fallen. Arbeitet einfach die Folien vom Tutorium nochmals durch und schaut euch ganz einfache Tutorials nochmals an. Für den Einstieg fand ich panjutorials auf Youtube nicht schlecht, auch wenn er nur die absoluten Grundlagen erklärt.

Ich habe selbst die Erfahrung gemacht, dass es bei der Klausur überhaupt nichts bringt, wenn ihr zwar die Punkte während den Übungen zusammengekratzt habt, aber es dann doch an Grundlagen hakt.
 

Rahza

Mitglied
Was die innere Klasse betrifft: Schaut euch mal an, wie der Prof. die Abgabe verlangt. Es werden explizit 7 verschiedene Klassen verlangt. Da sollte es schon klar sein, dass ihr 7 verschiedene Dateien erzeugen sollt.
Also am besten genauso wie in der Aufgabenstellung beschrieben entsprechend verschiedene Klassen und Interface anlegen, dann für jede Klasse die Attribute gemäß Beschreibung rein, automatisch Getter und Setter generieren. Anschließend vielleicht die Verebungs- und Schnittstellenbeziehungen setzen, sowie Aggregationsbeziehung. Dann habt ihr den Wirrwarr schonmal entschlüsselt, obwohl ein User hier sogar das UML dazu gepostet hat. Und danach könnt ihr euch an die Methoden ranmachen.
 

jono

Top Contributor
Ja bis jetzt schaut es ganz gut aus, ich probiere es jetzt mal alleine und melde mich gleich nochmal, falls etwas wirklich nicht klappen sollte.
 

jono

Top Contributor
Java:
public class abstract Milchprodukt extends Produkt implements Produzierbar {

Warum wird bei mir "abstract" rot unterstrichen?
Angezeigt wird: Syntax error on token "abstract", delete this token.
 
K

kneitzel

Gast
Java Syntax für eine Klasse;
VOR das Schlüsselwort class kommen Kennzeichnungen für die Klasse wie public, abstract, ....
Also public abstract class Milchprodukt ......
 

jono

Top Contributor
Java:
       class Foo {
   
    private int value = 42;
   
    public int getValue(){
        return value;
    }
}

class Bar {
   
    private Foo foo = new Foo();
   
    public void doSomething() {
        int value = foo.getValue();
    }
}
 

Ähnliche Java Themen

Neue Themen


Oben