Problem mit super

Status
Nicht offen für weitere Antworten.

Javab00n

Mitglied
Moin,
ich hab hier ein folgendes Problem (bin sozusagen ein JavaAnfänger)

Erstmal meine Klassen:

Code:
public class Person {

	private String Vorname;
	private String Nachname;
	private String Geburtstag;
	private String Geburtsort;
	
	public Person ( String Vorname, String Nachname, String Geburtstag,
		String Geburtsort ) {
		
		this.Vorname = Vorname;
		this.Nachname = Nachname;
		this.Geburtstag = Geburtstag;
		this.Geburtsort = Geburtsort;
	}
	
	public String getVorname() {
		return Vorname;
	}
	
	public String getNachname() {
		return Nachname;
	}
	
	public String getGeburtstag() {
		return Geburtstag;
	}
	
	public String getGeburtsort() {
		return Geburtsort;
	}
}

Ich möchte jetzt gerne diese Klasse erweitern, meinet wegen Student oder sowas. Soll dann auch zustätzliche Attribute haben und ebenfalls einen Konstruktor gesetzt bekommen. Anschließend die passende get-Methoden entwickeln.


Code:
public class Student extends Person {
	
	private int Matrikelnummer;
	private String Studienfach;
	private int Semesterzahl;
	
	
	public Student ( int Matrikelnummer, String Studienfach,
			int Semesterzahl) {
		
		}
	
	
	public int getMatrikelnummer() {
		return Matrikelnummer;
	}
	
	public String getStudienfach() {
		return Studienfach;
	}
	
	public int getSemesterzahl() {
		return Semesterzahl;
	}
	

}

Wenn ich das aber genauso mache sagt mir Eclipse, sowas wie: must invoke another constructor ... Hab viel gegoogelt und auch bei Galileo nachgeschaut. Also den Theorieteil habe ich soweit (glaube ich) verstanden, dass Konstruktoren nicht vererbt werden können, dass sie von oben nach unten ausgeführt werden usw. Aber wie mache ich das jetzt? Sitze schon Stunden daran und komme nicht klar damit :-(
 
Der Grund dafür ist, dass immer ein Konstruktor der Superklasse aufgerufen werden muss. Sofern keiner von dir explizit aufgerufen wird, wird versucht implizit den Default Konstruktor aufzurufen. Den default Konstruktor (also der ohne Argumente) war bei Person nicht vorhanden.

Statt dass du in Person den default Konstruktor erstellst, würde ich eher den Konstruktor von Student erweitern. Da jeder Student auch eine Person ist, musst du sowieso sowas wie Name, Geburtstag usw. angeben.
Code:
public Student (String Vorname, String Nachname, String Geburtstag,
    String Geburtsort, int Matrikelnummer, String Studienfach,
    int Semesterzahl) {
        super(Vorname, Nachname, Geburtstag, Geburtsort);
}
Hier wird mit super(...) explizit der Konstruktor der Superklasse aufgerufen, so dass dein Problem nicht mehr besteht. Außerdem werden auch gleich die anderen Parameter richtig gesetzt.

Noch ein kleiner Tip: Variablennamen werden üblicherweise klein geschrieben.
 
Ich empfehle außerdem auch noch set()-Methoden einzufügen, sonst kannst du keine Daten mehr ändern.
Außer du erstellst ein neues Objekt.
 
Ja vielen herzlichen Dank für eure Antworten.

Ich habe das Problem gelöst:


Code:
public class Student extends Person {
	
	private int Matrikelnummer;
	private String Studienfach;
	private int Semesterzahl;
	
	
	public Student ( String Vorname, String Nachname,
			String Geburtstag, String Geburtsort,
			int Matrikelnummer, String Studienfach,
			int Semesterzahl) {
		
		super(Vorname, Nachname, Geburtstag, Geburtsort);
		this.Matrikelnummer = Matrikelnummer;
		this.Studienfach = Studienfach;
		this.Semesterzahl = Semesterzahl;
		
		}

	public int getMatrikelnummer() {
		return Matrikelnummer;
	}
	
	public String getStudienfach() {
		return Studienfach;
	}
	
	public int getSemesterzahl() {
		return Semesterzahl;
	}
	
	void setMatrikelnummer( int neuMatrikel) {
		Matrikelnummer = neuMatrikel;
	}
	
	void setStudienfach ( String neuStudien ) {
		Studienfach = neuStudien;
	}
	
	void setSemesterzahl ( int neuSemester ) {
		Semesterzahl = neuSemester;
	}
}

Und hab nun eine neue Datei (Main.java) angelegt mit einer main-Methode um das Ganze mal zu testen:


Code:
public class Main {

	
	public static void main(String[] args) {
		
		Student kt = new Student();
		kt.setMatrikelnummer(12344566);
		kt.setSemesterzahl(3);
		kt.setStudienfach("Maschinenbau");
		
		System.out.println("Matrikelnummer: " + kt.getMatrikelnummer());
		System.out.println("Semester: " + kt.getSemesterzahl());
		System.out.println("Studienfach: " + kt.getStudienfach());
		
		
		}

}

Jetzt meckert Eclipse und streicht new Student(); rot an mit der Begründung, dass der Konstruktor Student() undefiniert sei?!?!?!

Also ich lerne ja zurzeit noch und habe ein ähnliches Beispiel von einem Buch, dort scheint es zu funktionieren, hab eigentlich nicht viel verändert ...
 
Student hat keinen Konstruktor, der keine Argumente bekommt. Und das ist auch gut so! Ein Student BRAUCHT einen Namen usw. Also nicht
Student kt = new Student();
kt.set(...)
sondern
Student kt = new Student("Foo", "Bar", "12.3.45", "Hier", 12345, "InformatikNatürlich", 4234);


Deswgen auch eine kleine "Kritik" an den Aussagen
Ich empfehle außerdem auch noch set()-Methoden einzufügen ... und
Setter gehören natürlich mit rein, ...
set-Methoden bietet man für ein Field an genau dann, wenn man das Field ändern können will, D.h. bei Fields, die nicht geändert werden können sollen, bietet man sie NICHT an. Man könnte jetzt drüber philosophieren, ob man die Matrikelnummer ändern kann (ich denke doch nicht?), oder den Namen (in der Realität geht das zwar, aber... hm) - aber spätestens Geburtstag+Ort KANN man garantiert NICHT ändern, und dafür sollte es darum IMHO auch keine set-Methoden geben.


EDIT: "nicht viel verändert" ist gut: "Och, so ein Semikolon hier und da, da soll der Compiler mal nicht so pingelig sein..." 😛
 
der Standard-Konstruktor existiert nur, wenn kein anderer Konstruktor definiert wurde, bis du ihn wieder explizit hinschreibst.

D.h.: new Student() funktioniert, sofern du in der Klasse keinen anderen Konstruktor wie public Student(ParaTyp para...) definiert hast. Damit der wieder da ist, musst du den mit
public Student() {
...
}
wieder herzaubern.

Oder du rufst in deiner main den gebastelten Konstruktor direkt mal auf:
Student kt = new Student("Peter", "Lustig", "01.01.2001", "Berlin", 12345, "Informatik", 5);

VG
 
André Uhres hat gesagt.:
Ein default Kontruktor ist nie schlecht. [...]
Ganz so pauschal würde ich das nicht sagen. Bei immutable Wrappern, wie z. B. Integer, der auch keinen hat, würde ein default Konstruktor meiner Meinung nach keinen Sinn machen und wäre damit überflüssig.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben