Literatur

Klassen in Java

Wir definieren uns nun einen eigenen Datentypen, d.h. wir erstellen unsere erste eigene Klasse in Java. Unsere erste Klasse soll Punkt heißen und hat folgenden Aufbau.

class Punkt  // Deklaration der Klasse Punkt
{              
     /* Der Klassenrumpf enthält
    Datenfelder (Attribute) */
}  

 

Unsere Klasse Punkt ist momentan leer. So sieht die Klasse noch nicht nach einem komplexen Datentypen aus. Damit aus unserer Klasse ein komplexer Datentyp wird, benötigen wir noch Attribute. Attribute sind Variablen, die für eine Eigenschaft eines Objektes stehen.

Eine Variable kann überall in einer Klasse deklariert werden. Eine Variablendeklaration besteht immer aus einem Datentypen und dem Variablennamen. Der Variablenname sollte so gewählt werden, dass man beim Lesen sofort versteht, wofür die Variable verwendet wird. Da unsere Klasse Punkt noch keine Variablen besitzt, werden wir dieser nun zwei hinzufügen.

 

class Punkt            // Deklaration der Klasse Punkt
{                
    int x_koordinate;    /* x-Position unseres Punktes */
    int y_koordinate;    /* y-Position unseres Punktes */
}   

Somit haben wir nun unseren ersten komplexen Datentypen geschaffen. Er besteht momentan aus zwei Integer-Werten, die die Koordinaten des Punktes repräsentieren.

Klassen beinhalten in der Regel jedoch nicht nur Attribute, sondern auch Methoden. Da wir auf Methoden in einem späteren Kapitel ausführlich zu sprechen kommen, möchten wir Sie bitten, die Methode in unserem Beispiel einfach hinzunehmen. Zum einfacheren Verständnis nennen wir diese hier daher auch nur methode. In der Praxis sollten natürlich aussagekräftige Methodennamen gewählt werden.

class Punkt            // Deklaration der Klasse Punkt
{                
    int x_koordinate;    /* x-Position unseres Punktes */
    int y_koordinate;    /* y-Position unseres Punktes */
 
    // Anfang der Methode methode
    public void methode()
    {
          int lokale_variable;    /* lokal deklarierte Variable ist nur innerhalb der Methode verwendbar  */
    }
    // Ende der Methode methode
}

 


Wir haben nun unsere Klasse Punkt um eine Methode mit dem Namen methode erweitert. Innerhalb dieser Methode ist eine Variable lokale_variable deklariert. Diese Variable kann nur innerhalb dieser einen Methode verwendet werden. Die Variablen x_koordinate und y_koordinate sind hingegen auch in der gesamten Klasse verwendbar. Ein Variablenname sollte in einer Klasse nur einmalig vergeben werden.

Attribute können selber auch wieder komplexe Datentypen sein. Um dies zu verdeutlichen, erstellen wir die Klasse Linie:

class Linie            // Deklaration der Klasse Punkt
{ 
       Punkt punkt_eins;    // gibt den ersten Punkt der Linie an
       Punkt punkt_zwei;    // gibt den zweiten Punkt der Linie an
}


Eine Linie definiert sich über zwei Punkte. Nun könnten wir theoretisch auch als Attribute vier Integer-Werte nehmen, um die Koordinaten der beiden Punkte abzubilden.  Dies würde zwar auch seinen Zweck erfüllten, aber dies würde unserem objektorientierten Ansatz widersprechen.
Wir erstellen daher zwei Attribute, denen als Datentyp unser Klasse Punkt zugrunde liegt.

Falls Sie mit der Objektorientierung noch nicht vertraut sind, möchten wir Sie an dieser Stelle an das Kapitel "Objektorientierung" erinnern. Schauen Sie sich Ihr Umfeld an und überlegen Sie, wie Sie diese in einzelne Objekte zerlegen können. Genau so müssen Sie an die Programmierung herangehen. Stellen Sie sich zunächst den komplexesten Datentypen vor (hier: Linie) und überlegen Sie, wie er aus kleineren komplexen Datentypen zusammengesetzt werden kann. Versuchen Sie, sich diesen Ansatz mit der Klasse Punkt und Linie zu verinnerlichen. Wenn Sie einmal das Prinzip verstanden haben, wird es Ihnen leichtfallen, objektorientiert zu programmieren.

Man unterscheidet unterschiedliche Arten von Variablen:

Die einfache Instanzvariable ist eine Variable, die direkt den Objekten einer Klasse (den sogenannten "Instanzen") zugeordnet ist und daher bei jedem Objekt dieser Klasse unterschiedliche Werte enthalten kann.

