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
finalsind, können nicht mehr mitextendserweitert 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 vonequals). - 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