Attribute, Arrays, Schleifen

Hallo, ich habe ein Problem mit einer Aufgabe. Den Code habe ich bereits, zu meinem besten Können, geschrieben. Kompilieren lässt er sich, bei der Ausführung gibt es jedoch Probleme. Ich werde hier die Aufgabenstellung und meinen Code einfügen:

Implementieren Sie eine Klasse Student. Fügen Sie die Attribute nachname und vorname vom Typ String und matnr vom Typ int hinzu. In dieser Aufgabe sollen die Attribute von außen sichtbar sein.
Testen Sie nun diese Klasse, indem Sie eine weitere Klasse Tub schreiben, die über eine main-Methode verfügt. Gehen Sie dazu wie folgt vor:

• Definieren Sie eine Variable m, welche die Anzahl der Studenten in einem Array repräsentiert. m soll über die Terminal-Klasse eingelesen werden (public static int readInt()).
• Definieren Sie ein Array vom Typ Student[] mit der Länge m.
• Initialisieren Sie nun in einer geeigneten Schleife die Studenten im Array. Die Attribute eines jeden Studenten sollen mithilfe von Benutzereingaben initialisiert werden. Benutzen Sie auch dafür die TerminalKlasse. Führen Sie den Benutzer durch das Programm mithilfe von Konsolenausgaben.
• Geben Sie anschließend die Daten aller Studenten mithilfe einer weiteren Schleife auf der Konsole aus.


Bei der Ausführung wird zunächst nach m gefragt, sobald ich dafür eine Zahl eingebe, endet das Programm und ich werde auf der Konsole nach einer neuen Eingabe gefragt..
Hier mein Code:
[CODE lang="java" title="Code"]public class Tub {

public static void main(String[] args) {

int m = Terminal.readInt();

Student[] SdtArray = new Student [m];

for(int i=0; i>m; i++){

SdtArray = new Student();

String x = Terminal.askString("Wie lautet Ihr Nachname?");

SdtArray.nachname = x;

String y = Terminal.askString("Wie lautet Ihr Vorname?");

SdtArray.vorname = y;

int z = Terminal.askInt("Wie lautet Ihre Matrikelnummer?");

SdtArray.matnr = z;

}

for(int i=0; i>m; i++){

System.out.println(Student.nachname);
}
}
}

class Student {

//Attribute

public static String vorname;

public static String nachname;

public static int matnr;

}[/CODE]

Die Terminal-Klasse beinhaltet mehrere vorgeschriebene Methoden, wie zum Beispiel das Erfragen eines strings oder integers auf der Konsole.
Was muss ich nun ändern, damit die Attribute auf der Konsole erfragt werden und anschließend alle Objekte m mit deren Attributen in einer Schleife ausgegeben werden?
 
An dem Programm ist wohl noch mehr zu reparieren (Terminal.java gibt es z.B. von hier ). Z.B. ist die zu erwartende Eingabe nicht intuitiv und die Ausgabe der Testdaten ist auch fehlerhaft, siehe Screenshot inkl. Variationen im Anhang.
 

Anhänge

  • Tub_Student_Kopie.png
    Tub_Student_Kopie.png
    39,1 KB · Aufrufe: 25
Ok, ich habe nun den wirklich dusseligen Fehler in der Bedingung, den mihe7 erwähnte, behoben. Das Programm lässt sich nun ausführen. Allerdings gibt es, wie M.L. schon anmerkte, das Problem, dass nur die letzte Eingabe m mal ausgeben wird, statt alle Eingaben der Reihe nach. Und ja, ich verstehe tatsächlich nicht, warum und vor allem wie ich static entfernen soll. Wenn ich das nämlich tue, wird ja auch der Fehler "non-static variable cannot be referenced from a static context" angezeigt..
[CODE lang="java" title="tub"]public class Tub {

public static void main(String[] args) {

int m = Terminal.askInt("Wie viele Studenten sollen eingelesen werden?");

Student[] SdtArray = new Student [m];

for(int i=0; i<m; i++){

SdtArray = new Student();

String x = Terminal.askString("Wie lautet der Nachname des Studenten?");

SdtArray.nachname = x;

String y = Terminal.askString("Wie lautet der Vorname des Studenten?");

SdtArray.vorname = y;

int z = Terminal.askInt("Wie lautet die Matrikelnummer des Studenten?");

SdtArray.matnr = z;

}

for(int i=0; i<m; i++){

System.out.println("nachname:" +Student.nachname+ " " + "vorname:" +Student.vorname+ " " + "matrikelnummer:" +Student.matnr);
}
}
}[/CODE]

