次の点を考慮して、静的メソッドをfinalにすることを考える立場にあるかもしれません。
次のクラスがあります。
class A {
static void ts() {
System.out.print("A");
}
}
class B extends A {
static void ts() {
System.out.print("B");
}
}
これらのメソッドを呼び出す「正しい」方法は
A.ts();
B.ts();
結果はAB
次のようになりますが、インスタンスのメソッドを呼び出すこともできます。
A a = new A();
a.ts();
B b = new B();
b.ts();
その結果AB
も同様です。
次のことを考えてみましょう。
A a = new B();
a.ts();
それは印刷されますA
。実際にはクラスのオブジェクトを持っているので、これは驚くかもしれませんB
。ただし、型の参照から呼び出すため、A
が呼び出されますA.ts()
。B
次のコードで印刷できます:
A a = new B();
((B)a).ts();
どちらの場合も、あなたが持っているオブジェクトは実際にはクラスのものB
です。ただし、オブジェクトを指すポインターに応じて、メソッドfrom A
またはfrom を呼び出しますB
。
ここで、あなたがクラスの開発者でA
あり、サブクラス化を許可したいとします。ただしts()
、サブクラスからでも呼び出されるたびにmethodが本当に必要です。これは、サブクラスバージョンによって隠されないようにしたいことを実行します。次に、それを作成してfinal
、サブクラスに隠されないようにすることができます。そして、次のコードがクラスからメソッドを呼び出すことを確認できますA
。
B b = new B();
b.ts();
わかりました、なんとなく構築されていますが、場合によっては意味があるかもしれません。
インスタンスではなくクラスで直接静的メソッドを呼び出さないでください。そうすると、その問題は発生しません。また、たとえばIntelliJ IDEAは、インスタンスで静的メソッドを呼び出した場合、および静的メソッドをfinalにした場合に警告を表示します。