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

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

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

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

Q&A

解決済

1回答

6156閲覧

クラスオブジェクト(側)のメモリ領域の情報には「静的フィールド・静的メソッド」も入る?

mr0237

総合スコア164

Java

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

オブジェクト

オブジェクト指向において、データとメソッドの集合をオブジェクト(Object)と呼びます。

オブジェクト指向

オブジェクト指向プログラミング(Object-oriented programming;OOP)は「オブジェクト」を使用するプログラミングの概念です。オブジェクト指向プログラムは、カプセル化(情報隠蔽)とポリモーフィズム(多態性)で構成されています。

0グッド

2クリップ

投稿2017/05/03 03:52

JAVAを勉強している者です。説明が下手で、さらにすっきりしない質問ですいませんが、この質問のコメント欄に

おおまかにいえばnew側で確保されたメモリ領域には以下が入ってます。

(A)そのインスタンスのクラスオブジェクト(クラス型)への参照(メモリ領域のアドレス情報)
(B)そのインスタンスの属性

なお、(A)はこのインスタンスに対してgetClass()メソッドを呼び出すと取り出せるクラスオブジェクト(クラス型)の参照**(メモリ領域のアドレス情報)**が入ってます。そのクラスオブジェクト(クラス型)の中にメソッドの情報が入っているという具合です。

と書かれていたのですが「スッキリわかるJava入門 第2版 (スッキリシリーズ) 」の(P367)「静的メソッド」のところを復習を兼ねて読み直してみると、

メソッド自体がクラスに属するようになる。

静的メソッドは、その実体が各インスタンスではなくクラスに属し、「クラス名.メソッド名();」で呼び出せるようになります。

と書かれていたのですが、これってつまり、

クラスオブジェクト側(例:Hero型の変数h)で確保されたメモリ領域って以下の情報が入っているのでしょうか?

・newで属性を入れるための領域が確保された先頭アドレスの情報
・操作の情報
・静的フィールド・静的メソッドの情報

↑これらの情報が入っているのでしょうか?

(↑ちょっと自分でも混乱してしまう可能があるので自分なりのわかりやすい言葉(例:「クラスオブジェクト」→「クラス型」)で書いてしまいました。すいません。)

よろしくお願いします。

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

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

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

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

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

guest

回答1

0

ベストアンサー

javaの技術書のほとんどには、javaのソースは中間マシン(JVM)で動作し、JVMが実行環境毎の差分の吸収とメモリ管理を引き受けることが書いてあると思います。

メモリ管理を自動で行う点は、javaを作る際に参考にしているC++との大きな差で利点であると同時に、その動きはプログラマにが意識しずらいという問題を抱えています。

そして、javaのメモリに関する話は中間コードやJVMのレベルの解説書以外で書かれれている場合は基本的にはたとえ話です。

実際の動きを確かめるコードを書きました。実行してみてください。

java

1public class ClassA{ 2 public static int a = ClassA.makeA(); 3 public static int b = ClassA.makeB(); 4 public static int makeA(){ 5 System.out.println("makeA"); 6 return 1; 7 } 8 9 public static int makeB(){ 10 System.out.println("makeB"); 11 return 1; 12 } 13 14 // クラス変数は不要のメソッド 15 public static int getC(){ 16 System.out.println("makeC"); 17 return 1; 18 } 19 20 // 空のコンストラクタ 21 public ClassA(){} 22 public int d = makeD(); 23 public int e = makeE(); 24 25 public int makeD(){ 26 System.out.println("makeD"); 27 return 1; 28 } 29 30 public int makeE(){ 31 System.out.println("makeE"); 32 return 1; 33 } 34 }

クラス変数a,b及びインスタンス変数d,eのメモリが確保されたタイミングでログを書き出すようにクラスの定義をしています。

そして、クラスメソッドgetCは、クラス変数もインスタンス変数も不要です。

この状態でgetCを呼び出してみました。

java

1public class Main { 2 public static void main(String[] args) throws Exception { 3 System.out.println("test"); 4 System.out.println("ClassA.getC:" + ClassA.getC()); 5 } 6} 7

私がテストした環境では、出力はこのようになりました。

test makeA makeB makeC ClassA.getC:1

クラス変数の領域を確保してから、クラスメソッドを実行しています。
ポイントとしては、クラス変数a,b両方とも確保している点です。絶対とは言い切れませんが、一度にすべての変数の領域を確保していることがわかると思います。

また、"test"が先に表示されていますので、ClassAのクラスメソッドが初めて実行されるタイミングで領域の確保が行われるという点がわかります。

次に、インスタンスを作ったときのテストをします。

java

1public class Main { 2 public static void main(String[] args) throws Exception { 3 System.out.println("test"); 4 ClassA a = new ClassA(); 5 } 6}

私の環境ではこのようになりました。

test makeA makeB makeD makeE

インスタンスを作ったタイミングで、クラス変数の領域も(必要ないのに)確保されました。

このように、実際にテストするとなんとなくイメージがつかめるのではないでしょうか?いろいろためしてみてください。

ところで、バージョンによって全然違う動きをする可能性もあり、ここらへんは現段階ではあまり突っ込まなくても問題がないとは思いませんか?(本の方でお茶を濁しているのも一理あるとおもいます。)

ソースはこちらです。
https://paiza.io/projects/8W5ex0OgDSri8c4mte4JQA

投稿2017/05/03 13:37

iwamoto_takaaki

総合スコア2883

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

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

mr0237

2017/05/04 03:22

じゃあつまり、(何度も繰り返してすいません。)クラスオブジェクト側(例:Hero型の変数h)で確保されたメモリ領域ってやはり、以下の情報が入っているのでしょうか? ・newで属性を入れるための領域が確保された先頭アドレスの情報 ・操作の情報 ・静的フィールド・静的メソッドの情報 ↑これらの情報が入っているのでしょうか?
iwamoto_takaaki

2017/05/04 12:36

そこら辺は正確な話は出来ません。 JVMのマニュアルを読むべき内容です。 (そして、まだあなたはJVMのマニュアルを読む段階に無いと思います。) ただ、クラス変数は、インスタンスが存在しない場合ははじめて呼び出された段階でメモリに領域の確保がされるらしい。インスタンス変数、クラス変数ともに変数はまとめて確保されることが上記のテストによって確認ました。 ここから、メモリの連続領域に取られてているっぽいという点を理解しておく程度に留めて置くべきだと思います。 どうしても、その点を理解したければメモリ管理が自動化されていない言語(アセンブラやC++が代表的?)でどのようにメモリを管理すると効率的なプログラムが組めるかを理解する必要があります。 というわけで、せっかくjavaが隠してハードルを下げている部分には踏み込まず、まずjavaの基本的な文法を覚える事を先行させたほうが良いと思います。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.50%

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

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

質問する

関連した質問