Vererbung

Pahiti78

Mitglied
Hallo Zusammen,
ich bin gerade dabei im Selbststudium mir Java anzueignen. Gestaltet sich als schwierig. Ich bin dabei eine Klasse Mitarbeiter anzulegen. Diese Klasse vererbt an Unterklassen Lehrling, Angestellter und Chef. Die Superklasse Mitarbeiter besitzt die Methoden GehaltErhoehen und DatenAusgeben(). Wenn ich jetzt in der Main Methode einen Angestellten deklariere, müsste der die Methoden DatenAusgeben erben. Aber es haut nicht hin. Vielleicht kann mir jemand helfen. Danke schonmal vorab.
Code:
class Mitarbeiter {
String m_name;			//Klassenvariable
String m_vorname;
int m_gehalt;
	Mitarbeiter (String name, String vorname, int gehalt){
		m_name=name;
		m_vorname=vorname;
		m_gehalt=gehalt;
	}
	
	void DatenAusgeben() {
		System.out.println("\n");
		System.out.println("Name:"+m_name);
		System.out.println("Vorname:"+m_vorname);
		System.out.println("Gehalt"+m_gehalt+"Euro");
	}
	void GehaltErhoehen(int erhoehung){
		m_gehalt=m_gehalt+erhoehung;
	}
	class Lehrling extends Mitarbeiter{
		//Die Klasse Lehrling erweitert Mitarbeiter
		int abgelegtePruefungen;
		Lehrling(String name, String vorname, int gehalt){
			//Vererbung von Klasse Mitarbeiter
			super (name,vorname,gehalt);
			//Erweiterung der Pruefungen
			abgelegtePruefungen=0;
		}
	}
	class Angestellter extends Mitarbeiter{
		int hierarchistufe;
		final int Max_HIERARCHIE=5;
		Angestellter(String name, String vorname, int gehalt){
			//Angestellter erbt von Mitarbeiter
			super(name,vorname,gehalt);
			//Erwerterung der Klasse Mitarbeiter
			hierarchistufe=0;
		}
		void befoerdern(){
			//Innerhalb der Klasse Angestellte existiert die Methode befoerdern. Diese existiert nicht für Lehrlinge, Chefs oder Mitarbieter
		if (hierarchistufe<Max_HIERARCHIE)
			hierarchistufe++;
		}
	}
	class chef extends Mitarbeiter{
		chef (String name, String vorname, int gehalt)
		{
			super(name,vorname,gehalt);
		}
		void GehaltErhoehen(int erhoehung){
			//Diese Methode heißt zwar gleich, wie die Mitarbeitermethode,gilt aber nur für die Chefklasse. Die eigentliche Methode wurde hier überschrieben.
		m_gehalt=m_gehalt+2*erhoehung;
		}
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
Angestellter billy= new Angestellter("Gates","bill",2000);
billy.DatenAusgeben();
	}}
 
Java:
class Angestellter extends Mitarbeiter

Bei dir erbt Angestellter von Mitarbeiter.

Java:
Angestellter billy= new Angestellter("Gates","bill",2000); // geht
Mitarbeiter billy= new Angestellter("Gates","bill",2000); // geht auch
Angestellter billy= new Mitarbeiter (...); // geht nicht

Anmerkung:
- m_ Präfix bei Attributen kannst du weglassen, das wird in Java i.d.R. nicht gemacht da überflüssig durch IDE
- Methoden (z.B. DatenAusgeben) werden immer mit kleinen Buchstaben anfangen und dann camelCase (das hast du ja schon)
- Du verwendest für deine Darstellung hier im Forum Code-Tags, nehme lieber JAVA-Tags 😉
 
Das ist etwas tricky...
Deine Klassen Lehrling, Angestellter usw. die von Mitarbeiter erben sollen hast du als innere Klassen erstellt. Der Sinn innere Klassen zu erstellen besteht darin, die innere Klasse auch nur in ihrer äußeren Klasse zu verwenden.
Kurz gesagt erstellt eigene Klassen... Angestellter extends Mitarbeiter.
Die korrekte Instanziierung hier wäre:

Java:
Mitarbeiter.Angestellter bill = new Mitarbeiter().new Angestellter("Bill", "Gates", 2000);
 
Hallo Zusammen,

danke für die Antworten. Aber irgendwie haut es trotzdem nicht hin.

Könnte jemand bitte einfach mal das Klassenbeispiel richtig zeigen. Also einfach die Basisklasse Mitarbeiter anlegen und dann eine Klasse Angestellter anlgen,welche erbt. Dann das Objekt Angestellte in der main Methode erzeugen. Den Rest kann ich mir dann drumherum selbst bauen, zumindestens denke ich das.🙂
 
So sieht die Mitarbeiter Klasse aus:

Java:
public class Mitarbeiter {
	String name;
	String vorname;
	int gehalt;
	
	public Mitarbeiter(String name, String vorname, int gehalt){
		this.name = name;
		this.vorname = vorname;
		this.gehalt = gehalt;
	}
	
	void print(){
		System.out.println("Name: " + name);
		System.out.println("Vorname: " + vorname);
		System.out.println("Gehalt: " + gehalt);
	}
}

Deine Angestellter Klasse:

Java:
public class Angestellter extends Mitarbeiter{

	public Angestellter(String name, String vorname, int gehalt) {
		super(name, vorname, gehalt);
	}	
}

und die main:

Java:
public class Programm {
	public static void main(String[] args) {
		Angestellter bill = new Angestellter("Gates", "Bill", 20000);
		bill.print();
	}
}

Der Grund wieso es nicht funktioniert hat ist, du musst einen default constructor erstellen um ein Objekt
Java:
new Mitarbeiter().newAngestellter();
zu erzeugen. Vielleicht liest das ja ein Java-Pro und kann mir sagen wieso der default constructor nicht vom compiler erstellt wird 😀
 
Ich meine gehört zu haben, dass falls man in einer Klasse einen Konstruktur erstellt welcher ungleich dem Standardkonstruktor ist, dann muss man explizit noch einmal einen Standardkontruktor erstellen um diesen auch nutzen zu können.
 
Prinzipiell würde ich dazu raten:
  • Die abgeleiteten Klassen als eigene Top-Klassen zu definieren oder
  • die abgeleiteten Klassen als static ([c]public static class[/c]) zu definieren.
Sie als Instanz-Abhängige innere Klasse zu definieren macht wenig Sinn. Denn jede Klasse erbt ja schon von Mitarbeiter. Wozu sie also noch zusätzlich an eine Instanz von Mitarbeiter hängen.

Prinzipiell denke ich, dass du eigentlich jede Klasse in eine eigene Datei stecken und die Klasse Mitarbeiter [c]abstract[/c] machen möchtest.

Ein Default-Konstruktor wird nur erstellt, wenn die Klasse GAR KEINEN Konstruktor hat. Sobald ein Konstruktor geschrieben wurde, gilt nur der (oder die, falls es mehere sind).
 
Zuletzt bearbeitet:

Zurück
Oben