Des Weiteren gibt es die Klassenvariable, die für alle Objekte dieser Klasse gemeinsam nur ein einziges mal - eben in der Klasse - existiert. Somit ist der Wert einer Klassenvariable immer für alle Objekte der Klasse gleich.

Die dritte Art von Variablen sind die lokalen Variablen. Diese Variablen werden nur in Methoden oder Blöcken deklariert und sind auch nur dort sichtbar und verwendbar.

Folgendes Beispiel zeigt Ihnen die Deklaration der unterschiedlichen Variablen-Arten:

class VariablenArten
{
       int x;                // Instanzvariable
       static int y;         // Klassenvariable
 
       // Methode Anfang
       void methode ()
       {
           int z=0;          // lokale Variable
       }
       // Methode Ende
}

 

Es folgen nun einige Beispiele für die Definition und Verwendung von Variablen. Hier möchten wir Sie bitten, sich die Beispiele erst anzusehen und zu überlegen, ob diese Beispiele in Ordnung sind. Unter den Beispielen befindet sich eine Schaltfläche, mit der Sie unsere Meinung oder Lösung erfahren.

Beispiel 1:

 

class Beispiel
{
    int variable1;
}




Beispiel 2:

class Beispiel2
{
    int Variable_1;
}   

 



Beispiel 3:

class Beispiel3
{
    Beispiel bsp;
}

 




Beispiel 4:
Kleine Anmerkung zu diesem Beispiel: Hinter dem Methodennamen befindet sich in Klammern eine Variable, ein sogenannter Parameter der Methode. Diese kann als lokale Variable der Methode methode angesehen werden. Genauere Details werden in dem Kapitel Methoden näher erläutert.

 

class Beispiel4
{
    int variable_1;
    // Anfang der Methode methode
    public void methode(int val)
    {
        variable_1=val;
    }
    // Ende der Methode methode
 }




Beispiel 5:

class Beispiel5
{
    int variable_1;
    // Anfang der Methode methode
    public void methode(int val)
    {
        int variable_1=val;
    }
    // Ende der Methode methode
 }

 




Beispiel 6:

class Beispiel6
{   
    // Anfang der Methode methode_1
    public void methode_1(int val)
    {
        int variable_1=val;
    }
    // Ende der Methode methode_1
 
    // Anfang der Methode methode_2
    public void methode_2(int val)
    {
        int variable_1=val;
    }
    // Ende der Methode methode_2
}

 

Damit wir die nächsten Beispiele durchgehen können, müssen Sie noch eine Kleinigkeit lernen. In jeder Klasse gibt es eine sogenannte „this“-Referenz oder auch –Zeiger genannt. Wer Erfahrungen in C++ gesammelt hat, wird bei dem Begriff "Zeiger" möglicherweise erschrecken. In Java ist dies jedoch weitaus unkomplizierter. Man spricht in Java statt von Zeiger auch eher von Referenz . Jede Klasse besitzt diese „this“-Referenz. This (deutsch: dieses) bezieht sich genau auf das Objekt, das die jeweilige Methode aufgerufen hat. Wir können auf Variablen und Methoden auch ohne die „this“-Referenz zugreifen. Wir sollten uns jedoch angewöhnen, wenn  wir die eigenen Variablen und Methoden einer Klasse benutzen möchten, die „this“-Referenz vorweg zu schreiben. Ein Beispiel für eine einfache Verwendung der „this“-Referenz, wäre z.B. die Abänderung von Beispiel 4:

class Beispiel4
{
    int variable_1;
 
    // Anfang der Methode methode
    public void methode(int val)
    {
        this.variable_1=val;
    }
    // Ende der Methode methode
}


Die Verwendung der „this“-Referenz erleichtert auch das Lesen von Quellcode. Dadurch kann man direkt sehen, dass die Variable eine Instanzvariable ist und keine lokale Variable. Je größer und komplexer eine Klasse ist, desto wichtiger sind solche scheinbaren Kleinigkeiten für die Lesbarkeit des Codes.

Zur Unterscheidung der verschiedenen Variablenarten folgt nun ein weiteres Beispiel:

Beispiel 7:
Hier sei kurz erwähnt, dass die Variable hinter dem „return“ an den Aufrufer der Methode zurückgegeben wird. Nähere Details lernen Sie in dem Kapitel über Methoden.

 

class Beispiel7
{
    int variable_1=0;
 
    // Anfang der Methode methode_1
    public int methode_1(int val)
    {
        variable_1=val;
        int variable_1=val;
        this.variable_1+=val;
        return this.variable_1;
    }
    // Ende der Methode methode_1
 
    // Anfang der Methode methode_2
    public int methode_2(int val)
    {
        int variable_1=val;
        return variable_1;
    }
    // Ende der Methode methode_2
}