Java言語仕様から:
クラスメソッドは、特定のオブジェクトを参照せずに常に呼び出されます。キーワードthisまたはキーワードsuperを使用して現在のオブジェクトを参照しようとすると、コンパイル時エラーになります。
したがって、静的メソッドはインスタンスに属していないため、オーバーライドすることはできません。したがって、キーワードthis
とsuper
は使用できず、仮想メソッド呼び出しを使用することはできません。また、仮想メソッドの呼び出しを使用できない場合、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メソッドが呼び出されます。