Potreste trovarvi nella posizione di pensare di fare un ultimo metodo statico, considerando quanto segue:
aventi le seguenti classi:
class A {
static void ts() {
System.out.print("A");
}
}
class B extends A {
static void ts() {
System.out.print("B");
}
}
Ora il modo 'corretto' a chiamare questi metodi sarebbe
A.ts();
B.ts();
che si tradurrebbe in AB
ma si potrebbe anche chiamare i metodi su casi:
A a = new A();
a.ts();
B b = new B();
b.ts();
che risulterebbe in AB
pure.
Consideriamo ora il seguente:
A a = new B();
a.ts();
che stampare A
. Questo potrebbe sorprenderti dato che hai effettivamente un oggetto della classe B
. Ma dal momento che lo chiami da un riferimento di tipo A
, chiamerà A.ts()
. Si potrebbe stampare B
con il seguente codice:
A a = new B();
((B)a).ts();
In entrambi i casi l'oggetto che hai è in realtà dalla classe B
. Ma a seconda del puntatore che punta all'oggetto, chiamerai il metodo da A
o da B
.
Ora supponiamo che tu sia lo sviluppatore della classe A
e desideri consentire la sottoclassificazione. Ma vuoi davvero il metodo ts()
, ogni volta che viene chiamato, anche da una sottoclasse, cioè fa ciò che vuoi che faccia e non sia nascosto da una versione di sottoclasse. Quindi potresti renderlo final
e impedire che venga nascosto nella sottoclasse. E si può essere sicuri che il seguente codice chiamerà il metodo dalla classe A
:
B b = new B();
b.ts();
Ok, admittetly che è in qualche modo costruito, ma potrebbe avere senso per alcuni casi.
Non dovresti chiamare metodi statici su istanze ma direttamente sulle classi - quindi non avrai questo problema. Ad esempio, IntelliJ IDEA ti mostrerà un avviso, se chiami un metodo statico su un'istanza e anche se definisci un metodo statico definitivo.
sembra strano, +1 per la domanda, ma fino ad ora nessuna delle risposte sono soddisfacenti. –
Non è sovrascritto. È ancora lì a A.ts(). –