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

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

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

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

Q&A

解決済

5回答

6339閲覧

Newによる配列の生成とインスタンス化の関係性について

退会済みユーザー

退会済みユーザー

総合スコア0

Java

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

0グッド

0クリップ

投稿2018/03/08 05:08

編集2018/03/09 00:58

現在、javaの入門書の書籍で勉強しているのですが、再読して配列を読んだ時に、New演算子の意味が少しわからなくなりました。

インスタンス化=newするという単語もありややこしいのですが、

<1>newするとメモリに領域が確保される
・クラスのインスタンス化 ※例1
・配列の生成 ※例2
など

<2>newをすれば確実にクラスのインスタンス化が行われる訳ではない
・配列の生成ではクラスのインスタンス化は行われていない※例2

という認識で合っていますでしょうか?
初歩的なところで恐縮ですが、ご教授いただければ幸いです。

java

1Date d= new Date();//※例1 2 3int[] a = new int[5];//※例2

ーーーーー補足説明ーーーーー
※質問の意図が上手く伝わっていないようなので、用語を「実体化」→「インスタンス化」と変更しました。
改めて、今回の質問の要点をまとめると
「newで行う配列の生成は書き方は似ているがクラスのインスタンス化とは無関係である」かどうか?という内容です。
自動で埋まる0やnullなどの初期値や、改めて3や”aaa”など意味ある値を埋める初期化などは理解しているつもりです。

また、その後皆様のお力添えで様々な回答をいただき、「配列もobjectクラスを継承したオブジェクトであり、配列の生成とクラスのインスタンス化は内部的に同じ事をしている」という結論に至り解決しました。
配列がオブジェクトであるとは知らず、また実体化と表現したことで初期化とも取れるような誤解を招くような内容になり申し訳ありませんでした。

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

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

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

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

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

guest

回答5

0

<2>newをすれば確実に実体化が行われる訳ではない

・配列の生成では実体化は行われていない※例2

これに関しては配列それ自体の実体化と配列の要素(中身)の実体化を混同しているのではないでしょうか。

例えば「String[] a = new String[5];」とすると、String型5個分のメモリ(Stringは参照型なので参照5個分)が配列用に確保されます。(なお、要素には初期値のnullが入っています)
すなわち、これだけでは配列の要素であるStringは生成されません。

よって

・配列の生成では実体化は行われていない※例2

に関しては、「配列の生成では 『配列の要素の』 実体化は行われていない」ならば正しいです。(配列それ自身と配列の要素をいっぺんに宣言・生成する書き方もあります。)

なお、「int[] a = new int[5];」の場合intは値型なので要素は0初期化され、0として使うことができます。

投稿2018/03/08 05:41

YamakawaJunichi

総合スコア630

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

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

退会済みユーザー

退会済みユーザー

2018/03/08 06:03

ご回答ありがとうございます! ええと、<2>は newをすれば確実に「クラスのインスタンス化」が行われる訳ではない =「配列」でのnewは「クラスのインスタンス化」を行なっている訳ではない という意味合いです。 なので、YamakawaJuniciさんがおっしゃった配列の内容に関しては理解できていると思います。 再認識にも繋がり勉強になりました。ありがとうございました!
guest

0

java

1class Sample { 2 String s1; 3 String s2; 4 String s3; 5 String s4; 6 String s5; 7}

こういうクラスを考えてみてください。
new Sample()でSampleのインスタンスは生成できますが、Stringメンバ変数5つについてはインスタンス生成などはされず、nullで初期化されます。
これと同じで、new String[5]は要素数5の配列を作るだけで、中身の要素を勝手に作成することはありません。

投稿2018/03/08 14:04

swordone

総合スコア20651

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

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

退会済みユーザー

退会済みユーザー

2018/03/09 01:05

ご回答ありがとうございます。 swordone様のおっしゃる配列の生成と初期化については理解しているつもりです。 質問の書き方が悪く誤解を招くような表現になり申し訳ありませんでした。 その点は補足説明として、本文に追記致しました。 ご教授いただいた内容により配列の内容を再確認することができました。 ありがとうございました!
guest

0

ベストアンサー

配列とクラスで、やっていることはそう変わらないです。どちらも「メモリを確保」して「使える状態にあるものを生成する」という点では同じです。

ただし、Javaでは配列はオブジェクトと別枠の扱いになっている関係上、クラスからnewするときだけインスタンス化(実体化)と呼びます

投稿2018/03/08 05:17

maisumakun

総合スコア145183

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

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

退会済みユーザー

退会済みユーザー

2018/03/08 05:43

ご回答ありがとうございます! なるほど、そのような扱いの違いがあったのですね。勉強になりました! >javaでは配列はオブジェクトと別枠扱いになっている ということは、実際には配列もオブジェクトの一部という事なのでしょうか? ・オブジェクトの一部だけどjavaでは概念上、別物としてしている ・配列も書き方は違うけど、実は裏ではArrayクラスのようなクラスを実体化している? なんだか頭が混乱してきました。
退会済みユーザー

退会済みユーザー

2018/03/08 08:08

何度もコメントしてすみません! 回答を元に改めて調べ直し自己整理したものを回答としてUPしました。 多分、こういう認識で大丈夫だと思うのですが(^_^;) 色々ご教授いただき本当にありがとうございました!
guest

