Java の this について

Javaでは動的に付けたり外したりできず、class宣言時にすべてが決まってしまうから、thisが参照するインスタンスは固定的にできるわけですね。

JavaScriptのthisではまった - No Programming, No Life

実はこれはダウト。Java では継承があるから、事実上 this に入るクラスを静的に決定することは不可能。そして final クラスにしたとしても、どのインスタンスが入るかを決めるのは難しいわけです。
そういうわけで、Java の this はどうやって決めているかというと、メソッド呼び出し元が、呼び出し先 this に入れるオブジェクトを「隠し引数」として指定しているのです。
JVM の invokevirtual 命令は、指定のオブジェクトを this としてスタックに積み、呼び出しを行います。this の実体は、ALOAD_0 命令で参照可能な、引数だったりするのです。*1
ちなみに .NET VM でも同じ仕組みだったり。

*1:ちなみに ALOAD 命令は、引数を参照する命令