前提
学校の課題でJavaを学習中です。授業中に理解できなかった部分を休日に勉強したのですが、やり方があっているかどうかを知りたく、書き込みさせていただきます。
問
1つのスーパークラス(A)から、継承したサブクラスBとCがあります。BとCのサブクラスにセットしたNameデータをゲットして、printlnで表示する処理を配列をつかってやる、というお題です。
私はサブクラスBとサブクラスC、それぞれで使う配列を別々に宣言して用意したのですが、先生から1つの配列でやるように指示がありました。
しかし私の理解では、親クラスから子クラスへのアクセスはできないので、継承したサブクラスを使うなら、配列の宣言はどうしても2つになるのでは? と思いました。
### 最初につくったコード
class SuperA { public String name; public void setName(String nm) { this.name = nm; } public void getName() { System.out.println("SuperAの " + this.name + " です"); } } class SubB extends SuperA { public String name; public SubB() { this.name = "SubB this.name"; System.out.println(this.name + " を作成しました。"); } public void setName(String nm) { this.name = nm; } public void getName() { System.out.println("SubBの " + this.name + " です"); } } class SubC extends SuperA { public String name; public SubC() { this.name = "SubC this.name"; System.out.println(this.name + " を作成しました。"); } public void setName(String nm) { this.name = nm; } public void getName() { System.out.println("SubCの " + this.name + " です"); } } public class test1 { public static void main(String[] args) { SubB[] sb = new SubB[1]; SubC[] sc = new SubC[1]; String x = "太郎くん"; String y = "花子さん"; for (int i = 0; i < sb.length; i++) { sb[i] = new SubB(); sc[i] = new SubC(); } for (int i = 0; i < sb.length; i++) { sb[i].setName(x); sc[i].setName(y); } for (int i = 0; i < sb.length; i++) { sb[i].getName(); sc[i].getName(); } } }
実現したいこと
1つの配列でやるように書き換えてみました。
これであっているでしょうか?
※class SuperA、class SubB extends SuperA、class SubC extends SuperAの内容は同じで、mainの記述内容のみ違います。
class SuperA { public String name; public void setName(String nm) { this.name = nm; } public void getName() { System.out.println("SuperAの " + this.name + " です"); } } class SubB extends SuperA { public String name; public SubB() { this.name = "SubB this.name"; System.out.println(this.name + " を作成しました。"); } public void setName(String nm) { this.name = nm; } public void getName() { System.out.println("SubBの " + this.name + " です"); } } class SubC extends SuperA { public String name; public SubC() { this.name = "SubB this.name"; System.out.println(this.name + " を作成しました。"); } public void setName(String nm) { this.name = nm; } public void getName() { System.out.println("SubCの " + this.name + " です"); } } public class test04 { public static void main(String[] args) { SuperA[] sa = new SuperA[2]; sa[0] = new SubB(); sa[1] = new SubC(); String x = "太郎くん"; String y = "花子さん"; sa[0].setName(x); sa[1].setName(y); sa[0].getName(); sa[1].getName(); } }
知りたいこと(2つ)
1:コードが合っているかどうか
実行してみると「変数sa」の配列だけでクラスBとクラスC内の処理ができているので、処理的にはできていると考えていますが、いまいち理解が追いついていません。これであってるでしょうか?
2:宣言部分の考え方
SuperA[] sa = new SuperA[2];
sa[0] = new SubB();
sa[1] = new SubC();
この↑の部分の処理がよくわかりません。
・SuperA型の配列を作ります。名前は「sa」です(わかる)
・「= new SuperA[2]」の記述により要素数が2になるのはわかるんですが、また「SuperA」とわざわざ記述されていることの処理の意味がわかりません。
・「sa[0] = new SubB();」を見て私が思うのは、SuperA型の配列のsa[0]の中はSubB()で使うからSubB()で初期化する、ってことかな? です。
この宣言の部分はネットや教科書でも調べたのですが、記述の仕方が中心に解説されており、なんでそう書くのか、どんな処理をしているのか、という部分に関しては、私でもわかる記述に行き当たることができませんでした。どなたか噛み砕きまくった解説を所望します。
回答2件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2022/11/12 09:51
2022/11/12 10:26
2022/11/13 02:25