0

重複の可能性:
Java で静的メソッドをオーバーライドできますか?

基本クラスの静的メソッドをオーバーライドすることはできません。

実際に私は次のようなことを試しました:

// Base class
public class StaticExampleImpl {
    protected String name="overriding";
    public static void display(){
        System.out.println("static method display : base class");
    }
}

次に、派生クラスは次のとおりです。

//derived class
public class StaticDemo extends StaticExampleImpl {
    // cannot override the static methods...
    //@Override
    public static void display(){
        System.out.println("child!!! static method display");
    }
    public static void main(String[] args) {
        StaticDemo d=new StaticDemo();
        d.display(); // derived class display is called rather than Base class.
    }
}

そのため、メソッドのコメントを外すと、@Override「静的メソッドをオーバーライドできません」というエラーが発生します。しかし、コメントするとうまくいきます。したがって、オブジェクトを作成し、インスタンスで静的メソッドを呼び出すと、それらは正常に機能します。だから違いは何ですか??

4

8 に答える 8

5

静的メソッドは継承されないためです。

コメントを外す@Overrideと、静的メソッドをオーバーライドしようとしていることを意味します。これは、エラーが発生する理由です。

ただし、コメント//@Overrideすると、子クラスで新しいメソッドを宣言していることを意味します。

于 2012-07-24T11:17:49.390 に答える
1

Overridingクラスのインスタンスに依存します。 polymorphismクラスをサブクラス化でき、それらを実装するオブジェクトは、スーパークラス(およびサブクラス)でsubclasses定義されたメソッドに対して異なる動作をするということです。メソッドはクラスのインスタンスに属さないため、この概念は適用されません。overriddenstatic

于 2012-07-24T11:48:57.650 に答える
1

静的メソッドはクラスのインスタンスに属しておらず、実際のクラスに属しています。

を呼び出すときd.display();、実際にはStaticDemo d 参照の静的メソッドの静的メソッドを呼び出しています。

あなたがした場合:

StaticExampleImpl d2 = new StaticDemo();d2.display()、基本クラスのディスプレイを呼び出すことがわかります。

ただし、これは行わないでください。これはコードを混乱させることにつながり、継承をうまく実装できない悪い方法です。

于 2012-07-24T11:21:49.860 に答える
0

静的メソッドは継承できません。「基本」クラスの静的メソッドを呼び出したい場合は、明示的に呼び出す必要がありますStaticExampleImpl.display()

于 2012-07-24T11:21:15.630 に答える
0

次のコード:

StaticExampleImpl one = new StaticExampleImpl();
StaticDemo two = new StaticDemo();
StaticExampleImpl three = two;

one.display();
two.display();
three.display();

次の出力が得られます。

static method display : base class
child!!! static method display
static method display : base class

ご覧のとおり、メソッドは継承されません。これが「静的メソッド」と呼ばれる理由です。インスタンス メソッドのように、動的ではなく静的に呼び出されます。クラスのコンパイル時の型は、実行時の型ではなく、静的メソッドを呼び出すときに重要です。

これが、オブジェクト インスタンスを介して静的メソッドを呼び出すべきではない理由でもあります。常に次のように呼び出します。

StaticExampleImpl.display();
StaticDemo.display();

これにより、人々がこれらのメソッドで継承が機能することを期待するときに発生する可能性がある (発生する可能性がある) 混乱が完全に取り除かれます。

于 2012-07-24T11:25:24.103 に答える
0

静的メソッドは継承できないクラスにバインドされているため、派生クラスに基本クラスの静的メソッドを含めることはできません。

于 2012-07-24T11:22:01.733 に答える
0

静的メソッドをオーバーライドしようとしている場合は、おそらく設計に問題があります。

OOP とポリモーフィズムにより、次のことが可能になります。

public class MyClass1 {

   public String toString() { return "MyClass1 Instance"; }

}

public class MyClass2  extends MyClass1 {

   @Override
   public String toString() { return "MyClass1 Instance"; }

}

public void printSomething(MyClass1 myclass1){
      System.out.println(myclass1);
}

printSomething 内で呼び出される toString メソッドは、myClass1 のランタイム タイプのものです。printSomething 内に MyClass2 のインスタンスを渡すと、そのコンパイル タイプは MyClass1 になりますが、そのランタイム タイプは MyClass2 になります。

ポリモーフィズムを使用するには、実際の実行時の型がコンパイルの型と異なる可能性があるオブジェクト インスタンスが必要であることは明らかです。ただし、静的メソッドはどのオブジェクト インスタンスにも属さず、クラスに属します。あなたが達成しようとしていることを説明してください。

于 2012-07-24T11:25:00.937 に答える
0

Javaの静的ブロックは静的変数である可能性があり、クラスがロードされるとメソッドがロードされます。おそらくJavaのクラスローダーについて知っているでしょう。つまり、静的ブロック(メソッド、変数、または静的なもの)は一度ロードされます。したがって、実際には静的ブロックをオーバーライドすることはできません。

@Override にコメントを付けるということは、サブクラスに別の静的メソッドを記述していることを意味しますが、基本クラスのメソッドをオーバーライドするだけではありません。

于 2012-07-24T11:27:46.497 に答える