web-dev-qa-db-ja.com

Javaの静的メソッドをオーバーライドおよびオーバーロードできますか?

知りたい:

  1. なぜ静的メソッドはJavaでオーバーライドできないのですか?
  2. Javaで静的メソッドをオーバーロードできますか?
57
giri

静的メソッドは、Wordの正確な意味でオーバーライドすることはできませんが、親の静的メソッドを非表示にすることができます

実際には、tueコンパイラは、オーバーライドされたインスタンスメソッドの場合のように、ランタイムではなくコンパイル時に実行するメソッドを決定することを意味します。

きちんとした例では、 here のように見えます。

そして this はJavaドキュメントであり、overrideingインスタンスメソッドとhidingクラス(静的)メソッド。

オーバーライド:Javaでオーバーライドすると、特定のメソッドが、オブジェクトの実行時のタイプではなく、オブジェクトの実行時のタイプに基づいて呼び出されることを意味します。コンパイル時のタイプ(オーバーライドされた静的メソッドの場合)

非表示:静的な親クラスメソッドは子クラスの一部ではありません(アクセス可能ですが)ので、オーバーライドすることは問題ありません。親クラスの静的メソッドと同じ別の静的メソッドをサブクラスに追加しても、このサブクラスの静的メソッドは一意であり、親クラスの静的メソッドとは異なります。

75
opensas

静的メソッドは、2つの異なるメソッドであるため、オーバーライドするものがないため、オーバーライドできません。例えば

static class Class1 {
    public static int Method1(){
          return 0;
    }
}
static class Class2 extends Class1 {
    public static int Method1(){
          return 1;
    }

}
public static class Main {
    public static void main(String[] args){
          //Must explicitly chose Method1 from Class1 or Class2
          Class1.Method1();
          Class2.Method1();
    }
}

はい、静的メソッドは他のメソッドと同様にオーバーロードできます。

25
VolatileDream

静的メソッドは、実行時にオブジェクトインスタンスにディスパッチされないため、オーバーライドできません。コンパイラーは、呼び出されるメソッドを決定します。

これが、書くときにコンパイラの警告を受け取る理由です

 MyClass myObject = new MyClass();
 myObject.myStaticMethod();
 // should be written as
 MyClass.myStaticMethod()
 // because it is not dispatched on myObject
 myObject = new MySubClass();
 myObject.myStaticMethod(); 
 // still calls the static method in MyClass, NOT in MySubClass

静的メソッドはオーバーロードできます(つまり、パラメータタイプが異なる限り、複数のメソッドに同じメソッド名を付けることができます)。

 Integer.parseInt("10");
 Integer.parseInt("AA", 16);
9
Thilo

静的な親クラスメソッドは子クラスの一部ではありません(アクセス可能ですが)ので、オーバーライドすることは問題ありません。親クラスの静的メソッドと同じ別の静的メソッドをサブクラスに追加しても、このサブクラスの静的メソッドは一意であり、親クラスの静的メソッドとは異なります。

6
Kumar Manish

静的メソッドは、オブジェクトの状態の一部ではないため、オーバーライドできません。むしろ、それらはクラスに属します(つまり、クラスメソッドです)。静的(および最終)メソッドをオーバーロードしても問題ありません。

4
Manoranjan

サブクラス名MysubClassを使用してメソッドを呼び出すと、サブクラスメソッドは、静的メソッドをオーバーライドできるかどうかを表示します。

class MyClass {
    static void myStaticMethod() {
        System.out.println("Im in sta1");
    }
}

class MySubClass extends MyClass {

    static void  myStaticMethod() {
        System.out.println("Im in sta123");
    }
}

public class My {
    public static void main(String arg[]) {

        MyClass myObject = new MyClass();
        myObject.myStaticMethod();
        // should be written as
        MyClass.myStaticMethod();
        // calling from subclass name
        MySubClass.myStaticMethod();
        myObject = new MySubClass();
        myObject.myStaticMethod(); 
        // still calls the static method in MyClass, NOT in MySubClass
    }
}
3
Dalee Bisen

静的メソッドは、その単一のコピーがクラスのすべてのオブジェクトによって共有されるメソッドです。静的メソッドはオブジェクトではなくクラスに属します。静的メソッドはオブジェクトに依存していないため、Javaコンパイラはオブジェクトの作成を待つ必要がありません。 ;

メソッドのオーバーロードの場合、メソッドはオーバーロードするのと同じクラスにある必要があります。静的として宣言されている場合でも、

   Class Sample
    {
         static int calculate(int a,int b,int c)
           {
                int res = a+b+c;
                return res;
           }
           static int calculate(int a,int b)
           {
                int res = a*b;
                return res;
           }
}
class Test
{
   public static void main(String []args)
   {
     int res = Sample.calculate(10,20,30);
   }
}

ただし、メソッドのオーバーライドの場合、スーパークラスのメソッドとサブクラスのメソッドは異なるメソッドとして機能します。スーパークラスには独自のコピーがあり、サブクラスには独自のコピーがあるため、メソッドをオーバーライドすることはありません。

3
Pravin Kamble

いいえ、静的メソッドはオブジェクトではなくクラスの一部であるため、オーバーライドできません。しかし、静的メソッドをオーバーロードできます。

2
user2481001

staticメソッドはclassレベルのメソッドです。

非表示の概念は、staticメソッドに使用されます。

参照: http://www.coderanch.com/how-to/Java/OverridingVsHiding

2
NarutoUzumaki

なぜJavaが静的メソッドのオーバーライドを許可しないのですか?

