Methodensignaturen

Zur Signatur einer Methode zählen:

  • Methodenname
  • Parameterliste

Der Rückgabetyp gehört nicht zur Methodensignatur.

Schlüsselwort static

Statische Methoden

class Beispiel 
{
    // Statische Methoden
    static void f() { /*...*/ } 
    static void g() { /*...*/ }
    
    // Nicht-Statische Methode
    void h() { /*...*/ }
    
    public static void main(String[] args) 
    {
        // Aufruf über Klassennamen
        f(); 
        
        // Aufruf von über Klassennamen
        Beispiel.g(); 
        
        // Aufruf von `h` nur über Objektreferenz möglich
        new Beispiel().h(); 
    }
}
  • Gehören zur Klasse, nicht zu instantierten Objekten
  • Können aufgerufen werden, ohne Objekte zu instantieren
  • Haben keinen Zugriff auf Instanzvariablen, sondern nur auf andere Statische Elemente der Klasse

Statische Attribute

class Beispiel 
{
    // Statisches Attribut
    static int count;
    
    // Konstruktor
    Beispiel() 
    {
        count++;
        printCount();
    }
 
    void printCount() 
    {
        System.out.print(count + " ");
    }
    
    public static void main(String[] args) 
    {
        Beispiel beispiel1 = new Beispiel();
        Beispiel beispiel2 = new Beispiel();
        
        beispiel1.printCount();
        beispiel2.printCount();
    }
}

Ausgabe:

1 2 2 2
  • Gehören nicht zu einer bestimmten Instanz
  • Werden von allen Instanzen der Klasse verwendet

Statische Codeblöcke

class Beispiel
{
    static {
        System.out.println("Hello There");
    }
}

Ausgabe:

Hello There
  • Werden einmalig ausgeführt, wenn die Klasse geladen wird

Schlüsselwort final

final double MEHRWERTSTEUERSATZ = 0.19;
  • Vergleichbar mit Konstanten
  • Kann einmal initialisiert werden
  • Danach sind änderungen unzulässig
  • Üblicherweise in UPPERCASE
  • Klassen, die final sind, können nicht mehr mit extends erweitert werden

Konstruktoren

Konstruktorverkettung

class Rectangle 
{
    int width, height;
 
    Rectangle(int width, int height) { 
        this.width = width; 
        this.height = height; 
    }
    
    Rectangle(int size) { 
        // Verwendet obigen Konstruktor wieder
        this(size, size); 
    }
}

Schlüsselwort var

Rechteck rechteck = new Rechteck(3, 4);
// Ist äquivalent zu:
var      rechteck = new Rechteck(3, 4);
  • Compiler ermittelt Typ aus Kontext
  • Nur Syntaxvariante, Code verhält sich genau gleich
  • Nur für lokale Variablen

Initialisierer

class Beispiel {
 
    String name;
 
    // Initialisierer
    {
        name = "Mustermann";
        System.out.println("Initialisierer: " + name);
    }
 
    // Konstruktor
    Beispiel() { 
        System.out.println("Konstruktor: " + name); 
    }
    
    public static void main(String[] args) { 
        new Beispiel(); 
    }
}

Ausgabe:

Initialisierer: Mustermann
Konstruktor: Mustermann
  • Codeblöcke innerhalb von Klassen, keine Methoden
  • Ausführung vor dem Konstruktor
  • Für komplexere Initialisierungen von Attributen

Packages

import java.time.Year;
// Auf statische Attribute und Methoden kann man ohne Klassennamen zugreifen:
import static java.lang.Math.*;
 
package test;
 
// ...
  • Angelegt wie Ordnerstruktur, mit Punkten getrennt
  • Wenn die package-Anweisung fehlt, wird der Code dem default package zugeordnet

Objekte Kopieren

Die Methode clone

  • Liefert eine Kopie Object, die vom selben Typ (selbe Klasse) sind und gleich sind (im Sinne von equals).
  • Wirft eine CloneNotSupportedException, falls das Klonen fehlschlägt

Das Interface clonable

Leeres Interface (Marker-Interface), hat keine Methoen zu implementieren. Sagt der JVM, dass die clone()-Funktion darauf aufrufbar ist.

Shallow vs. Deep Copy

  • Shallow Copy: Das Objekt wird geklont, Referenzen des Objektes bleiben aber gleich
  • Deep Copy: Das Objekt samt aller Referenzen werden geklont