次のことを考慮して、静的メソッドを最終的なものにすることを検討する立場にいることに気付くかもしれません。
次のクラスがあります。
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
。ただし、オブジェクトを指すポインタに応じて、からA
またはからメソッドを呼び出しますB
。
ここで、あなたがクラスの開発者でありA
、サブクラス化を許可したいとします。しかし、サブクラスから呼び出された場合でも、メソッドが本当に必要ですts()
。これは、サブクラスのバージョンによって隠されないように、メソッドが実行したいことを実行します。final
次に、それを作成して、サブクラスに隠されないようにすることができます。そして、次のコードがクラスからメソッドを呼び出すことを確認できますA
。
B b = new B();
b.ts();
確かに、それはどういうわけか構築されていますが、場合によっては意味があるかもしれません。
インスタンスで静的メソッドを呼び出すのではなく、クラスで直接呼び出す必要があります。そうすれば、その問題は発生しません。また、たとえばIntelliJ IDEAは、インスタンスで静的メソッドを呼び出した場合、および静的メソッドをfinalにした場合にも、警告を表示します。