Java OOP Frage, habe ich das richtig verstanden (Instazen)? + Suche Beispielcode

Zeboo

Lt. Commander
Registriert
Juli 2008
Beiträge
1.562
Hallo,

ist das was ich jetzt gleich schreibe vollständig richtig?

Es gibt verschiedene Personen. Der Hans, Fritz und Klaus. Ich betrachte die drei (laut OOP regel) als Objekte. Gemeinsame Objekte, kann man in eine passende Klasse legen. Schließlich sind alle drei von ihnen "Männer". Also führe ich eine "Klassifizierung" durch. So kommt Hans, Fritz und Klaus in eine Klasse(Mann). Man sagt jetzt laut Java Umgangsprache, dass diese drei Objekte Instanzen von der Klasse 'Mann' sind. Aber der Klasse Mann hat noch eine weitere Oberklasse, das wäre 'Lebewesen', dann sagt man, dass der Klasse Mann eine Instanz von der Klasse Lebewesen ist.

Stimmt das so alles? Also sobald nur irgendwas falsch ist bitte korrigieren. Zum beispiel weiß ich nicht ob man "Instanz" sagt wenn eine Unterklasse zu eine Oberklasse gehört.

Gut und jetzt zum praktischen Teil. Wie würde das am sinnvollsten als Code aussehen? Da versuche ich einfach mal garnichts zu schreiben, weil das eh falsch wäre.

Freue mich über Tips, danke!

Gruss

PS. Ahja würde es was am Code/Erklärung ändern, wenn man noch zwischen den drei Objekten in der Klasse Mann eine Beziehung (sagt man dann auch Instanz) machen würde? Sagen wir ich sage, dass der Hans und der Fritz die Schüler von Klaus sind. Also der Klaus ist der Lehrer von Hans und Fritz. Ändert sich da was am Code? Schließlich wurde eine neue "Beziehung" erstellt (zwischen den Objekten).
 
Nein, das Lebewesen ist eine Abstraktion der Klasse Mann. Instanzen sind konkrete Objekte in deinem Programm.

Das Gebilde ist in dem Fall dann eine Generalisierung, eine Beziehung zwischen einer spezifischen Subklasse und einer allgemeinen Superklasse.

Die Klasse Mann besitzt wahrscheinlich das Attribut Name. Je nachdem ob bei dir alle Lebewesen eine persönlichen Namen besitzen, kann dieses Attribut bereits von der Superklasse Lebewesen vererbt werden. Lebewesen ist eine abstrakte, nicht instanzierbare Superklasse.

Code:
public abstract class Lebewesen 
{
}

Code:
public class Mann extends Lebewesen
{
}
 
Also wenn du noch Schüler und Lehrer ins Spiel bringst, würde ich die Klassifizierung in Lebewesen -> Mann fallen lassen. Ein Mann ist ja ein Lebewesen (Mann extends Lebewesen) aber wir führen dann lieber Lehrer und Schüler ein. Beides sind ebenfalls Lebewesen. Und jeder Lehrer hätte dann eine Liste von Schülern.

Also zu erst der Lehrer. Er ist ebenfalls ein Lebewesen.

Code:
public class Lehrer extends Lebewesen {
       private List<Schueler> schueler;
}

Der Lehrer (unser Lebewesen) hat jetzt eine Liste von Schülern.

Jetzt der Schüler:
Code:
public class Schueler extends Lebewesen {
      private Lehrer lehrer;
}

So hat jeder Schüler (sind ja auch Lebewesen) einen Lehrer.

Unser Lebewesen hat vielleicht einen Namen also erweitern wir doch die Klasse von Stefan ein bisschen:
Code:
public abstract class Lebewesen {
      private String name;
}

Somit hat sowohl der Lehrer als auch der Schüler einen Namen.

Jetzt können wir damit Spielen:
Code:
public class Schule {
       private List<Lehrer> lehrer;
       private List<Schueler> schueler;

       public Schule(List<Lehrer> lehrer, List<Schueler> schueler) {
                 this.lehrer = lehrer;
                 this.schueler = schueler;
       }

      public static void main(String[] args) {
              LinkesList<Lehrer> lehrer = new LinkedList<Lehrer>();
              LinkedList<Schueler> schueler = new LinkedList<Schueler>();

             //jetzt kannst du deine Objekte (Lehrer und Schüler, also z.b. Klaus und Co.) noch den
            // Listen hinzufügen und dann erstellen wir eine Schule. 

              Schule schule = new Schule(lehrer, schueler);
      }

