回答編集履歴

2

誤記訂正

2016/03/14 12:38

投稿

Aeona
Aeona

スコア396

test CHANGED
@@ -120,7 +120,7 @@
120
120
 
121
121
 
122
122
 
123
- 継承先(=継承側?)、継承元にかかわらず、staticクラスじゃない場合、インスタンス化が必要です。
123
+ 継承先(=継承側?)、継承元にかかわらず、staticメソッドじゃない場合、インスタンス化が必要です。
124
124
 
125
125
  (ClassSampleを継承している)ClassSample2を利用する側でインスタンス化する必要があります。
126
126
 

1

回答追記

2016/03/14 12:38

投稿

Aeona
Aeona

スコア396

test CHANGED
@@ -1,3 +1,177 @@
1
+ コメントをいただきましたので回答を追記します。
2
+
3
+
4
+
5
+ > と書けばOKでしょうか?
6
+
7
+
8
+
9
+ まず、javaのコンソールプログラムは起動クラスの```main()```メソッドから実行されることになっています。
10
+
11
+ パッケージが設定されているのでコマンドプロンプトでは下のように実行します。
12
+
13
+ ```
14
+
15
+ ...\sample\bin>java sample.ClassSample
16
+
17
+ ```
18
+
19
+ するとクラスファイルのmainメソッドから実行されるので
20
+
21
+ 下記のソースでは```ClassSample2```のインスタンス化がまず実行されます。
22
+
23
+ 続いて元々の```System.out.println```数行が実行されます。
24
+
25
+ さらにパターン1が実行された後、パターン2、パターン3、パターン4が実行されます。
26
+
27
+
28
+
29
+ ```
30
+
31
+ package sample;
32
+
33
+
34
+
35
+ public class ClassSample {
36
+
37
+
38
+
39
+ @SuppressWarnings("static-access")
40
+
41
+ public static void main (String[] args) {
42
+
43
+
44
+
45
+ ClassSample2 ddd = new ClassSample2();
46
+
47
+ /* 元の出力処理 */
48
+
49
+ System.out.println("元の処理");
50
+
51
+ System.out.println(ddd.tashizan(190,30));
52
+
53
+ System.out.println(ddd.hikizan(380, 89));
54
+
55
+ System.out.println(ddd.warizan(900, 40));
56
+
57
+ System.out.println(ddd.amari(15, 5));
58
+
59
+ System.out.println("");
60
+
61
+
62
+
63
+ /* パターン1 */
64
+
65
+ System.out.println("パターン1");
66
+
67
+ ddd.main(new String[]{});
68
+
69
+ System.out.println("");
70
+
71
+
72
+
73
+ /* パターン2 */
74
+
75
+ System.out.println("パターン2");
76
+
77
+ System.out.println(ddd.tashizan(1000,30));
78
+
79
+ System.out.println(ddd.hikizan(100, 20));
80
+
81
+ System.out.println(ddd.warizan(10000, 40));
82
+
83
+ System.out.println(ddd.amari(300, 5));
84
+
85
+ System.out.println("");
86
+
87
+
88
+
89
+ /* パターン3 */
90
+
91
+ System.out.println("パターン3");
92
+
93
+ (new ClassSample2()).main(new String[]{});
94
+
95
+ System.out.println("");
96
+
97
+
98
+
99
+ /* パターン4 */
100
+
101
+ System.out.println("パターン4");
102
+
103
+ ClassSample2.main(new String[]{});
104
+
105
+ System.out.println("");
106
+
107
+ }
108
+
109
+
110
+
111
+ /* 中略 */
112
+
113
+ }
114
+
115
+ ```
116
+
117
+
118
+
119
+ > クラスを継承していても、継承側(ClassSample2)で、ClassSample2をインスタンス化しなければならない。
120
+
121
+
122
+
123
+ 継承先(=継承側?)、継承元にかかわらず、staticクラスじゃない場合、インスタンス化が必要です。
124
+
125
+ (ClassSampleを継承している)ClassSample2を利用する側でインスタンス化する必要があります。
126
+
127
+ 上の例ではパターン1、3がインスタンス化したClassSample2の持つ```main()```メソッドを実行しています。
128
+
129
+
130
+
131
+ > で、ClassSample2はClassSampleを継承しているので、その中のメソッドが自由に使える、という理解でいいでしょうか?
132
+
133
+
134
+
135
+ 基本的にはそういう理解でよいのではないでしょうか?
136
+
137
+ なぜ「基本的には」かというと、修飾子によって動きが大きく変わるからです。
138
+
139
+ クラスに```static```をつけることでインスタンス化が「不必要(不可)」が変わったり、
140
+
141
+ メソッドに```private```をつけることでそのメソッドが外から利用することが出来なくなったりします。
142
+
143
+
144
+
145
+ 上記の例ではパターン2が```ClassSample```を継承した```ClassSample2```がインスタンス化され、
146
+
147
+ 継承した```tashizan()```など4つのメソッドを持っているので利用できることになります。
148
+
149
+
150
+
151
+ ちなみに```ClassSample2```の中で```main()```が```static```になっているので、
152
+
153
+ パターン4のような実行もできますし、
154
+
155
+ ```
156
+
157
+ public static void main(String[] args)
158
+
159
+ ```
160
+
161
+ で定義されているので、コマンドプロンプトから
162
+
163
+ ```
164
+
165
+ ...\sample\bin>java sample.ClassSample2
166
+
167
+ ```
168
+
169
+ の実行もできます。
170
+
171
+
172
+
173
+ ---
174
+
1
175
  現状、どちらのクラスもコンストラクタが無いようです。
2
176
 
3
177
  javaのコンソールプログラムの場合、起動クラスの```main()```メソッドが最初実行されるメソッドです。