静的メソッドとは
クラスで宣言されているが、そのクラスの特定のインスタンス化に依存しないオブジェクト指向のコンピュータープログラミングメソッドは、静的メソッドと呼ばれます。 ほとんどのプログラミング言語では、メソッドを静的にするために、メソッドの宣言にキーワードstaticが含まれています。 これらのメソッドは、それらが含まれるクラスに厳密に属し、そのクラスからインスタンス化されたオブジェクトには属しません。 それらはクラスメソッドと呼ばれます 。
通常、クラスのリテラル名は、インスタンス化されたオブジェクトの名前で参照するのではなく、静的メソッドにアクセスするために使用されます。 Javaでは、オブジェクト名を使用してこれらのメソッドを参照することは許可されていますが、お勧めできません。 オブジェクト名を使用すると、コードを読んでいる人がこれらのメソッドの1つをインスタンスメソッドと混同する可能性があります。
静的メソッドは、特定のクラスのインスタンス変数に依存しないユーティリティクラスでよく使用されます。 また、プログラマがメソッドにアクセスする必要があるが、メソッドに含まれるクラスをインスタンス化する必要がない場合にも使用されます。ユーティリティクラスは通常、オブジェクトにインスタンス化されません。 ユーティリティメソッドがオブジェクト情報を変更する必要があることはまれです。 pow()などのjava.lang.mathクラスのメソッドは、このタイプのメソッドがユーティリティクラスでどのように使用されるかの例です。
インスタンスメソッドは、インスタンス変数、静的変数、インスタンスメソッド、および静的メソッドに直接アクセスできます。 静的メソッドは、インスタンス変数とインスタンスメソッドに直接アクセスできません。 インスタンスメソッドは、静的メソッドよりもクラスメンバへのアクセスが優れているため、インスタンスメソッドは通常のクラスで通常使用されるメソッドのタイプです。
静的メソッドの大きな欠点の1つは、ポリモーフィズムが使用される継承中に発生します。 親の静的メソッドがfinalとして宣言されていない限り、同じ子の静的メソッドを、オーバーライドされているかのように子クラスにコーディングできます。 静的メソッドはオーバーライドできないため、これは技術的にオーバーライドではなく非表示と呼ばれます。
非表示を使用する場合、クラス名を使用して親静的メソッドにアクセスすると、親メソッドが使用されます。 オーバーライドされた子静的メソッドがオブジェクト名を使用してアクセスされる場合、オーバーライドされた子メソッドが使用されます。 この問題は、子オブジェクトが親としてアップキャストされるときに発生します。 この場合、アップキャストされた子静的メソッドへの呼び出しは、予想される子メソッドの代わりに親メソッドを使用します。 真のポリモーフィズムでは、子メソッドはアップキャスト後にアクティブ化されます。