# Kleine (große) Java Aufgabe



## xJay (26. Jun 2016)

Und zwar habe ich eine Java Aufgabe.. Man soll einen Student erstellen, der soll MatrNr, Name, und die Prüfungsergebnisse anzeigen. 
Dann soll man Module erstellen, die den Namen, den Dozent, die SWS, und die CPs enthält.
Dann soll zum Schluss soll noch eine Prüfungsliste mit dem Modul, dem Prüfer und dem Ergebnis erstellt werden.

Meine Frage ist jetzt wie gehe ich da ran... Ich kann zwar Programmieren(mehr oder weniger) aber ich weiß nicht wie die Struktur von dem ganzen aussehen soll... Ich habe ja den Student, das Modul und die Prüfungsergebnisliste. Muss ich also für jeden der einzelnen Punkte eine Klasse erstellen und dort dann set und get etc. reinpacken und dann hinterher nur eine main methode machen, in der ich diese Klassen zum befüllen eines Arrays nutze, was ich dann anschließend ausgebe ? ..

bin für jeden "denkanstoß" sehr dankbar

Mfg Jay


----------



## Cromewell (26. Jun 2016)

Ich würde es, glaube ich so machen, dass ich Student, Modul und Prüfungsliste als Klasse habe, ja.


----------



## xJay (26. Jun 2016)

kann mir vielleicht jemand kurz und schmerzlos den unterschied zwischen setter und getter sagen. und ob ich beide davon brauche. habe das noch nicht so ganz verstanden und google kanns mir auch nicht erklären


----------



## Dompteur (26. Jun 2016)

Die Instanzvariablen einer Klasse sollen von außen nicht direkt zugreifbar sein.
Daher gibt es üblicherweise für jede Instanzvariable einen Setter und einen Getter.
Mit dem Setter kannst du von "draußen" den Wert verändern. Mit dem Getter kannst du ihn abfragen.


----------



## Cromewell (26. Jun 2016)

Wenn du private Klassenvariablen hast, und du aus anderen Klassen darauf zugreifen willst (normalerweise kann die andere Klasse sie ja nicht sehen), dann löst man das über getter (zum auslesen der Variable) und setter (zum setzen). 

```
public class Bespiel{

    private int klassenVariable;

    public void setKlassenVariable(int x){
       klassenVariable = x;
    }
    public int getKlassenVariable(){
        return klassenVariable;
    }
}
```


```
public class Nutzen{

    public static void foo(){
        Beispiel b = new Beispiel();
        b.setKlassenVariable(5);
        System.out.println(b.getKlassenVariable()); //5
    }

}
```


----------



## xJay (26. Jun 2016)

aber wenn ich dann in meinem beispiel in der main methode die klasse student "befüllen" möchte dann muss ich ja setter und getter haben oder ?


----------



## xJay (26. Jun 2016)

Ich habe jetzt folgendes Problem: Und zwar möchte ich in der Klasse Prüfungen (bestehend aus Modul, Prüfer, Ergebnis) die Variable Modul aus der Klasse Modul erben. Die anderen sollen jedoch nicht geerbt werden. Wie muss mein Konstruktor dann aussehen. Bisher hatte ich es nur das ich Entweder alle Variablen geerbt habe oder keine.. habe hier als beispiel mal einen Ausschnitt aus meinem Quellcode.

```
String Modul;
    String Prüfer;
    int Ergebnis;
   
    public Prüfung(String modul, String prüfer, int ergebnis) {
        super();
        Modul = modul;
        Prüfer = prüfer;
        Ergebnis = ergebnis;
    }
```


----------



## mrBrown (26. Jun 2016)

Du erbst an der Stelle überhaupt nicht.
Was du machst, ist dem Konstruktor Werte übergeben. Wenn du dem irgendwas nicht übergeben willst, lass es weg. Was damit aber deine Klasse Modul mit zu tun hat, kann man bei dem kurzem Codestück nur raten...

Variablennamen schreibt man klein


----------



## xJay (26. Jun 2016)

Also dann nochmal ich habe folgende Klasse Prüfungen

```
public class Prüfung extends Modul{

    String Modulname;
    String Student;
    String Prüfer;
    int Ergebnis;
 
 

}
```

und die Klasse Student.


