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

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

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

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

Q&A

解決済

2回答

860閲覧

多態性と配列を組合わせてインスタンスを生成する方法について

etrisotoko777

総合スコア25

Java

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

1グッド

2クリップ

投稿2020/02/13 08:41

編集2020/02/13 09:00

多態性と配列を組合わせてインスタンスを生成する方法について

『スッキリ分かるjava入門(第3版)』で勉強中です。

多態性と配列を組合わせて、拡張for文でインスタンスのメソッドを使用するコードですが、

3行目はただの配列宣言であり、インスタンス生成と関係はなく、

配列宣言で生まれた各要素cは既にCharacter型を持っているため、
[クラス型名 変数名]と置かなくてもインスタンスを生成することができているのでしょうか?

また、次の拡張for文では、Character型変数chに生成した要素を放り込んでいるのですが、ここでは変数c要素をchに代入していると考えてよいのでしょうか?

この考え方が間違っていないか気になったので質問させていただきました。
よろしくお願い致します。

該当のソースコード

java

1public class Main { 2public static void main(String[] args) { 3Character[] c = new Character[2]; 4c[0] = new Hero(); 5c[1] = new Thief(); 6//宿屋に泊まる 7for(Character ch : c) { 8ch.hp += 50; 9}
azuapricot👍を押しています

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

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

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

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

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

Zuishin

2020/02/13 08:43

間違っています。正しくはその本を読み直してください。
etrisotoko777

2020/02/13 09:01

変数名が抜けてましたね、ご指摘ありがとうございました。
Zuishin

2020/02/13 09:04

考え方も間違っているので、最初から読んで体系的に学んだ方がいいと思います。入門書なので、必ず説明があるはずです。
etrisotoko777

2020/02/13 09:08

分かりました。再度読みなおしてみます。ありがとうございます。
guest

回答2

0

ベストアンサー

[クラス型名 変数名]が良く分からないのですが
インスタンスの生成はこのプログラム上ではnewの部分で行われています

投稿2020/02/13 15:42

Sepi

総合スコア36

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

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

etrisotoko777

2020/02/14 09:01 編集

ありがとうございます。 >[クラス型名 変数名]が良く分からないのですが インスタンスの生成には、 クラス名 変数名 = new クラス名(); と記述する必要があると本に載っていたので、クラス名が無く、変数名 = new クラス名(); と記述している点に違和感を覚えました Character[] c = new Character[2]; c[0] = new Hero(); c[1] = new Thief(); 上記のnew時に、いずれもインスタンスを生成しているのでしょうか?
Sepi

2020/02/14 09:54 編集

例えば Character c; この様にした時点で変数cはCharacter型の容器を作った事と同義となります Character c = new Character(); この分は容器の作成とインスタンスの生成,そして代入をひとまとめにしているわけです そのため記述上は Character c; c = new Character(); としても意図している動作に違いはありません 今回の場合,Character型の配列cをはじめに用意しています 当たり前ですがCharacter型の配列の要素にはCharacter型の容器が用意されているわけです そのためクラス名を記述することはないと言えるでしょう
etrisotoko777

2020/02/16 01:49

返信が遅れまして大変申し訳ございません。 通知が届いていたことに気づきませんでした。 ご丁寧に解説いただきありがとうございます。 とても分かりやすく、参考になりました。 拡張for文で、配列変数cの要素が再度chに代入されているのですが、 ここでは、新たに変数chでメモリを確保して、各要素で生成したインスタンスの先頭番地をchに代入しているのでしょうか?(c[]とchで同じ先頭番地を参照している状態) ご丁寧に解説していただいたにも関わらず、返信遅れまして大変申し訳ございませんでした。 何卒よろしくお願いいたします。
Sepi

2020/02/16 02:06

その認識で問題ないと思います
etrisotoko777

2020/02/16 09:01

ありがとうございます。勉強になりました。
guest

0

この考え方が間違っていないか気になったので質問させていただきました。

考え方以前にコードが間違っています。おそらくCharacter[] c = new Character[2];cが抜けています。

投稿2020/02/13 08:56

maisumakun

総合スコア145208

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

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

etrisotoko777

2020/02/13 08:59

ほんとですね、見落としていました。ありがとうございます
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.46%

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

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

質問する

関連した質問