       ....... //ab hier verschiedene Methdoen
}

Die Vererbungsbeziehung ist also eine "Ist ein" Beziehung. Ein Schüler / Mann / Lehrer IST EIN Lebewesen.

Der Code ist jetzt schnell hingetippt, da fehlt natürlich noch ne Menge. Ist nur ein Anhaltspunkt.

Wenn du am Mann feshälst, würde ich für das Lebewesen noch ein Attribut
Code:
private boolean mann;
einfügen. Dann kannst du kennzeichnen ob das Lebewesen männlich oder weiblich ist.
 
Zuletzt bearbeitet:
Stelle dir einfach vor, das eine Klasse eine Art Bauplan ist, wie man ein Objekt "baut". Objekte werden anhand des Bauplans gebaut. Ein einzelnes Objekt, das aus diesem Bauplan gebaut wurde, nennt man dann Instanz.

Zur Vererbung selbst musst du dir dann Gedanken machen, wie das Ganze aufgesetzt werden soll. Denkbar wären die oben genannten Beispiele, d.h.
Lebewesen -> Mensch -> Lehrer
Lebewesen -> Mensch -> Schüler

Lehrer enthält dann eine Auflistung von Schülern.
 
Und nicht vergessen, dass Java eine Einfachvererbung hat.

Eine Oberklasse kann an viele Unterklassen vererben(Instanzvariablen/Eigenschaften/Attribute, Methoden), aber eine Unterklasse hat IMMER nur eine Oberklasse.
 
Aber eine Klasse kann beliebig viele Interfaces implementieren. Das kann man durchaus als eine Art von Vererbung ansehen.
 
Hallo,

danke für die Antworten!

Damit ich das richtig verstehe: Es kann immer nur einen einzigen Oberste Klasse geben, die Superklasse ja? Diese Klasse schreibt man immer mit abstract? So wie hier, die Klasse Lebewesen.

Habe da jetzt eine Frage. WENN jetzt noch eine höhere Klasse als Lebewesen gibt. Dann müsste das quasi so aussehen:

PHP:
public abstract class HoechsteKlasse {

}

PHP:
public class Lebewesen extends HoechsteKlasse {

}

PHP:
public class Mann extends Lebewesen {

}

ja? Okey, sagen wir mal ich gebe in der oberste Klasse einige Attribute, so nennt man das ja(?). Das wäre wie beschrieben der Name. Habe gehört, dass man auch feste Attribute mitgeben kann. Weil so bei dem Namen steht da nichts, es heißt ja nur, dass man den eine Person einen String mitgeben kann, also den Namen. Ich könnte aber auch sagen:

PHP:
public abstract class HoechsteKlasse {

   private String name;
   private String hautfarbe = "pink";
}

Jetzt wären alle Lebewesene automatisch pink oder? Also zum schluss wäre die ganze Schulklasse mit Lehrer pink. Das wäre hier im Beispiel nicht so sinnvoll, aber wann macht es denn sinn "feste" Werte mitzugeben? Bzw. was müsste man machen, wenn man sagt, dass einer der Schüler nicht Pink sein soll. Geht es zu ändern? Schließlich wird er beim erstellen automatisch Pink, nur der Name ist eintragbar/änderbar.

Danke und Gruss

Edit:

Simple Man schrieb:
Und nicht vergessen, dass Java eine Einfachvererbung hat.

Eine Oberklasse kann an viele Unterklassen vererben(Instanzvariablen/Eigenschaften/Attribute, Methoden), aber eine Unterklasse hat IMMER nur eine Oberklasse.

Heißt das jetzt, wenn ich mein Beispielcode so umändere:

PHP:
public class Mann extends Lebewesen {

   private String hautfarbe = "grün";
}

Dann ist es egal ob in der Obersteklasse pink steht, die Schüler/Lehrer werden grün, da deren Oberklasse (also Mann) grün ist. Oder ist das genau umgekehrt, also, dass es egal ist ob bei Mann grün steht, wenn eine Klasse darüber pink steht, dann gilt das (es gilt immer das was an der höchste Stelle ist?)
 
Zuletzt bearbeitet:
PHP:
public abstract class HoechsteKlasse {
	
