質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.35%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

解決済

2回答

2107閲覧

クラスとメンバーがメモリ上でどうなっているか

rakkn

総合スコア6

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2020/05/27 06:34

前提・実現したいこと

クラスとメンバーがメモリ上でどうなっているかを理解する

該当のソースコード

java

1class AA{ 2 private int i; 3 4 public void AA(){ 5 i = 1; 6 } 7 8 public void hello(){ 9 System.out.println("Hello"); 10 } 11} 12 13class Test{ 14 public static void main(String[] args){ 15 AA aa = new AA(); 16 17 aa.hello(); 18 } 19}

質問

1.AAクラスをインスタンス化する時、つまりメモリ上にインスタンス'aa'を生成する時に、メモリ上のインスタンス'aa'は変数とメソッドとコンストラクタ分のデータを含むのでしょうか?変数だけでしょうか?
2.上記の変数だけの場合は、メソッドやコンストラクタはクラスのメモリ上に存在するのでしょうか?それとも発想自体が間違っているのでしょうか?

わかりにくい質問かもしれませんがお答えいただけると幸いです。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

maisumakun

2020/05/27 06:36

どのような理由があって、それを気にする必要があるのでしょうか? (何か実際の問題と結びついて気にする必要があるなら、その問題についても明記してください)
rakkn

2020/05/27 09:23

昨日、"アップキャストによる参照型変数の変化がわからない" で質問したときに、メソッドがどのように呼び出されるのかが気になって質問させていただきました。また、"hoshi-takanori"さんのアンサーからさらなる疑問が出てきたので勝手ながら追加で質問させていただきます。もしよろしければご回答をよろしくお願いします。 ----質問---- 1. "hoshi-takanori"さんが仰っているようにインスタンス自体に、変数情報に加えて"どのクラスに属するか”という情報も入っているのでしょうか?  2.インスタンスにはメソッドの情報が入っていないならば、"a.getID()" という文は 参照型変数"a"の型を見てそのクラスのメソッド"getID()"を実行する(つまり、コンピュータがメソッドを参照するとき、参照型変数の指し示す先のインスタンスを参考にメソッドを探すのでなく、参照型変数そのものの型を参考にするということ)と思ったのですが、この認識は正しいでしょうか?
guest

回答2

0

あまり、がっつり読んでないので完全に見当違いかもしれませんが、
こちら(Java仮想マシンの実装技術)が参考になるかと。

11P見ると、クラスの定義と、メソッド内のバイトコードは別管理っぽいですね。

投稿2020/05/27 09:05

momon-ga

総合スコア4826

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

momon-ga

2020/05/27 09:05

VMの仕様書見ると、それらしいことが書いてあるかもしれませんし 実装依存かもしれません。
rakkn

2020/05/27 15:42

リンク先の資料に知りたかったことがたくさん載っていて非常に助かりました!ありがとうございます!
guest

0

ベストアンサー

いい質問だと思います。私は Java VM の内部にはあまり詳しくないのでざっくりした回答になりますが、

  1. 各インスタンスは、インスタンスフィールドの値と、どのクラスに所属するかの情報を持ちます。

  2. 各クラスは、メソッドやコンストラクタの情報、および static フィールドの値を持ちます。

例えば AA クラスのインスタンスを 100 個作った場合、フィールド i の情報はメモリ上に 100 個分作られますが、メソッドなどの情報はメモリ上に 1 個だけ存在し、100 個のインスタンスから共有されることになります。

投稿2020/05/27 08:04

hoshi-takanori

総合スコア7901

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

rakkn

2020/05/27 15:43

非常に噛み砕いた解説でわかりやすかったです!ありがとうございます!
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.35%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問