オーバーライドは、クラスのインスタンスを持つことに依存します。多態性のポイントは、クラスをサブクラス化でき、それらのサブクラスを実装するオブジェクトは、スーパークラスで定義された(およびサブクラスでオーバーライドされた)同じメソッドに対して異なる動作をすることです。静的メソッドはクラスのインスタンスに関連付けられていないため、この概念は適用できません。

これに影響するJavaの設計を推進する2つの考慮事項がありました。 1つはパフォーマンスに関する懸念でした。Smalltalkが遅すぎること(ガベージコレクションとポリモーフィックコールがその一部である)に対する多くの批判があり、Javaの作成者はそれを避けることに決めました。もう1つは、Javaの対象読者がC++開発者であるという決定でした。静的メソッドをC++プログラマーに馴染みのある方法で機能させる方法は、実行するまで待機してメソッドを呼び出す必要がないため、非常に高速でした。

1
Tejas Bagade
class SuperType {

    public static void  classMethod(){
        System.out.println("Super type class method");
    }
    public void instancemethod(){
        System.out.println("Super Type instance method");
    }
}


public class SubType extends SuperType{


    public static void classMethod(){
        System.out.println("Sub type class method");
    }
    public void instancemethod(){
        System.out.println("Sub Type instance method");
    }
    public static void main(String args[]){
        SubType s=new SubType();
        SuperType su=s;
        SuperType.classMethod();// Prints.....Super type class method
        su.classMethod();   //Prints.....Super type class method
        SubType.classMethod(); //Prints.....Sub type class method 
    }
}

静的メソッドのオーバーライドのこの例

注:オブジェクト参照を使用して静的メソッドを呼び出すと、オブジェクトクラスの静的メソッドではなく、参照type(class)静的メソッドが呼び出されます。

静的メソッドはクラスのみに属します。

1
shivakrishna

オーバーロードは静的バインディングとも呼ばれるため、Word staticが使用されるとすぐに静的メソッドは実行時ポリモーフィズムを表示できませんを意味します。

静的メソッドをオーバーライドすることはできませんが、スーパークラスとそのサブクラスに同じ静的メソッドの異なる実装が存在することは有効。その派生クラスは、基本クラスの実装を隠すだけです。

静的メソッドの場合、メソッド呼び出しは参照のタイプに依存し、参照されるオブジェクトではありません。つまり、静的メソッドはクラスにのみ属し、そのインスタンスには属しません。したがって、メソッド呼び出しはコンパイル時に決定されます。

一方、メソッドのオーバーロードの場合staticメソッドはオーバーロードできますiffパラメータの差分数またはタイプがあります。 2つのメソッドが同じ名前と同じパラメーターリストを持っている場合、「static」キーワードを使用することによってのみ異なるメソッドを定義することはできません。

1
Geetika Agarwal

静的メソッドを使用するまさにその目的は、インスタンスを作成せずにクラスのメソッドにアクセスすることです。classname.method()によってアクセスされるため、そのメソッドをオーバーライドしても意味がありません。

0
Sathesh

静的メソッドをオーバーロードできますが、静的メソッドをオーバーライドすることはできません。実際には、サブクラスの静的メソッドを書き換えることができますが、オーバーライドはポリモーフィズムと動的バインディングに関連する必要があるため、これはオーバーライドと呼ばれません。静的メソッドはクラスに属しているため、これらの概念とは関係ありません。静的メソッドの書き換えは、シャドウイングに似ています。

0
charles_ma

静的メソッドのオーバーライドのコードを設計します。それは簡単にオーバーライドできると思います。静的メンバーをオーバーライドできないことを明確にしてください。

class Class1 {
    public static int Method1(){
          System.out.println("true");
          return 0;
    }
}
class Class2 extends Class1 {
    public static int Method1(){
   System.out.println("false");
          return 1;
    }

}
public class Mai {
    public static void main(String[] args){
           Class2 c=new Class2();
          //Must explicitly chose Method1 from Class1 or Class2
          //Class1.Method1();
          c.Method1();
    }
}
0
Nitin

実際に理解するのは非常に簡単です-静的とマークされたものはすべてクラスのみに属します。たとえば、静的メソッドは、宣言されたクラスに属するため、サブクラスに継承できません。 staticキーワードを参照してください。

この質問で私が見つけた最良の答えは:

http://www.geeksforgeeks.org/can-we-overload-or-override-static-methods-in-Java/

0
hitesh141

静的メソッドはインスタンスではなくクラスの一部であるため、静的メソッドをオーバーライドすることはできません

0
Pavan T

いいえ、静的メソッドをオーバーライドすることはできません。静的は、インスタンスではなくクラスに対して解決されます。

public class Parent { 
    public static String getCName() { 
        return "I am the parent"; 
    } 
} 

public class Child extends Parent { 
    public static String getCName() { 
        return "I am the child"; 
    } 
} 

各クラスには静的メソッドgetCName()があります。クラス名を呼び出すと、期待どおりに動作し、それぞれが期待値を返します。

@Test 
public void testGetCNameOnClass() { 
    assertThat(Parent.getCName(), is("I am the parent")); 
    assertThat(Child.getCName(), is("I am the child")); 
} 

この単体テストに驚きはありません。しかし、これはオーバーライドではありません。これは、名前の衝突があるものを宣言します。

クラスのインスタンスから静的に到達しようとすると(良いプラクティスではありません)、実際に表示されます:

private Parent cp = new Child(); 
`enter code here`
assertThat(cp.getCName(), is("I am the parent")); 

Cpは子ですが、静的はオブジェクトの実際の型ではなく、宣言された型の親を通じて解決されます。非静的メソッドの場合、非静的メソッドはその親のメソッドをオーバーライドできるため、これは正しく解決されます。

0
user2500552