1608485873202.png
 
Und ja, ich verstehe tatsächlich nicht, warum und vor allem wie ich static entfernen soll.
Schau mal, ob dir das schon weiterhilft. Ansonsten melde dich noch einmal.
https://www.java-forum.org/thema/boolean-stellt-sich-auf-true.188074/#post-1218268

Und was die Fehlermeldung angeht. Du greifst in deiner Ausgabe direkt auf die Klasse zu. Deshalb benötigst du dazu auch Klassenvariablen. In dem Array sind allerdings Instanzen der Klasse gespeichert (erzeugt mit new Student()). Blöderweise gibt es halt keine Instanzvariablen, d.h. du überschreibst dauernd die Klassenvariablen und es wird darum der letzte Wert angezeigt, der darin gespeichert wurde.
Java:
// anstatt von
for(int i=0; i<m; i++){
    System.out.println("nachname:" +Student.nachname // Student ist die Klasse
              
// brauchst du
for(int i=0; i<m; i++){
    System.out.println("nachname:" +SdtArray[i].nachname // SdtArray ist die Variable mit den Instanzen der Klasse Student

Und halte dich bitte an die Java-Programmierkonventionen: Klassennamen beginnen mit einem Großbuchstaben und Variablennamen mit einem Kleinbuchstaben. In deinem Fall "SdtArray" => "sdtArray" und weil Abkürzungen fast immer Scheiße sind: "studentArray" oder "students".
 
Zuletzt bearbeitet:
In Ordnung, ich meine es nun zu verstehen. Static macht aus einer Instanzvariablen also eine Klassenvariable, wodurch jeder Wert gleich ist und die Attribute auch nur ein mal existieren können, wodurch sie bei jeder neuen Eingabe überschrieben werden?

Zum zweiten Punkt: Die Aussage System.out.println("nachname:" +Student.nachname) geschieht also in einem statischen Kontext (Klassenvariable).. "Student.nachname" greift auf die komplette Klasse zu und der Fehler wird angezeigt, da die Variable "nachname" nicht mehr statisch ist? Man nutzt also den Array, um auf jede einzelne Instanz i zuzugreifen, statt auf die gesamte Klasse?
 
In Ordnung, ich meine es nun zu verstehen. Static macht aus einer Instanzvariablen also eine Klassenvariable, wodurch jeder Wert gleich ist und die Attribute auch nur ein mal existieren können, wodurch sie bei jeder neuen Eingabe überschrieben werden?
Ja, eine Klassenvariable existiert nur einmal für die Klasse (die gibt es ja auch nur einmal). Sie hat aber auch in jeder Instanz von dieser Klasse den selben Wert.
Die Aussage System.out.println("nachname:" +Student.nachname) geschieht also in einem statischen Kontext (Klassenvariable).. "Student.nachname" greift auf die komplette Klasse zu und der Fehler wird angezeigt, da die Variable "nachname" nicht mehr statisch ist? Man nutzt also den Array, um auf jede einzelne Instanz i zuzugreifen, statt auf die gesamte Klasse?
Student.nachname greift auf die Klassenvariable zu (sie ist ja statisch deklariert) SdtArray[i].nachname wäre zwar prinzipiell der Zugriff auf eine Instanzvariable, aber die gibt es ja nicht. Darum ist es wieder der Zugriff auf die Klassenvariable, auch wenn er diesmal über die Instanz erfolgt.

Das Array dient einfach dazu mehrere Instanzen von Student zu speichern.
Java:
// zwei Studenten in zwei Variablen

Student student_0 = new Student();
Student student_1 = new Student();

student_1.einschreiben();

// und in einem Array für zwei Studenten

Student[] studenten = new Student[2];
studenten[0] = new Student();
studenten[1] = new Student();

studenten[1].einschreiben();
 
Zuletzt bearbeitet:

Zurück
Oben