logo

Java で静的メソッドをオーバーライドできますか?

Javaでは、 オーバーライド そして 過負荷 の 2 つの最も重要な機能です オブジェクト指向プログラミング 。この機能は、プログラマが次のことを実現したい場合に使用されます。 多態性 。質問、 Javaの静的メソッドをオーバーライドできますか または Javaで静的メソッドをオーバーロードできますか で尋ねられる 2 つの最も重要な質問は Java インタビュー 。このセクションでは、オーバーロードとオーバーライドについて簡単に説明します。の答えも解説しました Java では静的メソッドをオーバーライドできないのはなぜですか?

静的メソッド

メソッド名の前に静的キーワードがあるメソッドは、 静的メソッド 。としても知られています クラスレベルのメソッド 。静的メソッドのコピーは、クラスのすべてのオブジェクトによって共有されます。

 public static int sum() { } 

クラス名を使用して静的メソッドを呼び出すことができます。例えば、 数学.abs(a) 方法 。このメソッドは、渡された引数の絶対値を返します。静的メソッドはインスタンス変数またはメソッドにアクセスできません。

メソッドのオーバーライド

の特徴です オブジェクト指向プログラミング 。これは、実行時のポリモーフィズムを実現するために使用されます。サブクラスは、親クラスによってすでに提供されているメソッドの特定の実装を提供します。 メソッドのオーバーライド。 親クラスと子クラスのメソッドのシグネチャは同じである必要があります。で メソッドのオーバーライド 、どのメソッドが実行されるかは実行時に決定されます。決定は、呼び出したオブジェクトに従って行われます。

メソッドのオーバーロード

これはオブジェクト指向プログラミングの機能でもあります。これはコンパイル時のポリモーフィズムを実現するために使用されます。これにより、同じメソッド名を使用しても、異なるシグネチャを使用できるようになります。クラスに同じ名前でメソッド シグネチャが異なるメソッドが複数ある場合、それは次のように呼ばれます。 メソッドのオーバーロード

オーバーロードとオーバーライドとは何かを学びました。さて、本題に移ります。

静的メソッドをオーバーロードできますか?

答えは はい 。静的メソッドをオーバーロードできます。ただし、メソッドのシグネチャは異なる必要があることに注意してください。たとえば、次の Java プログラムについて考えてみましょう。

OverloadStaticMethodExample1.java

 public class OverloadStaticMethodExample1 { //static method public static void display() { System.out.println('Static method called.'); } //overloaded static method public static void display(int x) { System.out.println('An overloaded static method called.'); } //main method public static void main(String args[]) { //calling static method by using the class name OverloadStaticMethodExample1.display(); OverloadStaticMethodExample1.display(160); } } 

出力:

 Static method called. An overloaded static method called. 

ここで疑問が生じますが、 static キーワードだけが異なる場合、メソッドをオーバーロードできますか。

答えは いいえ。 static キーワードだけが異なる 2 つのメソッドをオーバーライドすることはできません。たとえば、次の Java プログラムについて考えてみましょう。

OverloadStaticMethodExample2.java

 public class OverloadStaticMethodExample2 { //static method public static void sum(int a, int b) { int c=a+b; System.out.println('The sum is: '+c); } //non-static method public void sum(int a, int b) { int c=a+b; System.out.println('The sum is: '+c); } //main method public static void main(String args[]) { //calling static method by using the class name OverloadStaticMethodExample2.sum(12, 90); } } 

上記のプログラムをコンパイルすると、次のエラーが表示されます。

 error: method sum(int,int) is already defined in class OverloadStaticMethodExample2 

静的メソッドをオーバーライドできますか?

いいえ、 メソッドのオーバーライドは実行時の動的バインディングに基づいており、静的メソッドはコンパイル時に静的バインディングを使用して結合されるため、静的メソッドをオーバーライドすることはできません。したがって、静的メソッドをオーバーライドすることはできません。

メソッドの呼び出しは、静的メソッドを呼び出すオブジェクトのタイプによって異なります。その意味は:

  • 親クラスのオブジェクトを使用して静的メソッドを呼び出すと、元の静的メソッドが親クラスから呼び出されます。
  • 子クラスのオブジェクトを使用して静的メソッドを呼び出すと、子クラスの静的メソッドが呼び出されます。

次の例では、ParentClass には display() という名前の静的メソッドがあり、ChildClass にも同じメソッド シグネチャがあります。派生クラス (ChildClass) のメソッドは、基本クラスのメソッドを隠します。例を見てみましょう。

OverloadStaticMethodExample3.java

 public class OverloadStaticMethodExample3 { public static void main(String args[]) { ParentClass pc = new ChildClass(); //calling display() method by parent class object pc.display(); } } //parent class class ParentClass { //we cannot override the display() method public static void display() { System.out.printf('display() method of the parent class.'); } } //child class class ChildClass extends ParentClass { //the same method also exists in the ParentClass //it does not override, actually it is method hiding public static void display() { System.out.println('Overridden static method in Child Class in Java'); } } 

出力:

 display() method of the parent class.