回答編集履歴

3

修正

2023/12/05 08:38

投稿

jimbe
jimbe

スコア12712

test CHANGED
@@ -15,7 +15,7 @@
15
15
 
16
16
  >④String型はクラスであり、こちらだけ特別に宣言の際に自動でヒープ領域にインスタンス(文字列リテラル)が生成され、宣言したString変数に参照値が格納される。
17
17
 
18
- String 型の変数も他の(配列を含む)オブジェクト変数と同様に "宣言" 時はまだ実体が入っていません。
18
+ String 型の変数も他の(配列を含む)オブジェクト変数と同様に "宣言" 時はまだ参照が入っていません。
19
19
  変数どうこうでは無く、"文字列リテラル" 自体が特別に String として扱われるものです。
20
20
 
21
21
  >⑤String型の中身はchar型の文字要素で構成された配列オブジェクトであり、一つ一つの文字の実体はそれぞれヒープ領域に配置されている。

2

修正

2023/12/05 08:36

投稿

jimbe
jimbe

スコア12712

test CHANGED
@@ -1,4 +1,26 @@
1
1
  char 配列と String は別モノです。
2
2
  String の要素である char はプリミティブ型ですので参照ではありません。
3
3
 
4
+ >①配列を宣言した際、宣言した配列の変数には配列そのものではなくその配列の実体を示す参照値が格納され、その参照値はスタック領域に配置される。
5
+
6
+ 配列の変数の ”宣言” 時は、まだ配列の実体はありませんので「配列の実体を示す参照値が格納され」てはいません。
7
+
8
+ >②newでインスタンス生成した際に配列そのものがオブジェクトとしてヒープ領域に配置される。
9
+
10
+ "配列はオブジェクト"です。
11
+
12
+ >③配列の要素の実体もヒープ領域にあり、配列の変数[番号] に定義(格納)された参照値を用いることで実体にアクセスすることができる。
13
+
14
+ 配列の要素が"参照かどうか"は配列の型によって違います。 String 等のオブジェクトなら参照ですが、 char 等のプリミティブは実体です。
15
+
16
+ >④String型はクラスであり、こちらだけ特別に宣言の際に自動でヒープ領域にインスタンス(文字列リテラル)が生成され、宣言したString変数に参照値が格納される。
17
+
18
+ String 型の変数も他の(配列を含む)オブジェクト変数と同様に "宣言" 時はまだ実体が入っていません。
4
- java では **基本的** "ポインタはありません"ので、メモリ上の配置アドレスを考える必要はありません
19
+ 変数どうこうでは無く、"文字列リテラル" 自体が特別String として扱われるもので
20
+
21
+ >⑤String型の中身はchar型の文字要素で構成された配列オブジェクトであり、一つ一つの文字の実体はそれぞれヒープ領域に配置されている。
22
+
23
+ String が *配列的* に扱うメソッドを持っていたとしても、内部が char 配列で実装されていると決定することはできません。
24
+ java はオブジェクト指向であり、オブジェクトはカプセル化によって詳細を外部が意識しなくて済むようにしています。(かならずしも成功はしていませんが。)
25
+
26
+ オブジェクトや変数がスタックに出来るのかヒープに出来るのかはプログラム的にはスコープの問題だと思いますので、 java でのスコープさえ理解していれば、スタックかヒープかという問いは不要でしょう。

1

追加

2023/12/05 08:14

投稿

jimbe
jimbe

スコア12712

test CHANGED
@@ -1,3 +1,4 @@
1
+ char 配列と String は別モノです。
1
2
  String の要素である char はプリミティブ型ですので参照ではありません。
2
3
 
3
4
  java では **基本的に** "ポインタはありません"ので、メモリ上の配置アドレスを考える必要はありません。