回答編集履歴

4

追加

2022/11/12 20:04

投稿

jimbe
jimbe

スコア12646

test CHANGED
@@ -66,3 +66,7 @@
66
66
 
67
67
  2つ必要では無いことは動作したコードが書けたことでお分かりになったと思いますが、クラスに親子関係があるのは、まさにこのように『親の代わりとして子を使える』為です。
68
68
  車用の車庫には車なら何処のメーカーのでも入れる、みたいな感じです。(現実では大きさで入れなかったりしますがクラスはどんなに大きくても大丈夫です。逆に車が入るならバイクも入りそうですが、クラスでは入れられません。)
69
+
70
+ >「sa[0] = new SubB();」を見て私が思うのは、SuperA型の配列のsa[0]の中はSubB()で使うからSubB()で初期化する、ってことかな?
71
+
72
+ 私が見て思うのは、sa[0] が null から SubB に変わった、です。

3

追加

2022/11/12 19:46

投稿

jimbe
jimbe

スコア12646

test CHANGED
@@ -61,4 +61,8 @@
61
61
  SubBの 太郎くん です
62
62
  SubCの 花子さん です
63
63
  ```
64
+ ---
65
+ >親クラスから子クラスへのアクセスはできないので、継承したサブクラスを使うなら、配列の宣言はどうしても2つになるのでは?
64
66
 
67
+ 2つ必要では無いことは動作したコードが書けたことでお分かりになったと思いますが、クラスに親子関係があるのは、まさにこのように『親の代わりとして子を使える』為です。
68
+ 車用の車庫には車なら何処のメーカーのでも入れる、みたいな感じです。(現実では大きさで入れなかったりしますがクラスはどんなに大きくても大丈夫です。逆に車が入るならバイクも入りそうですが、クラスでは入れられません。)

2

修正

2022/11/12 10:52

投稿

jimbe
jimbe

スコア12646

test CHANGED
@@ -5,7 +5,7 @@
5
5
  ---
6
6
 
7
7
  まず、 SubB と SubC が全く SuperA の機能を使っていません。意味があるのは getName のオーバーライドだけです。
8
- getName は SuperA フィールド name を使用し、SuperA には setName も存在しますので、それらを流用すれば SubB/C は以下のように簡単に出来ます。
8
+ SuperA フィールド name もセッター setName も public として存在しますので、それらを流用すれば SubB/C は以下のように簡単に出来ます。
9
9
  ```java
10
10
  class SuperA {
11
11
  public String name;

1

変更

2022/11/12 10:50

投稿

jimbe
jimbe

スコア12646

test CHANGED
@@ -1,3 +1,64 @@
1
- > 子クラスから親クラスへのアクセスはできない
1
+ ~~> 子クラスから親クラスへのアクセスはできない~~
2
2
 
3
- 出来ます。
3
+ ~~出来ます。~~
4
+
5
+ ---
6
+
7
+ まず、 SubB と SubC が全く SuperA の機能を使っていません。意味があるのは getName のオーバーライドだけです。
8
+ getName は SuperA のフィールド name を使用し、SuperA には setName も存在しますので、それらを流用すれば SubB/C は以下のように簡単に出来ます。
9
+ ```java
10
+ class SuperA {
11
+ public String name;
12
+ public void setName(String nm) {
13
+ this.name = nm;
14
+ }
15
+ public void getName() {
16
+ System.out.println("SuperAの " + this.name + " です");
17
+ }
18
+ }
19
+
20
+ class SubB extends SuperA {
21
+ public SubB() {
22
+ System.out.println("SubB を作成しました。");
23
+ }
24
+ @Override //オーバーライドしていることを明示
25
+ public void getName() {
26
+ System.out.println("SubBの " + name + " です");
27
+ }
28
+ }
29
+
30
+ class SubC extends SuperA {
31
+ public SubC() {
32
+ System.out.println("SubC を作成しました。");
33
+ }
34
+ @Override //オーバーライドしていることを明示
35
+ public void getName() {
36
+ System.out.println("SubCの " + name + " です");
37
+ }
38
+ }
39
+
40
+ public class Main {
41
+ public static void main(String[] args) {
42
+ SuperA[] sa = new SuperA[2]; // = の左の SuperA は配列の型、右の SuperA は配列の実体の型. 普通は同じ.
43
+ sa[0] = new SubB();
44
+ sa[1] = new SubC();
45
+
46
+ String x = "太郎くん";
47
+ String y = "花子さん";
48
+
49
+ sa[0].setName(x); //SubB にある SuperA のメソッド
50
+ sa[1].setName(y); //SubC にある SuperA のメソッド
51
+
52
+ sa[0].getName(); //SubB にある、"superA のメソッドをオーバーライドした"メソッド
53
+ sa[1].getName(); //SubC にある、"superA のメソッドをオーバーライドした"メソッド
54
+ }
55
+ }
56
+ ```
57
+ 実行結果
58
+ ```plain
59
+ SubB を作成しました。
60
+ SubC を作成しました。
61
+ SubBの 太郎くん です
62
+ SubCの 花子さん です
63
+ ```
64
+