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

Hallo,

seit einigen tagen befasse ich mich mit Java (wie andere auch wie ich sehe).
Ich begreife eigentlich die ganze OOP nicht wirklich, wozu soll es denn gut sein, dass wenn ich eine Klasse erstellt habe davon eine Instanz zu machen?
Wie kann man die OOP erklären damit es eine Newbie ohne erfahrung im OOP bereich verstehen kann?

Wieso muss in Java die Datei genau so heißen wie die Class?
Wie wird aus meiner kleinen Klasse -im Moment nur ein kleiner Calculator- eine wirkiche Anwendung die auf jedem Rechner -mit Installiertem Java- laufen kann?

Naja, fragen über fragen... danke für eure Hilfe.

Euer Rapsody

  1. Hi,

    Ich begreife eigentlich die ganze OOP nicht wirklich, wozu soll es denn gut sein, dass wenn ich eine Klasse erstellt habe davon eine Instanz zu machen?

    vielleicht hilft Dir die Überlegung, davon _zwei_ Instanzen zu machen. Oder zweitausend.

    Wieso muss in Java die Datei genau so heißen wie die Class?

    Weil dies in Java nun mal so geregelt wurde. Das hat nichts mit OOP zu tun, sondern ist einfach ein organisatorisches Moment dieser einen Sprache.

    Wie wird aus meiner kleinen Klasse -im Moment nur ein kleiner Calculator- eine wirkiche Anwendung die auf jedem Rechner -mit Installiertem Java- laufen kann?

    Hierzu kann ich leider nicht sagen, ich habe mit Java noch keine Applikationen entwickelt.

    Cheatah

    --
    X-Self-Code: sh:( fo:} ch:~ rl:° br:> n4:& ie:% mo:) va:) de:] zu:) fl:{ ss:) ls:~ js:|
    X-Self-Code-Url: http://emmanuel.dammerer.at/selfcode.html
    X-Will-Answer-Email: No
    X-Please-Search-Archive-First: Absolutely Yes
  2. Moin,

    seit einigen tagen befasse ich mich mit Java (wie andere auch wie ich sehe).

    Okay, oder auch nicht. Ist das dein erster Kontakt mit Programmierung/Softwareentwicklung?

    Wichtig ist in erster Linie nicht die Sprache, sondern die Konzepte dahinter.

    Ich begreife eigentlich die ganze OOP nicht wirklich, wozu soll es denn gut sein, dass wenn ich eine Klasse erstellt habe davon eine Instanz zu machen?

    Wartbarkeit, Wiederverwendbarkeit sind hier die wichtigsten Schlagworte.

    Der objektorientierte Ansatz hat sich in der Praxis bisher als der beste Ansatz erwiesen. Es gibt in der Theorie zwar noch weitere Programmierpradigmen, wie z.B. die aspektorientierte Programmierung (die aber nur eine Erweiterung der OOP ist) oder die funktionale Programmierung. Diese sind aber bisher nicht wirklich über den Einsatz im Bereich der Forschung und einiger Nischen hinaus gekommen.

    Wie kann man die OOP erklären damit es eine Newbie ohne erfahrung im OOP bereich verstehen kann?

    Schwierig, da man das ganze nicht in drei, vier Absätzen erklären kann. Als ersten Einstieg würde ich die Wikipedia empfehlen. Nächster Ansatzpunkt wären Bücher über Java, oder allgemein über OOP.

    Der Galileo Verlag bietet netterweise einige seiner Bücher kostenlos zum Runterladen an. Dort findest zum einen in recht gutes und aktuelles Buch zu Java - Java ist auch eine Insel - und auch ein Buch zur Objektorientierung - Das Praxisbuch Objektorientierung: http://www.galileocomputing.de/katalog/openbook

    Wieso muss in Java die Datei genau so heißen wie die Class?

    Reine Konvention. Es könnte auch sein, dass dadurch die Implementierung des Compilers und/oder der virtuellen Maschine etwas effizienter ist.

    Wie wird aus meiner kleinen Klasse -im Moment nur ein kleiner Calculator- eine wirkiche Anwendung die auf jedem Rechner -mit Installiertem Java- laufen kann?

    Wenn du eine IDE (z.B. Netbeans) nutzt, wird die automatisch eine sogenannte JAR-Datei erzeugt. Dabei handelt es sich im wesentlichen um ein ZIP-Archiv, das alle zur Anwendung gehörigen Klassen etc. enthält. Außerdem enthält das Archiv noch ein paar Info-Dateien für die Java-Runtime, z.B. welche Klasse die Main-Methode der Anwendung enthält.

    Eine solche Anwendung kann theoretisch auf jedem System aufgeführt werden, auf dem eine Java Runtime installiert ist. Probleme kann es event. geben, wenn Bibliotheken nutzt, die nicht zur Java API gehören. Auch mit verschiedenen Java-Versionen kann es Probleme gebe. Eine Anwendung, die mit die JDK 1.6 erstellt wurde, funktioniert nicht mit einer JRE 1.5.

    Gruß

    Stareagle

    1. Hallo,

      Auch mit verschiedenen Java-Versionen kann es Probleme gebe. Eine Anwendung, die mit die JDK 1.6 erstellt wurde, funktioniert nicht mit einer JRE 1.5.

      Nicht ganz - man kann dem Java-Compiler die Option -target übergeben, die dafür sorgt, dass der erzeugte Bytecode kompatibel zu einer bestimmten Java-Version ist (bspw. -target 1.5). Damit kann man auch unter einem neuen JDK Software entwickeln, die unter älteren JREs läuft. Natürlich nur solange man keine Features verwendet, die es erst ab späteren Java-Versionen gibt.

      Viele Grüße,
      Christian

      1. Hallo Christian Seiler,

        Nicht ganz - man kann dem Java-Compiler die Option -target übergeben, die dafür sorgt, dass der erzeugte Bytecode kompatibel zu einer bestimmten Java-Version ist (bspw. -target 1.5).

        Gibts hierfür eine Doku oder ähnliches? Ich finde in der Insel keinen Hinweis auf dieses Attribut. Dafür wird [code=java]-source[/code] mit vergleichbaren Eigenschaften aufgelistet. Welcher Unterschied besteht zwischen Deinem -target und dem dort zu findenen -source?

        Mit freundlichem Gruß
        Micha

        1. Moin.

          Gibts hierfür eine Doku oder ähnliches?

          Natürlich bei Sun. Für die Windows-Version von javac z.B. hier.

          Christoph

        2. Hej,

          Nicht ganz - man kann dem Java-Compiler die Option -target übergeben, die dafür sorgt, dass der erzeugte Bytecode kompatibel zu einer bestimmten Java-Version ist (bspw. -target 1.5).

          Gibts hierfür eine Doku oder ähnliches?

          Na klar, und zwar für Unix-artige und Windows.

          Welcher Unterschied besteht zwischen Deinem -target und dem dort zu findenen -source?

          Naja, wie man schon vermuten kann, gibt -source an in welcher Version der Code geschrieben wurde und -target für welche Version kompiliert wird. Wobei ich mir jetzt auch keine sinnvolle Anwendung für -source vorstellen kann. Schließlich ist bisher jeder in Java <Version-1> geschriebene Code lexikalisch und syntaktisch kompatibel zu <Version>.

          Beste Grüße
          Biesterfeld

          --
          Art.1: Et es wie et es
          Art.2: Et kütt wie et kütt
          Art.3: Et hätt noch immer jot jejange
          Das Kölsche Grundgesetz
        3. Hallo,

          Gibts hierfür eine Doku oder ähnliches?

          Ja klar, siehe:
          http://java.sun.com/j2se/1.5.0/docs/tooldocs/windows/javac.html#options

          Ich finde in der Insel keinen Hinweis auf dieses Attribut. Dafür wird -source mit vergleichbaren Eigenschaften aufgelistet.

          Ja, sehe ich auch gerade, dort steht:

          | Erzeugt Bytecode für eine bestimmte Java-Version.

          Das ist aber falsch! Denn:

          Welcher Unterschied besteht zwischen Deinem -target und dem dort zu findenen -source?

          Der Unterschied zwischen -source und -target ist folgender:

          -source definiert, wie der Sourcecode zu interpretieren ist. Java hat nämlich im Laufe der Zeit zusätzliche Features bekommen, die zum Beispiel auch neue Schlüsselwörter hinzugefügt haben, wie zum Beispiel 'enum'. Damit Java-Code von früheren Java-Versionen dennoch unter neuen Java-Versionen kompiliert, kann man mit -source einstellen, dass der Java-Compiler Quellcode noch nach dem alten Sprachstandard behandelt, d.h. z.B. 'enum' als Schlüsselwort ignoriert und als Bezeichner zulässt.

          -target definiert dagegen, was für eine Art Bytecode generiert wird. Das heißt: -target gibt an, unter welchen Java-Versionen der Sourcecode mindestens laufen wird. Zum Beispiel läuft ein mit -target 1.3 kompiliertes Programm unter allen JREs ab 1.3, ein mit -target 1.6 kompiliertes Programm derzeit nur unter einer JRE 1.6.

          Allerdings sind -target und -source nicht komplett unabhängig: Zusätzliche Sprachfeatures brauchen auch zusätzliche Möglichkeiten im Bytecode. Daher ist es nur möglich, ein -target anzugeben, was mindestens so groß ist, wie -source, d.h. -target 1.5 -source 1.4 funktioniert, -target 1.4 -source 1.5 funktioniert nicht.

          Zudem gibt es noch weitere Dinge, die zu beachten sind: Zwar mag der generierte Bytecode dann kompatibel sein, allerdings verwendet der Java-Compiler im Default-Modus dennoch den Classpath des installierten JDK - und das kann evtl. besser passende Mehoden enthalten, die aber in älteren JREs nicht vorhanden sind. Das führt dann dazu, dass der Bytecode zwar kompatibel ist, aber versucht, eine Methode zu finden, die's in der älteren JRE nicht gibt. Daher sollte man im Zweifel auch -bootclasspath mit angeben, wenn man eine neuere javac-Version verwendet - dazu braucht man natürlich wiederum die Standard-Java-Klassenbibliothek der älteren Version, auf die man verweisen kann.

          Viele Grüße,
          Christian

          1. Hallo Ihr drei,

            Danke für Eure Antworten! Ich hatte gerade die Hilfe in der Konsole bemüht, die mir die möglichen Optionen auflistet - scheinen doch deutlich mehr zu sein, als ich dachte:

            D:\Java\jdk1.6\bin>javac
            Usage: javac <options> <source files>
            where possible options include:
              -g                         Generate all debugging info
              -g:none                    Generate no debugging info
              -g:{lines,vars,source}     Generate only some debugging info
              -nowarn                    Generate no warnings
              -verbose                   Output messages about what the compiler is doing
              -deprecation               Output source locations where deprecated APIs are u
            sed
              -classpath <path>          Specify where to find user class files and annotati
            on processors
              -cp <path>                 Specify where to find user class files and annotati
            on processors
              -sourcepath <path>         Specify where to find input source files
              -bootclasspath <path>      Override location of bootstrap class files
              -extdirs <dirs>            Override location of installed extensions
              -endorseddirs <dirs>       Override location of endorsed standards path
              -proc:{none,only}          Control whether annotation processing and/or compil
            ation is done.
              -processor <class1>[,<class2>,<class3>...]Names of the annotation processors t
            o run; bypasses default discovery process
              -processorpath <path>      Specify where to find annotation processors
              -d <directory>             Specify where to place generated class files
              -s <directory>             Specify where to place generated source files
              -implicit:{none,class}     Specify whether or not to generate class files for
            implicitly referenced files
              -encoding <encoding>       Specify character encoding used by source files
              -source <release>          Provide source compatibility with specified release

            -target <release>          Generate class files for specific VM version
              -version                   Version information
              -help                      Print a synopsis of standard options
              -Akey[=value]              Options to pass to annotation processors
              -X                         Print a synopsis of nonstandard options
              -J<flag>                   Pass <flag> directly to the runtime system

            Nochmals vielen Dank!

            Mit freundlichem Gruß
            Micha

          2. Hej Christian,

            [...] d.h. z.B. 'enum' als Schlüsselwort ignoriert und als Bezeichner zulässt.

            Das überzeugt, aber fallen dir denn außer des Gebrauchs der 4 Schlüsselwörter, die seit Java 1.1 hinzugekommen sind noch andere Anwendungsmöglichkeiten ein, wozu -source nötig wäre?

            Beste Grüße
            Biesterfeld

            --
            Art.1: Et es wie et es
            Art.2: Et kütt wie et kütt
            Art.3: Et hätt noch immer jot jejange
            Das Kölsche Grundgesetz
            1. Hallo!

              [...] d.h. z.B. 'enum' als Schlüsselwort ignoriert und als Bezeichner zulässt.

              Das überzeugt, aber fallen dir denn außer des Gebrauchs der 4 Schlüsselwörter, die seit Java 1.1 hinzugekommen sind noch andere Anwendungsmöglichkeiten ein, wozu -source nötig wäre?

              Java hat ja mit Version 1.5 z.B. Generics eingefügt, betrachte mal folgendes Testprogramm:

              import java.util.Vector;  
                
              public class v {  
                public static void main (String[] args) {  
                  Vector<String> a = new Vector<String> ();  
                  a.add ("Hallo");  
                }  
              }
              

              Wenn ich nun javac -source 1.5 v.java ausführen, dann funktioniert das problemlos. Wenn ich jedoch javac -source 1.4 v.java ausführe, dann erhalte ich folgende Fehlermeldung:

              v.java:5: generics are not supported in -source 1.4
              (use -source 5 or higher to enable generics)
                  Vector<String> a = new Vector<String> ();
                        ^
              1 error

              Würde ich ein JDK 1.4 zum Kompilieren verwenden, würde ich vermutlich so etwas erhalten wie "Parse error" oder ähliches.

              Inwieweit es jedoch außer hinzugekommenen Schlüsselwörtern Probleme gibt, alten Code mit -source 1.5 oder höher zu kompilieren (darauf zielte Deine Frage vermutlich auch ab), kann ich leider nicht sagen, ich habe mich damit nicht so intensiv beschäftigt.

              Viele Grüße,
              Christian

  3. Hej,

    Ich begreife eigentlich die ganze OOP nicht wirklich, wozu soll es denn gut sein, dass wenn ich eine Klasse erstellt habe davon eine Instanz zu machen?

    Klassen sind zwar ein wesentliches Konzept der OOP, aber aus Ihrer Existenz leitet sich noch eine Reihe andere Konzepte ab, die man erst im fortgeschrittenen Umgang mit der OOP zu schätzen lernt. So z.B. Polymorphie, Vererbung und Datenkapselung. Einen guten Überblick liefert Wikipedia.

    Aus den Konzepten ergeben sich Merkmale die den Prozess der Programmierung drastisch vereinfachen sollen. So z.B. leichte Wartbarkeit des Codes durch Kapselung, Flexibilität durch das bereitstellen von Schnittstellen oder auch teilweise automatische Code-Erzeugung durch das Abbilden von Datenstrukturen auf Klassen.

    Wie kann man die OOP erklären damit es eine Newbie ohne erfahrung im OOP bereich verstehen kann?

    Vor allem, indem man den Newbie damit üben lässt. Versuch dir erstmal vorzustellen dass ein Objekt ein "Ding" ist, welches in irgendwo im Raum rumschwirrt. Dieses Ding hat nun bestimmte Eigenschaften, die durch einen Bauplan des Dings vorgeschrieben sind. Dieser Bauplan ist die Klasse. Allerdings weiß im Idealfall nur das Ding alleine seine Eigenschaften. Es lässt auch niemanden so ohne weiteres die Eigenschaften verändern, sie gehören ja schließlich ihm. Daher stellt das Ding nach außen Methoden zur Verfügung um die Eignschaften die es Preisgeben will auch mitzuteilen. Oder es stellt Methoden bereit, die Eigenschaften zu ändern. Auch das wird durch die Klasse definiert. Für dich als Programmierer hat das einen enormen Vorteil: Du musst gar nicht wissen, wie das Ding funktioniert, du musst es nur noch bedienen können.

    Stell dir ein Radio vor: Es hat innendrin einen ganzen Krempel Technik implementiert. Du möchtest gar nicht wissen wie im Detail so alles in dem Radio funktioniert. Du möchtest aber wenn du auf den Knopf "Nächsten Sender suchen" drückst das Radio dir auch den nächsten Sender sucht und wiedergibt. Gleichzeitig bietet das Radio eine weitere Schnittstelle zur Außenwelt bereit: Es ist in der Lage UKW-Wellen zu empfangen und so zu verarbeiten, dass das Signal entsprechend wiedergegeben wird. U.u. tun das zwei verschiedene Radios unterschiedlich. Entscheidend ist aber, dass da jedes Radio nach dem Radio-Bauplan gebaut wurde du jedes Radio immer zu bedienen weißt und da die Klasse Radio auch die Schnittstelle UKW-Empfänger implementiert hat, sich jede Radiostation darauf verlassen kann, dass ihr gesendetet Signal richtig verarabeitet werden wird.

    Wieso muss in Java die Datei genau so heißen wie die Class?

    Is halt so. Z.B. damit Du gezwungen bleibst den Überblick zu behalten und nicht immer erst in die Klasse reinschauen musst um zu wissen wie sie denn heisst. Hätte man auch anders machen können, spricht aber auch nichts dagegen es so zu machen.

    Wie wird aus meiner kleinen Klasse -im Moment nur ein kleiner Calculator- eine wirkiche Anwendung die auf jedem Rechner -mit Installiertem Java- laufen kann?

    Deine kleine Klasse, so sie bereits auf deinem Rechner läuft und das tut was sie soll, ist bereits eine Anwendung die ebensogut auf jedem anderen Rechner mit ensteprechender JVM lauffähig wäre.

    Falls du mit einer wirklichen Anwendung eine aufwendige GUI meinst, so muss vor allem noch viel Übung deinerseits ins Land gehen. Ich will dich nicht entmutigen, aber grafische Benutzerschnittstellen in Java verlangem dem Programmierer einen sicheren Umgang mit _allen_ Aspekten der OOP ab. Ich beobachte oft, dass gerade Anfänger gerne aus kreativem Antrieb etwas sehr aufwendiges in Java entwicklen wollen und aus weitreichendem Mangel an Verständnis der Konzepte an den GUIs scheitern und so wieder scnell die Lust verlieren.

    Fang erstmal an den Kern deines Calculators zu programmieren und überleg dir was du so für Klassen hast. Z.B. hast du sowas wie eine Operation (z.B. '+'), die zwei Zahlen (z.B. 2 + 3), oder aber auch eine Zahl und eine andere Operation ( 1 + ( 2 + 3 ) ) nimmt und verarbeitet. Was sind die Methoden, was sind die Eigenschaften? Was ist das Ergebnis, wie wird die Ausgabe realisiert? Du benötigst eine Eingabe und eine Ausgabe der Ergebnisse? Programmier doch erstmal so eine Anwendung nur für die Kommandozeile. Wenn das geschehen ist und funktioniert, kannst du mit den bestehenden Klassen die du bereits geschrieben hast, noch eine grafische Benutzeroberfläche drumherum basteln.

    Zuguterletzt kann ich mir dieses eine Zitat dennoch nicht verkneifen:
    "Are you quite sure that all those bells and whistles, all those wonderful facilities of your so called powerful programming languages, belong to the solution set rather than the problem set?" Edsger W. Dijkstra

    Beste Grüße
    Biesterfeld

    --
    Art.1: Et es wie et es
    Art.2: Et kütt wie et kütt
    Art.3: Et hätt noch immer jot jejange
    Das Kölsche Grundgesetz
    1. Ach man, hätten wir uns nicht absprechen können? =/
      Jetzt hätte ich mir das viele Gekritzel auch sparen können. ;)

      1. Hej,

        Ach man, hätten wir uns nicht absprechen können? =/

        Wieso? Oft versteht man recht komplexe Tatsachen erst wenn sie aus verschiedenen Blickwinkeln mit unterschiedlichen Methoden erklärt werden. ,-)

        Jetzt hätte ich mir das viele Gekritzel auch sparen können. ;)

        Seh ich nich so. Rapsody wird sich über deine Erklärung ebenso gefreut haben.

        Beste Grüße
        Biesterfeld

        --
        Art.1: Et es wie et es
        Art.2: Et kütt wie et kütt
        Art.3: Et hätt noch immer jot jejange
        Das Kölsche Grundgesetz
  4. Hallo,

    seit einigen tagen befasse ich mich mit Java (wie andere auch wie ich sehe).
    Ich begreife eigentlich die ganze OOP nicht wirklich, wozu soll es denn gut sein, dass wenn ich eine Klasse erstellt habe davon eine Instanz zu machen?
    Wie kann man die OOP erklären damit es eine Newbie ohne erfahrung im OOP bereich verstehen kann?

    Wieso muss in Java die Datei genau so heißen wie die Class?
    Wie wird aus meiner kleinen Klasse -im Moment nur ein kleiner Calculator- eine wirkiche Anwendung die auf jedem Rechner -mit Installiertem Java- laufen kann?

    Für deinen Taschenrechner ist das gar nicht sinnvoll. Ich versuche es dir an einem Beispiel zu erklären.

    Stell dir ein beliebiges Strategiespiel vor. Zum Beispiel C&C oder Age of Empires oder die Siedler usw.
    In diesen Spielen Werden Einheiten produziert. Wie könnte man das produzieren verschiedener Einheiten programmiertechnisch Umsetzen? Entweder mit ganz vielen Arrays, jedes Array steht dann für eine Einheit und enthält Werte für die Kampfstärke, die Verteidigung usw.
    Besser ist es mit OOP: Die Syntax ist angepasst, jedes Objekt hat fest definierte Eigenschaften und Methoden. Bei einem Array müsstest du immer aufpassen, dass du auch die richtigen Methoden anwendest. Du brauchst z.B. eine Methode "Panzerangriff", wenn ein Panzer schießt, eine Methode "Gewehrangriff", wenn ein Soldat schießt usw. Bei OOP brauchst du immer nur eine Methode, nämlich "Angriff". Und das tolle ist: je nachdem, welches Objekt diese Methode, tut die Methode unterschiedliche Dinge. Das spart Schreibarbeit und vermeidet Fehler.

    Ein weiterer großer Vorteil ist die Vererbbarkeit. Du müsstest ja jeweils ein Array für Kampfpanzer, für Spähpanzer, für Transportpanzer usw haben. Jedes mal müsstest du in jedem Array alle Werte notieren, also so:

    Kampfpanzer
    {
       ["stärke"] = ...;
       ["defensive"] = ...;
       ["geschwindigkeit"] =...;
       ["sichtweite"] = ...;
       ["ketten"] = ...;
    }

    Spähpanzer
    {
       ["stärke"] = ...;
       ["defensive"] = ...;
       ["geschwindigkeit"] = ...;
       ["sichtweite"] = ...;
       ["räder"] = ...;
    }

    Wie du erkennst, haben Kampfpanzer und Spähpanzer fast die gleichen Eigenschaften (nur unterschiedliche Werte), _aber_ der Spähpanzer hat Räder, der Kampfpanzer hat Ketten. Nun, wenn du das ganze für alle Panzer-, Einheiten-, Gebäude-, Untergründetypen aufschreiben musst, wirst du ja ganz verrückt. Leichter geht es mit OOP, nämlich so:

    Panzer
    {
       ["stärke"] = ...;
       ["defensive"] = ...;
       ["geschwindigkeit"] =...;
       ["sichtweite"] = ...;
    }

    Kampfpanzer[erbt von Panzer]
    {
       ["ketten"] = ...;
    }

    Spähpanzer[erbt von Panzer]
    {
       ["räder"] = ...;
    }

    Das bedeutet, dass Kampfpanzer nicht nur die Eigenschaft "ketten" hat, sondern auch alle Eigenschaften von der Klasse Panzer. Jetzt stell dir vor, dass es nicht nur 2 verschiedene Panzer sondern dutzende gibt. Und die haben alle noch viel mehr Eigenschaften, und du siehst: du sparst eine Menge Schreibarbeit. Aber nicht nur das: stell dir mal vor, du willst, dass alle deine Panzer auch noch die Eigenschaft "Treibstoffverbrauch" bekommen sollen. Im Fall mit den Arrays müsstest du jedes mal wieder "Treibstoffverbrauch" dazukopieren. Bei OOP musst einfach nur ein einziges mal bei Panzer den Treibstoffverbrauch notieren und alle anderen Panzer bekommen diese Eigenschaft auch, weil sie ja alle Eigenschaften von Panzer erben. Das Programm ist also viel leichter wartbar.

    Das ist nur ein kleiner Einblick, es gibt noch viel mehr Vorteile. Die merkst du aber erst, wenn du wirklich an größeren Projekten arbeitest. Bei einem kleinen Taschenrechner bringt dir OOP eigentlich nichts.

    Leider wird oft empfohlen, sofort mit OOP anzufangen. Ich finde man sollte lieber erst eine einfache Programmiersprache lernen, die kein OOP voraussetzt. Wenn man dann nämlich anfängt auf die oben genannten Probleme zu stoßen, erst _dann_ versteht man so richtig, warum es überhaupt OOP gibt und wie schlimm es ohne OOP ist.

    Ich hoffe ich konnte dir ein bisschen helfen. Gib nicht gleich auf, wenn du etwas nicht verstehst. Das meiste braucht ein bisschen Zeit und irgendwann wirst du auf ein Problem stoßen und dir sagen "Aha, _deswegen_ braucht man das also!".

    Gruß,
    Ganane

    1. Hallo,

      ich danke euch beiden sehr!
      Ich versuche jetzt mal eine Klasse zu erstellen (mit Java), aber leider gibt es keine netten Beispiele wo ganz genau erklärt wird was z.B. void etc. zu bedeuten hat. In vielen Tutorials wird einfach nur mit der Syntax herumgeschmissen und Schlüsselwörter benutzt die nicht erklärt werden, dass macht die Sache dann echt nicht mehr leicht.

      Danke euch nochmals für eure liebe Mühe :D

      1. Hej,

        In vielen Tutorials wird einfach nur mit der Syntax herumgeschmissen und Schlüsselwörter benutzt die nicht erklärt werden, dass macht die Sache dann echt nicht mehr leicht.

        Ähm, doch, gerade leicht. Alleine in einer Methode wie

        public static void main (String[] ars) {}

        steckt schon so viel drin: Sichtbarkeit, Rückgabetyp, Übergabeparameter, Arrays, Klassenbindung. Nur um eine einfaches Hello-World ans laufen zu bekommen, musst du nicht wissen was das alles bedeutet. Nimms erstmal hin. Wenn du jetzt in deinem Tutorial(TM) etwas weiterlesen wirst , wirst du schon recht bald erklärt bekommen, dass solange Du keinen guten Grund dafür hast, das Wort static weglassen sollst. Auch void wird dir noch viel kurz darauf erklärt werde. Und so geht das weiter ... Nach und nach entwickelst due ein Verständnis für die Fuktionweise der OOP im allgemeinen und der von Java im speziellen.

        [...] aber leider gibt es keine netten Beispiele wo ganz genau erklärt wird was z.B. void etc. zu bedeuten hat.

        Jede Methode muss immer einen Rückgabetyp angeben. Stell dir eine Methode wie eine Blackbox vor, z.B. wie einen Kaffeeautomaten, du wirfst oben eine oder mehrere Münzen rein (Übergabe-parameter) und kriegst unten entsprechend Kaffee raus (Rückgabewert), wie du oben Münzen reingeworfen hast. Wenn oben auf dem Automaten also draufsteht

        public Kaffee machKaffee ( Muenze[] geld ) {}

        weißt du, dass der Automat Kaffee kocht und ihn dir gibt. Wenn aber auf der Maschine steht

        public void machKaffee ( Muenze[] geld ) {}

        dann weißt du, dass der Automat zwar Kaffee kocht, ihn dir aber nicht gibt, sondern nach dem kochen, selber trinkt, wegschüttet, oder verdunsten lässt. void ist also der Kein-Rückgabetyp und bedeutet.

        Im ersten Fall kannst du daher folgendes machen

        Kaffe kaffee = machKaffee( meinLetztesKleingeld );

        Du nimmst also den Rückgabe wert des Automaten und speicherst ihn vor dem Trinken in einer Variable kaffee vom Typ Kaffee. Im zweiten Fall (void) wäre dies ein Fehler, da die Methode gar nichts zurückgibt, dass du in kaffee speichern könntest.

        Beste Grüße
        Biesterfeld

        --
        Art.1: Et es wie et es
        Art.2: Et kütt wie et kütt
        Art.3: Et hätt noch immer jot jejange
        Das Kölsche Grundgesetz
        1. Hej,

          In vielen Tutorials wird einfach nur mit der Syntax herumgeschmissen und Schlüsselwörter benutzt die nicht erklärt werden, dass macht die Sache dann echt nicht mehr leicht.

          Ähm, doch, gerade leicht. Alleine in einer Methode wie

          public static void main (String[] ars) {}

          steckt schon so viel drin: Sichtbarkeit, Rückgabetyp, Übergabeparameter, Arrays, Klassenbindung. Nur um eine einfaches Hello-World ans laufen zu bekommen, musst du nicht wissen was das alles bedeutet. Nimms erstmal hin.

          Genau _da_ bin ich anderer Meinung. Dieses Hinnehmen (das muss man ja nicht nur bei OOP) ist imho einfach grausam. Ich möchte _genau_ verstehen, warum da etwas steht. Vielleicht geht das nur mir so, aber es fühlt sich einfach besser an zu wissen, was man warum schreibt.
          Deswegen finde ich es auch besser z.B. mit PHP, Javascript, HTML (auch wenn es keine Programmiersprache ist) oder gar Batch/Shell anzufangen. Man weiß exakt, was jede Zeile bedeutet.
          Dann erst sollte man auf Java umsteigen. Am besten so, dass man etwas in PHP umsetzen soll, was durch OOP sehr vereinfacht wird. (Gut, PHP kann ja nun auch OOP, aber man stelle sich vor, es könne kein OOP). Und _dann_, wenn man dieses etwas größere Projekt in PHP umgesetzt hat, soll man das gleiche mit Java umsetzen. Dann versteht man zwar auch nicht sofort die Syntax, aber man weiß sofort, warum da public davorsteht, weil man sofort versteht, warum einem das die Sache einfacher macht.

          Gruß,
          Ganane

          1. Hallo,

            ja, mir geht es genau so wie dir, ich muss verstehen was ich mache.
            Nach eurer Antwort habe ich mich nochmals mit der OOP (obwohl ich keine Lust mehr hatte) beschäftigt und sehe da, ich habe es begriffen :D

            Habe sogar meine erste Klasse erstellt und weiß auch wie ich diese nutzen kann (wusste vorher nichts von der Vererbung etc.).

            Ich habe mal aus Spaß (wegen meinem verständniss wegen) eine klasse "Haustier erstellt" (Haustier.java) und dann eine Datei (mit der main geschichte) die die eigentschaften und Methoden von der Datei/Klasse Haustier geerbt hat.

            Doch einige sachen geben mir nich zu denken und hoffe auf eine Antwort :)

            Woher weiß Java - wenn ich eine Klasse Instanzieren möchte- wo diese liegt?
            In meinem Beispiel war es so angegeben:
            [lang=java]
             Haustier meinNeuesTier = new Haustier();
            [lang]

            Wieso muss man keinen Kompletten Dateinamen eingeben oder sowas wie "Include"?
            Und wieso diese Schema:

            alteKlasse neueKlasse = new alteKlasse; ?
            Würde nicht:

            neueKlasse = alteKlasse; reichen?

            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?

            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)?

            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"?

            Wenn ja, wo wird der Wert "Dennis" eingefangen? Kann ich auch mehrere Parameter mitgeben unterschiedlichen Typs?

            Sorry, aber ich habe bis jetzt nur mit Visual Basic programmiert und Java ist totales Neuland für mich....

            Danke für eure Mühe mit mir.

            Schönen Abend noch Jungs.

            1. 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:)
            2. Und wieso diese Schema:

              alteKlasse neueKlasse = new alteKlasse; ?
              Würde nicht:

              neueKlasse = alteKlasse; reichen?

              Nein, Java ist typenbasiert (ich hoffe der Begriff ist richtig, ich kann kaum Java), d.h. du musst immer wenn du eine Variabeln erzeugst angeben von was für einem Typ diese ist und new ruft einfach dein Konstruktor auf, also eine der Funktionen alteKlasse()

              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.

              Irgendwie scheint dein Tutorial eher was für Fortgeschrittene zu sein, evtl. für Leute mit C/C++ Kenntnissen. Du solltest einen Schritt zurück gehen und eine Doku/Tutorial suchen, das sich an Anfänger richtet, da du mit VB nicht unbedingt Grundlagen für die Javaprogrammierung hast.

              Struppi.

              1. Hallo Struppi,

                Irgendwie scheint dein Tutorial eher was für Fortgeschrittene zu sein, evtl. für Leute mit C/C++ Kenntnissen. Du solltest einen Schritt zurück gehen und eine Doku/Tutorial suchen, das sich an Anfänger richtet, da du mit VB nicht unbedingt Grundlagen für die Javaprogrammierung hast.

                Das vermute ich auch.
                Ich empfehle an dieser Stelle mal darauf zu achten, dass man das Buch Java ist auch eine Insel vorne beginnen kann zu lesen und die Beispiele auch Schritt für Schritt durchgehen kann.
                Man muss sich allerdings ein wenig Zeit nehmen (eine Woche wäre gut) - aber bei vielen Leuten scheitert das "sich-Zeit-nehmen-und-lernen" meistens an der eigenen Einstellung. ;-)

                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:)
                1. Hallo freunde,

                  juhu, habe meine erste klasse erstellt, wo ich wirklich weiß was läuft!
                  Ist zwar noch sehr einfach aber es funtioniert und langsam geht mir echt das Licht auf:

                  Klasse Auto.java:

                    
                  public class Auto {  
                   public String farbe;  
                   public int alter;  
                   public int ps;  
                    public double umrechnen (double staerke) {  
                     double kw = 0.736 * staerke;  
                     return kw;  
                    }  
                  }  
                  
                  

                  Instanz die die Methoden von Auto nutzt:

                    
                    
                  public class Audi {  
                   public static void main (String[] args) {  
                   Auto rs4 = new Auto();  
                   rs4.alter = 6;  
                   rs4.farbe = "Rot";  
                   System.out.println(rs4.umrechnen(125) + " KW/ Alter: " + rs4.alter + " Lackfarbe: " + rs4.farbe);  
                   }  
                  }  
                  
                  

                  Es funktioniert wirklich :D !

                  Aber eine frage habe ich da noch.
                  Die Klasse "Auto" hat ja einige Variablen wie z.B "alter", darf ich die Variable auch in der Instanz nutzen (wenn ich es brauche) ohne das ein konflikt auftreten kann, sprich darf ich die Variable "alter" nutzen ohne das es probleme mit der Klasse "Auto" gibt?

                  Wie kann ich Variablen in meiner Klasse "verstecken"? Also das man dort nicht zugreifen kann - neueklasse.variable=wert - sonder diese schon einen wert hat der nicht überschreibbar ist? Habe es mit "private" versucht, ich kanbn trotzem einen Wert speichern -mit der Instanz/Objekt-.

                  Dank euch

                  1. Hej,

                    Aber eine frage habe ich da noch.
                    Die Klasse "Auto" hat ja einige Variablen wie z.B "alter", darf ich die Variable auch in der Instanz nutzen (wenn ich es brauche) ohne das ein konflikt auftreten kann, sprich darf ich die Variable "alter" nutzen ohne das es probleme mit der Klasse "Auto" gibt?

                    Wenn die Felder einer Klasse nicht als static gekennzeichnet sind, gehören sie den Objekten. (Vergleiche Objektvariable vs. Klassenvariable). Das rumschrauben an einer Objektvariable eines Objektes, betrifft nicht die Objektvariable eines anderen Objektes der gleichen Klasse. Zumindest solange die Objektvariablen nicht auf die gleiche Referenz zeigen. Also:

                      
                    public class Klasse {  
                      static int i = 0;  
                             int j = 0;  
                    }  
                      
                    public Tester {  
                      public static void main( String[] args) {  
                        Klasse k1 = new Klasse();  
                        k1.i++;  // Warnung: auf Klasse.i sollte statisch zugegriffen werden  
                        k1.j++;  
                      
                        System.out.println( "k1: "+ k1.i +" "+ k1.j ); // Ausgabe: k1 1 1  
                      
                        Klasse k2 = new Klasse();  
                        k2.i++;  // Warnung: auf Klasse.i sollte statisch zugegriffen werden  
                        k2.j++;  
                      
                        System.out.println( "k2: "+ k2.i +" "+ k2.j ); // Ausgabe: k2 2 1  
                      
                        System.out.println( "k1: "+ k1.i +" "+ k1.j ); // Ausgabe: k1 2 1  
                      }  
                    }  
                    
                    

                    Wie kann ich Variablen in meiner Klasse "verstecken"?

                    Mit dem Schlüsselwort private.

                    Also das man dort nicht zugreifen kann - neueklasse.variable=wert - sonder diese schon einen wert hat der nicht überschreibbar ist?

                    Mit dem Schlüsselwert final und dem Überschreiben des Standardkonstruktors.

                    Habe es mit "private" versucht, ich kanbn trotzem einen Wert speichern -mit der Instanz/Objekt-.

                    Versteh ich nicht.

                    Beste Grüße
                    Biesterfeld

                    --
                    Art.1: Et es wie et es
                    Art.2: Et kütt wie et kütt
                    Art.3: Et hätt noch immer jot jejange
                    Das Kölsche Grundgesetz
                    1. Hei,

                      mhhh, bedeuten "final" nicht sowas wie eine "konstante"?
                      Konstanten kann man aber nicht mehr ändern, wie kann ich versteckte Variablen deklarieren wo ich aber "intern" die werte ändern kann, ohne das es eine Instanz kann?

                      Naja, egal, die frage beantwortet sich bestimmt bald von selbst.

                      Aber wo ich ja gerade einen Profi habe, was hat eigentlich dieses "void" oder "static" zu bedeuten?

                      Mal (im Tutorial) wird in einer Klasse eine Methode mit:

                      public void int zahl();

                      oder

                      public static int zahl();

                      deklariert, was soll das wenn es auch ohne "void" und "static" geht?

                      Leider wird es in meinen Tutorial nicht erklärt und mich ärgert es wenn ich nicht verstehe warum die es so schreiben.

                      Ich danke dir !

                      1. Hej,

                        mhhh, bedeuten "final" nicht sowas wie eine "konstante"?

                        final bedeutet dass ein Feld (also die Referenz auf ein Objekt, respektive bei primitiven Datentypen wie int, long, char, usw. der Inhalt des Feldes selbst) _nach_ dem instanzieren des Objektes nicht mehr veränderbar ist. Echte Konstanten werden in Java durch static final deklariert. Also das Feld ist nicht veränderbar und gilt für die Klasse, also auch für alle Instanzen der Klasse. Diese Variante ist seit Java 1.5 seitdem is enum gibt, etwas aus der Mode gekommen, hat aber in bestimmten Fällen durchaus seine Berechtigung.

                        Konstanten kann man aber nicht mehr ändern, wie kann ich versteckte Variablen deklarieren wo ich aber "intern" die werte ändern kann, ohne das es eine Instanz kann?

                        Mit private.

                        Habe es mit "private" versucht, ich kanbn trotzem einen Wert speichern -mit der Instanz/Objekt-.

                        Versteh ich nicht.

                        Wie du dies gemacht hast, bzw. was du genau meinst und was nicht geklappt hat, hast du noch nicht erklärt.

                        Aber wo ich ja gerade einen Profi habe, was hat eigentlich dieses "void" oder "static" zu bedeuten?

                        Zu void habe ich ja bereits etwas geschrieben, zu static ebenfalls.

                        Genauso wie es statische Felder geben kann, kann es auch statische Methoden geben. So z.B. die Methode Math.max( int a, int b ). Die Funktionalität von max() hängt nicht von irgendwelchen Eigenschaften einer Instanz von Math ab, sondern ausschließlich von dem was man in die Methode reinsteckt. Daher kann man auf die Methode direkt über die Klasse zugreifen und nicht erst über ein etwa instanziertes Math-Objekt (zumal ich sowieso glaube mich erinnern zu können, dass Math nicht instanzierbar ist).

                        Mal (im Tutorial) wird in einer Klasse eine Methode mit:

                        public void int zahl();

                        Falls das wirklich so in deinem Tutorial gestanden haben sollte, wirf es weg! Eine Methode kann immer nur genau _einen_ oder _keinen_ Rückgabetyp haben, entweder int oder void.

                        oder

                        public static int zahl();

                        Das wäre eine statische Methode die dir ein int zurückgibt. Nochmal zum Verständnis: static ist ein Modifizierer, int ein Rückgabetyp, void ein weiterer Modifizierer, der keinen Rückgabetyp zulässt.

                        Leider wird es in meinen Tutorial nicht erklärt und mich ärgert es wenn ich nicht verstehe warum die es so schreiben.

                        Welches Tutorial verwendest Du? Ich würde es gerne auf meine persönliche Blacklist setzen. Mein Tip lautet nachwievor, dir entweder ein gutes Buch zur OOP oder ein gutes Buch zu Java zu besorgen. Java-Insel und Javahandbuch sind charmant geschriebene und umfassende Werke zu Java. Zum lernen find ich beide nur bedingt geeignet. Ein Buch welches ich sehr gerne empfehle ist Grundkurs Programmieren in Java. Vielleicht solltest du die 30 Eur investieren, anstatt dich weiterhin mit deinem Tutorial rumzuplagen.

                        Beste Grüße
                        Biesterfeld

                        --
                        Art.1: Et es wie et es
                        Art.2: Et kütt wie et kütt
                        Art.3: Et hätt noch immer jot jejange
                        Das Kölsche Grundgesetz
            3. Hej,

              auch wenn Marc und Struppi dir schon geantwortet haben will ich es mir nicht nehmen lassen dies nun doch noch abzuschicken, nachdem gestern Abend das "Nachricht absenden" aus irgendeinem Grund bei mir gestreikt hatte (*grrr*):

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

              Aus dem Zusammenspiel aus Klassenpfad und Import-Anweisungen.

              Und wieso diese Schema:

              alteKlasse neueKlasse = new alteKlasse; ?

              Das versteh ich nicht! Es sollte wahrscheinlich auch heissen:
              Klasse objekt1 = new Klasse();
              Du wirst erstmal verstehen müssen, was in dieser einen Zeile alles steckt:

              1. Es gibt einen Bauplan, eine Klasse einen Typ 'Klasse'
              2. Diesem Typ kann man eine Variable objekt1 zuweisen. Die Variable verweist erstmal auf die null-Referenz.
              3. Von dem Typ Klasse kann man Instanzen erzeugen, indem man den Kosntruktor Klasse() mit dem Schlüsselwort new aufruft. Jetzt wird ein Objekt angelegt, an der VM registriert, Speicher alloziert und ggf. bereits Felder in Klasse initialisiert.
              4. Eine Referenz auf dieses Objekt wird in der Variablen objekt1 gespeichert. objekt1 verweist also nicht mehr auf null sondern eben das neu instanzierte Objekt.

              neueKlasse = alteKlasse; reichen?

              1.) Nach dem was du oben geschrieben hast ist neueKlasse ein Variable für ein Objekt, alteKlasse der Bezeichner einer Klasse. Sowas geht nicht! Du musst wie ich schon geschrieben habe das Objekt über den Konstruktor aus der Klasse instanzieren. Hört sich kompliziert an? Ist es auch wenn man versucht OOP in 2 Tagen mit der Brechstange zu lernen!
              2.) Du fragst dich vielleicht, wieso du vor die Variable objekt1 in meinem Beispiel nochmal die Klasse hinschreiben musst. Das hängt mit der Vererbung zusammen. Sei z.B. Klasse ein Erbe von UeberKlasse, hättest du auch genausogut schreiben dürfen

              UeberKlasse objekt1 = new Klasse();

              weil jedes Objekt vom Typ Klasse auch ein Objekt vom Typ Ueberklasse ist.

              Sollten widererwarten sowohl neueKlasse als auch alteKlasse (deswegen ist es in Java wichtig zwischen Grpß- und Kleinschreibung zu unterscheiden) Objekte sein, Typkompatible Variablen sein, darfst du das auch machen, dann speicherst du halt die Referenz auf das die Variable alteKlasse zeigt nochmal in der Variable neueKlasse ab. Doppelt genäht hält besser.

              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?

              Es gibt Bücher, Tutorials und natürlich die Javadoc

              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)?

              Indem du das Ding in ein JAR packst, die Manifest-Datei entsprechend schreibst und deinem Betriebssystem mitteilst, dass es Jar-Dateien automatisch mit der JVM ausführen soll. Oder per Webstart. Oder als Applet.

              Zu guter letzt, in vielen Tutorials wird gesagt, dass jede Application eine main Methode braucht, wozu

              Damit die JVM weiß wo sie einsteigen muss. Irgendwo muss ja der Interpreter/die JVM anfangen deinen Code abzuarbeiten. Das tut er/sie in der main-Methode.

              Diese Frage

              und was hat es mit "(String[] args)" aufsich?

              und diese Anforderung

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

              "java Programm1 -Dennis"?

              hängen ganz eng zusammen.

              In meinem Tutorial steht dass es so sein muss, mehr nicht.

              Dein Tutorial taugt nichts. Schau dir mal den von mir verlinkten Thread an.

              Sorry, aber ich habe bis jetzt nur mit Visual Basic programmiert und Java ist totales Neuland für mich....

              Ich habe die Sorge, dass es das auch bleiben wird, wenn Du Dir nicht a) bessere Lernmaterialien zulegst und b) versuchst mit dem Kopf durch die Wand zu brechen. Die Stichworte die ich dir hier gegeben habe dürften dich für die nächsten Wochen beschäftigen ...

              Beste Grüße
              Biesterfeld

              --
              Art.1: Et es wie et es
              Art.2: Et kütt wie et kütt
              Art.3: Et hätt noch immer jot jejange
              Das Kölsche Grundgesetz