```
public class Student extends Prüfung {

        int MatrNr;
        String Name;
        String Prüfungsergebnisse;
}
```


Nun möchte ich in die Klasse Prüfungen die Ergebnisse von den Prüfungen Speichern.
Diese sollen dann aber so abzurufen sein, dass ich nur mit dem Studentennamen eine Liste als Ausgabe bekomme, in der Alle Prüfungsergebnisse des Studenten stehen (Hoffe das ist verständlich erklärt). Weiß leider echt gerade nicht wie ich da vorgehen muss. Muss ich nur den Namen erben oder sonst noch etwas.. ich weiß da echt nicht weiter und ich habe auch keine Ahnung wie ich dafür eine Lösung finde da ich für die Frage ja schon formulierungsprobleme habe ... hoffe mir kann jemand helfen.

und die Variablennamen schreibe ich noch klein


----------



## mrBrown (26. Jun 2016)

Also jeder Student ist eine Prüfung ist ein Modul? Also du bist eine Prüfung in Stochastik im Modul Mathe?


----------



## xJay (26. Jun 2016)

naja nicht so ganz... Die Aufgabe ist halt wie oben schon gesagt: 

Man soll eine Klasse Student erstellen, der soll MatrNr, Name, und eine Liste der Prüfungsergebnisse anzeigen.

Dann soll noch eine Klasse Prüfungen mit dem Modul, dem Prüfer und dem Ergebnis erstellt werden.
(Die Liste der Prüfungsergebnisse soll aus der Klasse Prüfungsliste kommen.)

Dann soll man die Klasse Modul erstellen, die den Namen, den Dozent, die SWS, und die CPs enthält.


Meine Frage ist halt einfach nur wie ich das Umsetzen kann... Also wie ich die Prüfungsergebnisse der Klasse Student aus der Klasse Prüfungen bekomme.
Kann man die Prüfungsergebnisse vielleicht einfach alle durcheinander in die Klasse Prüfungen schreiben und dann bei der Ausgabe so etwas wie bei SQL machen (Select Ergebnis while name = hanspeter) 

Ich hoffe jetzt verstehst du mein Problem ein wenig...


----------



## Cromewell (26. Jun 2016)

Vielleicht sowas in der Art:



Spoiler: Student





```
package forum;

import java.util.ArrayList;

/**
* Created by Jo on 26.06.2016.
*/
public class Student {

    private String name;
    private int matrNr;
    private ArrayList<Prüfung> pruefungen = new ArrayList<>();

    public Student(String name, int matrNr, ArrayList<Prüfung> pruefungen) {
        this.name = name;
        this.matrNr = matrNr;
        this.pruefungen = pruefungen;
    }

    public Student(String name, int matrNr) {
        this.name = name;
        this.matrNr = matrNr;
    }

    public void addPruefung(Prüfung p){
        pruefungen.add(p);
    }

    public void printPruefungen(){
        System.out.println(name+":");
        for (Prüfung pruefung: pruefungen){
            System.out.println("Modul: "+pruefung.getModul().getModulName()
                +"; Prüfer: "+pruefung.getPruefer()+"; Ergebnis: "+pruefung.getErgebnis());
        }
    }

    //Getter and Setter below//


    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public int getMatrNr() {
        return matrNr;
    }

    public void setMatrNr(int matrNr) {
        this.matrNr = matrNr;
    }

    public ArrayList<Prüfung> getPruefungen() {
        return pruefungen;
    }

    public void setPruefungen(ArrayList<Prüfung> pruefungen) {
        this.pruefungen = pruefungen;
    }
}
```






Spoiler: Modul





```
package forum;

/**
* Created by Jo on 26.06.2016.
*/
public class Modul {

    private String modulName;
    private String prof;
    private int sws;
    private int cps; //keine Ahnung, was das ist - habe jetzt  einfach int genommen

    public Modul(String modulName, String prof, int sws, int cps) {
        this.modulName = modulName;
        this.prof = prof;
        this.sws = sws;
        this.cps = cps;
    }

    //Getter and Setter below//


    public String getModulName() {
        return modulName;
    }

    public void setModulName(String modulName) {
        this.modulName = modulName;
    }

    public String getProf() {
        return prof;
    }

    public void setProf(String prof) {
        this.prof = prof;
    }

    public int getSws() {
        return sws;
    }

    public void setSws(int sws) {
        this.sws = sws;
    }

    public int getCps() {
        return cps;
    }

    public void setCps(int cps) {
        this.cps = cps;
    }
}
```






