オブジェクト指向の言語です。クラスとかオブジェクトとかは、大抵プログラムを書く側から説明されますが、実行する側(コンピューター側)のことを知っていると、「なんでこうなっているのか」がよく分かります。ここでは、メモリの使い方から、オブジェクト指向を裏から説明してみます。コンピューターの構成まずは話を進める前に、コンピューターの仕組みを復習しておきます。つがあれば、コンピューターだと言えます。入ってしまっている場合もあります。振られていて、アドレスを指定してデータを読み書きできます。言語だとお馴染み、ポインタの値です。計算するものやした結果を保存しておくことです。言語でいう変数はメモリに乗っていて、変数ごとにメモリアドレスがあります。プログラム実行中にメモリに乗っているものは変数だけではありません。(プログラム自体)も、変数と同じようにメモリに乗っています。メモリに乗っているということは、関数にもメモリアドレスがあるということです。プログラムだと、以下のように簡単に確認できます。アドレスを表示するのは、変数のときと同じルールです。アドレスが表示されます。言語の場合、メモリに乗っているのは「変数と関数」でした。場合、変数とメソッド(関数)は、どちらもオブジェクトに属しています。そこに変数とメソッドが乗っていることになります。集まり図にするとこんな感じです。いうインスタンスがあります。インスタンスの側にいます。インスタンスからクラス定義に向かってポインタが伸びています。これよって、インスタンスはどのクラスに属するかを知ることができます。インスタンスを増やしてみた例を載せます。同じクラス定義を指しています。継承とか、オブジェクト指向の基本的な概念もすっきり分かるようになります。変数が追加されています。変数は普通の変数とは格納される場所が違って、インスタンスではなくクラス(紺色)に入ります。変数は一つしかないことになります。継承の場合は、クラスからスーパークラスにポインタが伸びています。これにより、親クラス(スーパークラス)をたどることができます。ポインタここまでで、メモリの中にどんな風に変数やメソッドが乗っているかの説明ができました。実際に実行されるときのことを考えてみます。実行中を考えてみます。いうのはインスタンス側の変数です。メソッドが乗っているのはクラス側です。たどり着けるんでしょうか?答えはコンパイル時に行われている、ちょっとした処理(ズル)にあります。引数が無い関数のように見えますが、コンパイルするときに、ポインタを一つ引数に取るようになっています。このポインタは、メソッドを呼び出すときに、呼び出したインスタンスのアドレスが入るようになっています。ポインタ経由でインスタンス変数をたどれるような変換がされます。これにより、めでたくメソッド内からインスタンスにアクセスできるようになっています。メソッドというものもあります。メソッドは、インスタンス変数には一切アクセスできず、クラス変数だけにアクセスできます。ポインタをもらう必要はありません。関数とほとんど同じようなものです。どんな言語でも、実行されたときにどこが最初に呼ばれるかはルールが必要です。いう関数が呼ばれる、というルールになっています。すべての関数はクラスに属することになっています。メソッドにしたわけです。