Marc Reichelt: OOP, wozu? (Fragen zu Java/Classen etc.)

Beitrag lesen

Hallo Rapsody,

Du solltest erst mal lernen, was "Vererbung" und "Instaniierung" bedeuten.
Dein Beispiel ist dazu ganz gut. Hier ein etwas fortgeschrittenes Beispiel (Datei "Programm.java"):

abstract class Haustier {  
  public abstract void gibLaut();  
}  
  
class Hund extends Haustier {  
  public void gibLaut() {  
    System.out.println("Wuff!");  
  }  
}  
  
class Katze extends Haustier {  
  public void gibLaut() {  
    System.out.println("Miau!");  
  }  
}  
  
public class Programm {  
  public static void main(String[] args) {  
    Haustier bello = new Hund();  
    Haustier mikesch = new Katze();  
    Haustier wuffel = new Hund();  
  
    bello.gibLaut();  
    mikesch.gibLaut();  
    wuffel.gibLaut();  
  }  
}

Die Klassen "Hund" und "Katze" erben von der Klasse "Haustier" und erben somit alle Methoden. Das Schlüsselwort abstract in Haustier signalisiert, dass es die Methode gibLaut gibt - beschreibt aber noch nicht, wie diese aussieht.
Praktischerweise müssen alle Unterklassen die Methode gibLaut() nun implementieren, oder man kann sie nicht verwenden.
Hund und Katze implementieren die Methode gibLaut() nun - also kann man nun viele Hunde und Katzen anlegen.

"bello", "mikesch" und "wuffel" sind hier _Instanzen_.
Wie du siehst, sind bello und wuffel beides Instanzen der Klasse Hund. Du könntest nun also 1000 Hunde anlegen - die sich aber später durch ihr Verhalten unterscheiden können, aber den selben Bauplan haben.

Du kannst das vergleichen wie wenn du Plätzchen herstellst.
Du hast eine Form aus Metall (die Klasse), mit der du beliebig viele Plätzchen erzeugen kannst (die Instanzen). Die Plätzchen können sich unterscheiden, beispielsweise ist ein Plätzchen bereits angebissen, das andere ist nicht gebacken, etc. - und sie sind dennoch alle durch die gleiche Form (die Klasse) entstanden.

Der Aufruf sieht also folgendermaßen aus:
<Statischeklasse> instanzbezeichnung = new <Dynamischeklasse>([<parameter>]);

Woher weiß Java - wenn ich eine Klasse Instanzieren möchte- wo diese liegt?

Entweder liegt die Klasse im aktuellen Package (also in einer Datei des gleichen Ordners), oder sie wird explizit über import importiert.

Und wie zum Pinguin komme ich an die Klassen wie Math etc.? Woher soll man denn die Methoden kennen? Gibt es irgendwo eine Liste wie man die Klassen einbindet und welche Methoden es gibt?

Du suchst die Dokumentation.
Dort gibt es die API Dokumentation, in der du für den Anfang alles findest was du brauchst.

Desweiteren würde mich Interessieren wie ich aus meinen *.class Dateien richtige Anwendungen erstellen kann, ohne die von der Konsole aus zu starten (java Programm1)?

Du schreibst hier gewissermaßen richtige Anwendungen (grafische Applikationen werden prinzipiell genauso gestartet wie konsolenbasierte).
Wenn du GUI-Programmierung meinst: Dafür gibt es Swing (schau am Besten im Buch "Java ist auch eine Insel" nach).
Du kannst später auch jar-Datei erzeugen, die du dann in Windows auch "ausführen" kannst (via Doppelklick).

Zu guter letzt, in vielen Tutorials wird gesagt, dass jede Application eine main Methode braucht, wozu und was hat es mit "(String[] args)" aufsich?
In meinem Tutorial steht dass es so sein muss, mehr nicht.

Kann ich meiner Appl. auch parameter mitgeben? Wie in dieser art z.B:

"java Programm1 -Dennis"?

Ja. Diese werden deiner main-Methode als ein String-Array übergeben.
Ausgeben kann man diese beispielsweise so:

public class ProgrammParameter {  
  public static void main(String[] args) {  
    for (String arg : args) {  
      System.out.println(arg);  
    }  
  }  
}

Ein Aufruf mit "java ProgrammParameter 1 2 3 -bla -blubb" sieht beispielsweise so aus:
1
2
3
-bla
-blubb

Grüße

Marc Reichelt || http://www.marcreichelt.de/

--
panic("Oh boy, that early out of memory?");
        linux-2.2.16/arch/mips/mm/init.c
Selfcode: ie:{ fl:| br:> va:} ls:< fo:} rl:( n4:( ss:) de:> js:| ch:? sh:| mo:) zu:)