Spoiler: Prüfung





```
package forum;

/**
* Created by Jo on 26.06.2016.
*/
public class Prüfung {

    private Modul modul;
    private String pruefer;
    private int ergebnis;

    public Prüfung(Modul modul, String pruefer, int ergebnis) {
        this.modul = modul;
        this.pruefer = pruefer;
        this.ergebnis = ergebnis;
    }

    //Getter and Setter below//


    public Modul getModul() {
        return modul;
    }

    public void setModul(Modul modul) {
        this.modul = modul;
    }

    public String getPruefer() {
        return pruefer;
    }

    public void setPruefer(String pruefer) {
        this.pruefer = pruefer;
    }

    public int getErgebnis() {
        return ergebnis;
    }

    public void setErgebnis(int ergebnis) {
        this.ergebnis = ergebnis;
    }
}
```






Spoiler: Main





```
package forum;


/**
* Created by Jo on 26.06.2016.
*/
public class TestMain {
    public static void main(String[] args){
        Student peter = new Student("Peter", 127123712);
        peter.addPruefung(new Prüfung(new Modul("Mathe", "Dr. Schlingel", 12, 23), "Dr. Eduard-Panatze", 2));
        peter.printPruefungen();
    }
}
```




PS: Ist nur schnell getippt - have mercy


----------



## Flown (26. Jun 2016)

@Cromewell Dein Code ist zwar nett wegen der Datenkapselung, aber einiges solltest du doch beachten:
- Jede Klasse sollte die Methoden `Object::toString` und `Object::hashCode` + `Object::equals` überschreiben
- Immer (außer man benötigt konkrete Methoden aus der Klasse) Interfaces als Variablentyp angeben + beim return-Wert. Kurz: Immer gegen Interfaces implementieren, somit wird aus:

```
private ArrayList<Prüfung> pruefungen = new ArrayList<>();
// und
public ArrayList<Prüfung> getPruefungen() {
    return pruefungen;
}

public void setPruefungen(ArrayList<Prüfung> pruefungen) {
    this.pruefungen = pruefungen;
}
```
einfach:

```
private List<Prüfung> pruefungen = new ArrayList<>();
// und
public List<Prüfung> getPruefungen() {
    return pruefungen;
}

public void setPruefungen(List<Prüfung> pruefungen) {
    this.pruefungen = pruefungen;
}
```
- Alles bitte in Englisch halten und Umlaute vermeiden

Nicht nur an Cromewell gerichtet:
- JavaDoc schreiben. Ist am Anfang lästig, aber nach einer Zeit eine sehr große Hilfe


----------



## Cromewell (26. Jun 2016)

@Flown vielen Dank für das Feedback 



Flown hat gesagt.:


> Alles bitte in Englisch halten und Umlaute vermeiden


 Normalerweise ist mein Code komplett Englisch, nur habe ich an den vom TE angeschlossen x)



Flown hat gesagt.:


> JavaDoc schreiben. Ist am Anfang lästig, aber nach einer Zeit eine sehr große Hilfe


Ich versuch es mir anzugewöhnen ^^


----------



## mrBrown (26. Jun 2016)

@Cromewell, um das mal zu ergänzen: Man könnte den Großteil der Felder final machen, und sich auch die Setter dafür sparen. die Matrikelnummer zB wird sich nie ändern.
Ich würd der Prüfung außerdem den Studenten übergeben, eine Prüfung ohne Student existiert schließlich nicht.


----------



## AndiE (26. Jun 2016)

Ich kann mich auch an einen Artikel hier im Forum erinnern, "get and set" durch sprechendere Bezeichnungen wie "write and read" oder "give and get" etc. zu ersetzen.


----------



## mrBrown (26. Jun 2016)

AndiE hat gesagt.:


> Ich kann mich auch an einen Artikel hier im Forum erinnern, "get and set" durch sprechendere Bezeichnungen wie "write and read" oder "give and get" etc. zu ersetzen.