	protected String name;
	protected String hautfarbe="pink";
	final String ENDE="da kannst du nix ändern!";
	

}
private... kann nur innerhalb der Klasse aufVariable zugreifen
public... man kann von überall zugreifen
protected... nur subklassen/unterklassen und Klassen aus dem gleichen package können zugreifen

Es wurden 2 Variablen deklariert, also gesagt, dass name und hautfarbe ein String sein müssen und dann wurde hautfarbe zusätzlich initialisiert/mit Werten versehen.

Alles was die Klasse nun extended hat 2 deklarierte Variablen und eine davon hat schon nen Wert. Man kann sofort in den Subklassen damit arbeiten.

PHP:
public class Mann extends HoechsteKlasse{

	public void show (){
		System.out.println(hautfarbe);
		name="Hans";
		hautfarbe="grün";
		System.out.println(hautfarbe);
		System.out.println(name);
		//ENDE kann nicht neuen Wert bekommen, da es final ist
		//final Sachen sind nicht änderbar
		//ENDE="neuer Wert nicht möglich";
		System.out.println(ENDE);
	}
	
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		Mann m=new Mann();
		m.show();
	}

}
 
Also wenn du bei Mann das Attribut "hautfarbe" mit "grün" überschreibst, so ist jede Unterklasse von Mann natürlich auch Grün. Das nennt man "überschreiben" von Attributen oder Methoden.

Die Oberklasse bietet das Attribut an, aber als Unterklasse muss man es nicht übernehmen. Man kann es überschreiben und somit ändern. Wenn du es nicht überschreibst, wären alle "pink" da der Mann ja auch nur ein Lebewesen ist.
 
Hallo AgentXM,

habe noch eine kleine Frage zu deinem oberen Code. Du zeigst ja wie man eine Schuelklasse macht. Dabei verwendest du schon "List". Diese Funktion müsste man Importieren. Das mache ich für die Klasse da, aber dann muss ich das auch zb. eventuell auch für die andere Klasse. Gibt es kein weg das nur einmal zu machen und dafür können das alle anderen Klassen?

Dachte an sowas, wie: Die Abstrake Oberklasse kriegt es importiert und alle unterklassen kennen "List" schon und müssen nicht noch extra importiert werden. Geht das?

Gruß

Edit: Bzw. die mache ich am besten das Einfügen von Schuelern/Lehrern in die LinkedList? Indem ich zuerst die Lehrer und Schüler einzeln erstelle und die dann wiederrum einzeln einfüge?

PHP:
  Schueler Klaus = new Schueler;
  Lehrer Peter = new Lehrer;

  schueler.add(Klaus); //Ist jetzt in der Liste drinne
  lehrer.add(Peter);
 
Zuletzt bearbeitet:
Dein angegebener Code stimmt aber nicht ganz, oder? Das verstehe ich gerade nicht so wirklich, was du da machen möchtest.
Ich denke das müsste in der 3. Zeile so heißen:
Code:
Peter.schueler.add(Klaus);
Und in der 4. Zeile:
Code:
Klaus.lehrer = Peter;

//bzw. wenn der schüler mehrere Lehrer hat natürlich (List)

Klaus.lehrer.add(Peter);
Aber dass du das Attribut "schueler" das eine "List" ist einer Oberklasse geben kannst ist richtig. Wenn du dann von dieser Klasse ableitest, hat das Attribut natürlich auch die Unterklasse.

Code:
public class Grundschullehrer extends Lehrer {}

Jetzt hat natürlich auch der Grundschullehrer die liste an Schuelern.

Code:
Grundschullehrer lehrer = new Grundschullehrer();
lehrer.schueler.add(Klaus);

Dies ist jetzt möglich. Da musst du keine List importieren.

By the way, Variablennamen (Klaus) schreibt man normalerweise klein (klaus) um sie von Klassen zu unterscheiden.

edit:
Ob du erst die Schüler und Lehrer erstellst und sie dann einfügst, oder das automatisch in einer Schleife erledigen lässt oder eine fertige Liste an Schülern und Lehrern übergibst (Peter.schueler = listeVonSchuelern) ist völlig egal. Da musst du schauen, was in deiner Anwendung am besten funktioniert.
Und du musst auch keine LinkedList nehmen. Jede Datenstruktur die eine Collection speichert ist geeignet. Das sind ja alles nur Beispiele hier und nichts wirklich produktives.
 
Zuletzt bearbeitet: (Antwort auf edit)
Zurück
Oben