オブジェクト指向の動的ディスパッチについてなのですが
1.データに自分自身が何者か教える機のう
2.メソッドを呼び出した際にそれを探索する機能
3.オブジェクト自身を参照できるように引数に束縛する機能
についてですが具体的にどの用な処理をしているのでしょうか。特に1番について知りたいです。

回答2件
あなたの回答
tips
プレビュー
Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。
オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。
Q&A
解決済
2回答
1315閲覧
退会済みユーザー
総合スコア0
Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。
オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。
0グッド
0クリップ
投稿2018/01/23 09:55
オブジェクト指向の動的ディスパッチについてなのですが
1.データに自分自身が何者か教える機のう
2.メソッドを呼び出した際にそれを探索する機能
3.オブジェクト自身を参照できるように引数に束縛する機能
についてですが具体的にどの用な処理をしているのでしょうか。特に1番について知りたいです。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答2件
0
ベストアンサー
追記:
ちなみにこの回答は「Javaでは概ねこんなかんじ」という一つの実装例を述べたに過ぎません。オブジェクト指向といっても言語によりその仕様や実装は様々です。全てがこうなっていると勘違いしないようにご注意ください。
内部的な仕組みをごく単純化したコメントを試みます。
データと言っておられますがそれは「インスタンス」と言い換えてもよいと思います。JVMの内部ではインスタンスはヒープ上のある領域に格納されてますが、必ずヘッダーと呼ばれる制御情報がくっついています。(JVMの内部的な仕組みです)
そのヘッダーに「このインスタンスはどのクラスのものなのか」が記録されています。正確には知りませんがおそらくClassオブジェクトの参照が格納されているんだろうと思います。
JVM内でメソッド呼び出しはinvokevirtualというようなbyte code命令として実現されてます。これも正確な手順をいえる程詳しくないですが...
実行する段になってみないとわからないことがあります。それはメソッドを呼び出そうとしている対象のインスタンスが実際にどのクラスのものなのかです。
A a;
というような宣言ではaが示すオブジェクトのクラスはAかも知れませんし、Aの派生クラスかも知れません。それは実行時にならないとわからないわけです。
そんなわけで、a.method()
というようなメソッド呼び出しを行う際、JVMは
(A) aが示すインスタンスのクラスを調べる
(B) そのクラスの中からmethod
という名前の引数なしのメソッドを探す
(C) もし定義がみつからなかったらそのクラスの基底クラスにさかのぼって探す
これを見つかるまで繰り返します。最終的にはObjectクラスのメソッドを探すことになります。そこまで探せば必ず見つかります。(見つからないようなケースは絶対にないようにjavaコンパイラーがコンパイル時に整合性をチェックしてくれます)
これも大雑把ですが最初に述べたようにオブジェクトはヒープ上のある領域に格納されてます。引数とかローカル変数はJVMのスタック領域にありますが、束縛(代入)は単にヒープ上にあるインスタンスのアドレス(またはアドレス的な何か)の値をスタック上の引数やローカル変数の格納場所へ書き込んでいるだけです。
投稿2018/01/23 10:19
編集2018/01/23 10:25総合スコア18404
0
丁寧にありがとうございます。
投稿2018/01/23 10:51
退会済みユーザー
総合スコア0
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。