追記:
ちなみにこの回答は「Javaでは概ねこんなかんじ」という一つの実装例を述べたに過ぎません。オブジェクト指向といっても言語によりその仕様や実装は様々です。全てがこうなっていると勘違いしないようにご注意ください。
内部的な仕組みをごく単純化したコメントを試みます。
1.データに自分自身が何者か教える機能
データと言っておられますがそれは「インスタンス」と言い換えてもよいと思います。JVMの内部ではインスタンスはヒープ上のある領域に格納されてますが、必ずヘッダーと呼ばれる制御情報がくっついています。(JVMの内部的な仕組みです)
そのヘッダーに「このインスタンスはどのクラスのものなのか」が記録されています。正確には知りませんがおそらくClassオブジェクトの参照が格納されているんだろうと思います。
2.メソッドを呼び出した際にそれを探索する機能
JVM内でメソッド呼び出しはinvokevirtualというようなbyte code命令として実現されてます。これも正確な手順をいえる程詳しくないですが...
実行する段になってみないとわからないことがあります。それはメソッドを呼び出そうとしている対象のインスタンスが実際にどのクラスのものなのかです。
A a;
というような宣言ではaが示すオブジェクトのクラスはAかも知れませんし、Aの派生クラスかも知れません。それは実行時にならないとわからないわけです。
そんなわけで、a.method()
というようなメソッド呼び出しを行う際、JVMは
(A) aが示すインスタンスのクラスを調べる
(B) そのクラスの中からmethod
という名前の引数なしのメソッドを探す
(C) もし定義がみつからなかったらそのクラスの基底クラスにさかのぼって探す
これを見つかるまで繰り返します。最終的にはObjectクラスのメソッドを探すことになります。そこまで探せば必ず見つかります。(見つからないようなケースは絶対にないようにjavaコンパイラーがコンパイル時に整合性をチェックしてくれます)
3.オブジェクト自身を参照できるように引数に束縛する機能
これも大雑把ですが最初に述べたようにオブジェクトはヒープ上のある領域に格納されてます。引数とかローカル変数はJVMのスタック領域にありますが、束縛(代入)は単にヒープ上にあるインスタンスのアドレス(またはアドレス的な何か)の値をスタック上の引数やローカル変数の格納場所へ書き込んでいるだけです。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。