Möglicherweise sind Sie in der Lage, über eine endgültige statische Methode nachzudenken, wenn Sie Folgendes berücksichtigen:
Folgende Klassen haben:
class A {
static void ts() {
System.out.print("A");
}
}
class B extends A {
static void ts() {
System.out.print("B");
}
}
Nun wäre die "richtige" Art, diese Methoden aufzurufen
A.ts();
B.ts();
Dies würde dazu führen, AB
aber Sie könnten die Methoden auch für Instanzen aufrufen:
A a = new A();
a.ts();
B b = new B();
b.ts();
was auch dazu führen würde AB
.
Betrachten Sie nun Folgendes:
A a = new B();
a.ts();
das würde drucken A
. Das könnte Sie überraschen, da Sie tatsächlich ein Klassenobjekt haben B
. Da Sie es jedoch von einer Referenz des Typs aus aufrufen A
, wird es aufgerufen A.ts()
. Sie können B
mit folgendem Code drucken :
A a = new B();
((B)a).ts();
In beiden Fällen stammt das Objekt, das Sie haben, tatsächlich aus der Klasse B
. Abhängig vom Zeiger, der auf das Objekt zeigt, rufen Sie die Methode von A
oder von auf B
.
Angenommen, Sie sind der Entwickler der Klasse A
und möchten die Unterklassifizierung zulassen. Aber Sie möchten wirklich, dass die Methode ts()
, wann immer sie aufgerufen wird, auch von einer Unterklasse, genau das tut, was Sie möchten, und nicht von einer Unterklassenversion ausgeblendet wird. Dann könnten Sie es schaffen final
und verhindern, dass es in der Unterklasse versteckt wird. Und Sie können sicher sein, dass der folgende Code die Methode aus Ihrer Klasse aufruft A
:
B b = new B();
b.ts();
Ok, zugegeben, das ist irgendwie konstruiert, aber es könnte in einigen Fällen Sinn machen.
Sie sollten keine statischen Methoden für Instanzen aufrufen, sondern direkt für die Klassen - dann haben Sie dieses Problem nicht. Auch IntelliJ IDEA zeigt Ihnen beispielsweise eine Warnung an, wenn Sie eine statische Methode für eine Instanz aufrufen und wenn Sie eine statische Methode endgültig machen.