回答編集履歴
4
追加
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
追加
test
CHANGED
@@ -61,4 +61,8 @@
|
|
61
61
|
SubBの 太郎くん です
|
62
62
|
SubCの 花子さん です
|
63
63
|
```
|
64
|
+
---
|
65
|
+
>親クラスから子クラスへのアクセスはできないので、継承したサブクラスを使うなら、配列の宣言はどうしても2つになるのでは?
|
64
66
|
|
67
|
+
2つ必要では無いことは動作したコードが書けたことでお分かりになったと思いますが、クラスに親子関係があるのは、まさにこのように『親の代わりとして子を使える』為です。
|
68
|
+
車用の車庫には車なら何処のメーカーのでも入れる、みたいな感じです。(現実では大きさで入れなかったりしますがクラスはどんなに大きくても大丈夫です。逆に車が入るならバイクも入りそうですが、クラスでは入れられません。)
|
2
修正
test
CHANGED
@@ -5,7 +5,7 @@
|
|
5
5
|
---
|
6
6
|
|
7
7
|
まず、 SubB と SubC が全く SuperA の機能を使っていません。意味があるのは getName のオーバーライドだけです。
|
8
|
-
|
8
|
+
SuperA にフィールド name もセッター setName も public として存在しますので、それらを流用すれば SubB/C は以下のように簡単に出来ます。
|
9
9
|
```java
|
10
10
|
class SuperA {
|
11
11
|
public String name;
|
1
変更
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
|
+
|