10

私はソフトウェア開発コースのために勉強していて、サンプルから質問に出くわしました:

「Java メソッドの前に static 修飾子と final 修飾子の両方を配置しても意味がないのはなぜですか?」

私は少し調査しましたが、どこに行ってもそれは悪い習慣ではなく、そうするのには十分な理由があります-たとえば、このスタックオーバーフローの質問: 最終的な静的メソッドを宣言するのは悪い考えですか?

では、この質問自体は無意味ですか、それともこの質問に対する正当な答えはありますか?

(このサンプル ペーパーには特定のソリューションはありません)

4

4 に答える 4

8

staticメソッドはクラスのインスタンスではなく、クラス自体に関連付けられているため、オーバーライドできません。たとえば、これは通常メソッドを呼び出すstatic方法です。

  MyClass.myStaticMethod()

そして、これはインスタンスメソッドを呼び出す方法です:

  new MyClass().myInstanceMethod()

final修飾子は、クラスを拡張する際のオーバーライドを禁止するメソッドで使用されます。

于 2012-12-11T16:59:26.873 に答える
5

static メソッドをオーバーライドできないためです。したがって、それをマークしても意味がありませんfinal

ただし、static final 変数(奇妙なことに、変更できないため変数ではありません) は、コンパイラによって値をインライン化できるため、非常に便利です。

于 2012-12-11T17:00:27.483 に答える
1

静的メソッドは、実行時に解決され、見つかるまでクラスチェーンを上方向に検索するため、一種のオーバーライドが可能です (ただし、これは専門用語ではありません)。しかし、この「機能」はおそらく間違いです。人々はそれを使わず、人々はそれについて知りません。私たちはそれが存在しないふりをするべきです。

于 2012-12-11T17:32:46.717 に答える
0

Java言語仕様から:

クラスメソッドは、特定のオブジェクトを参照せずに常に呼び出されます。キーワードthisまたはキーワードsuperを使用して現在のオブジェクトを参照しようとすると、コンパイル時エラーになります。

したがって、静的メソッドはインスタンスに属していないため、オーバーライドすることはできません。したがって、キーワードthissuperは使用できず、仮想メソッド呼び出しを使用することはできません。また、仮想メソッドの呼び出しを使用できない場合、finalキーワードは役に立ちません。

コンパイラは次のようなメソッド宣言を認識していると思います。

public class SomeClass{

    // public static classMethod() becomes
    public static [final] void classMethod(){
        //...
    }

    // and public void instanceMethod() becomes
    public void instanceMethod(SomeClass this, Object super){
        //....
    }

}

public class SomeOtherClass extends SomeClass{

    // overrides
    @Override
    public void instanceMethod(SomeOtherClass this, SomeClass super){
        //...
    }
}

そして、あなたはSomeClass instance = new SomeOtherClass().instanceMethod();それをとinstanceMethod()呼びますSomeOtherClass

したがって、コンパイラはメソッド本体をコピーする必要はなく、スレッド内の現在のオブジェクトへの参照を渡すだけです。したがって、仮想メソッド呼び出しを使用する場合、実際にはinstanceMethod、現在のオブジェクト(this)への参照を使用してを呼び出しており、現在のクラスのbodyメソッドが呼び出されます。

于 2012-12-11T17:05:29.030 に答える