0

皆さんに教えていただいた事を元に自己整理しました。
多分、合っているとは思いますが、間違っていたらすみません(>_<)

<1>はあっている。
<2>について正確には間違い。
配列の生成もobjectクラスを元にインスタンス化されている。

ただし、特別なオブジェクトであり、別枠扱い。
(なので、実体化、インスタンス化という用語は使わない?)

<ポイント&まとめ>
・配列は実はオブジェクトである。
・配列は「objectクラスのインスタンス」である。
・なので.lengthとすると、lengthフィールドの値が取得できるし、.clone()とするとコピーできる。

java

1int[] a=new int[3]; // クラスからのインスタンス化とは書き方が違うが、実はこの部分でobject型のインスタンスを生成している 2a.length //配列の要素数を取得する(lengthフィールドを取得する) 3

参考サイト
http://javazuki.com/articles/array-basic.html
http://www.nurs.or.jp/~sug/soft/java/java24.htm

投稿2018/03/08 07:59

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

YamakawaJunichi

2018/03/08 08:23

「・配列は「objectクラスのインスタンス」である。」はちょっと違います。 「・配列は「objectクラスをスーパークラスとするインスタンス」である。」が正しいです。 実際にやってみると、「int[] array = new Object();」はコンパイルエラーですが、「Object array = new int[100];」は正しく実行できます。
退会済みユーザー

退会済みユーザー

2018/03/08 09:46

ご回答&ご指摘ありがとうございます! つまり配列はobjectクラスを継承しているという事ですね。 これは全てのクラスは暗黙的にobjectクラスを継承しているという事に起因しているのでしょうか? もし、そうだとすると配列というのは何処かに「class int[] extends object{…}」みたいにクラス定義した配列用の.classファイルでもあるんでしょうか? 「int[] array=new Object();」は試してみたら型の不一致でコンパイルエラーになりました! まだまだ、配列型とクラス型の違いが分からずごっちゃになっている感じです(^_^;)
unz.hori

2018/03/08 09:52

その辺はキャストとか...。ただintというのは厳密にはクラスではなくプリミティブなのでその辺もおいおい調べていくといいかと。一気に理解するのはなかなか難しく。やっているうちに頭が整理されて、「はっ!そうかぁ。」と閃くというか繋がる瞬間が訪れるのでそれまであせらず続けていきましょう。
退会済みユーザー

退会済みユーザー

2018/03/08 10:12

重ね重ね丁寧にご返信いただきありがとうございます。 >プリミティブなので〜 そうなんですね! 挙動がクラス型と似ているので配列型もクラスの一種だと勘違いしてました。 そういった事が書いてあるサイトや書籍はご存知ないでしょうか? 調べてもなかなかそういった文献がヒットしなくて(^_^;) つい気になって深追いしてしまいましたが、本筋の勉強に戻りつつ少しずつ理解していきたいと思います(*^^*)アドバイスありがとうございます!
unz.hori

2018/03/08 12:59

配列型のことではなく、intというのがプリミティブです。整数のクラスはちゃんとIntegerというものがあります。すべてを網羅しているものはなかなかないでしょうから、気になった単語をちょいちょい調べてつぶしていくのでいいと思います。
退会済みユーザー

退会済みユーザー

2018/03/09 01:10

単なる「Int」を「int[](配列)」と早とちりしてしまいすみません(>_<) intがプリミティブという事、Integerというクラスがあるという事。両方把握しております。 そうですね、危うく本来の目的を忘れそうになってしまったので、本筋の勉強の傍らに少しずつ調べていきたいと思います(*^^*)
guest

0

<1>と<2>は相反しているように見えますが、どちらが正しいか知りたいということでよろしいでしょうか?

であれば、正しいのは<1>です。
newをすれば確実にインスタンス化が行われます。というよりも、インスタンス化するためにはnewする必要があります。

インスタンス化すると、newしたクラスの型のオブジェクトが生成されます。
配列の場合は、配列のオブジェクトが生成されます。
どちらのオブジェクトも、メモリに領域が確保され、オブジェクトが格納されています。

投稿2018/03/08 05:17

yukapome789

総合スコア361

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

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

退会済みユーザー

退会済みユーザー

2018/03/08 05:27

ご回答ありがとうございます! 書き方がわかりずらくてすみません(^^;) 要は<1>の認識で合っているかという質問です。 ちなみに配列のオブジェクトとは何を指すのでしょうか? 配列にもインスタンスや実体化という概念があるという事でしょうか?
退会済みユーザー

退会済みユーザー

2018/03/08 06:30

その後、色々調べて考えてみました。 ・配列の「オブジェクト」=配列を「格納するためのメモリ領域」 ・配列はクラスではないので、インスタンスや実体化という言葉は使わない。 という解釈に至りましたが、合っていますでしょうか? 用語に対する認識が浅く右往左往してしまい申し訳ありません(>_<)
退会済みユーザー

退会済みユーザー

2018/03/08 08:06

何度もコメントしてすみません! 回答を元に改めて調べ直し解決しました。 本当にありがとうございました!
yukapome789

2018/03/08 14:07

ご丁寧に返答いただきありがとうございます。私も久しぶりに考えさせられたのでよかったです。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問