Da streiten sich alle, was für Objekte besser klingt, man könne schließlich bei einem Objekt nichts setzten, sondern würde dem etwas geben...
Der Standard ist aber get/set, und wenn man andere Frameworks einbindet, funktioniert es auch nur mit get/set.


----------



## xJay (26. Jun 2016)

@Cromewell vielen vielen dank. werde mir jetzt alles mal stück für stück ansehen und dann bei fragen nochmal fragen


----------



## xJay (26. Jun 2016)

```
package forum;


/**
* Created by Jo on 26.06.2016.
*/
public class TestMain {
    public static void main(String[] args){
        Student peter = new Student("Peter", 127123712);
        peter.addPruefung(new Prüfung(new Modul("Mathe", "Dr. Schlingel", 12, 23), "Dr. Eduard-Panatze", 2));
        Scanner sc = new Scanner(System.in);
        System.out.println("Gib den Namen an \n ");
        String abfrage = sc.next();
        abfrage.printPruefungen();
    }
}
```
hätte da noch eine frage und zwar möchte ich nun nach einem bestimmten studenten suchen.. wie kann ich das anstellen.. folgender code funktioniert leider nicht :


----------



## mrBrown (26. Jun 2016)

Wie soll das auch funktionieren, du rufst auf nem String eine nicht existente Funktion auf.

Du musst dir schon selbst überlegen, wie man nach einem Studenten suchen könnte, keine Idee?


----------



## xJay (26. Jun 2016)

ich dachte mir wenn ich jetzt peter dort rein schreibe führt er es ganz normal aus.. aber er startet die abfrage ja nicht deshalb weiß ich leider gerade echt nicht wie ich das machen soll. bin auch kein fortgeschrittener programmierer


----------



## Meniskusschaden (26. Jun 2016)

Wo hast du deine Studenten denn gespeichert? Dort musst du auch danach suchen. In deinem Codeausschnitt gibt es ja nur die Variable peter für einen einzelnen Studenten und du könntest einfach `peter.printPruefungen();`aufrufen. Du hast doch sicher irgendeine Datenstruktur, in der du deine Studenten speicherst. Vielleicht kannst du dort eine Methode `findStudentByName()`einbauen.


----------



## xJay (27. Jun 2016)

@Cromewell ich hab nochmal ne frage zu deinem code... 
und zwar hast du ja überall ein modul erstellt und im gleichen schritt eine prüfung erstellt.
ich dachte mir jetzt das ich noch mehr personen mache und dann das modul wieder aufrufen kann..
hatte mir das so gedacht : 

```
package forum;


/**
* Created by Jo on 26.06.2016.
*/
public class TestMain {
    public static void main(String[] args){
        Student peter = new Student("Peter", 127123712);
        Student jan = new Student("jan", 127123712);
        peter.addPruefung(new Prüfung(new Modul("Mathe", "Dr. Schlingel", 12, 23), "Dr. Eduard-Panatze", 2));
        
        jan.addPruefung(new Prüfung("Dr. Eduard-Panatze", 4));

        peter.printPruefungen();
    }
}
```


leider funktioniert das aber nicht.
Kann man die Module eventuell irgendwo "Speichern" sodass man sie wieder aufrufen kann ?


----------



## mrBrown (27. Jun 2016)

Ja, genauso wie du Studenten speichern kannst. Oder in Listen/Arrays

http://openbook.rheinwerk-verlag.de/javainsel/ ist vllt ganz nützlich für dich


----------



## xJay (27. Jun 2016)

ich bin nicht so der bücherwurm ich schaue mir eher tutorials an. aber nach gefühlten 500 videos weiß ich zwar viel, jedoch nicht das was ich gerade brauch (ist doch immer so). hättest du, oder jemand anderes, vielleicht einen tipp wie das funktioniert mit dem "abspeichern" eines Moduls ?


----------



## mrBrown (27. Jun 2016)

Ja, steht auch schon oben 
Sowas sind allerdings auch absolute Grundlagen, da ist ein Buch schon empfehlenswert...


----------



## Cromewell (27. Jun 2016)

xJay hat gesagt.:


> wie das funktioniert mit dem "abspeichern" eines Moduls ?


Wie @mrBrown schon geschrieben hat, wenn es mehrere sind.
Also sowas in der Art:

```
Modul[] subjects = new Modul[]{new Modul(mathe...), new Modul(info...)};
```


----------

