回答編集履歴
5
頭の方でまとめを列挙。
test
CHANGED
@@ -16,7 +16,21 @@
|
|
16
16
|
|
17
17
|
|
18
18
|
|
19
|
+
色々な疑問が湧いてしまったようですが、それぞれは関連していて、また、Javaと言うプログラミング言語を理解するきっかけとしてもとても良いものだと思います。話が前後するかたちになりますが、説明の前にポイントをまとめておきましょうか。
|
20
|
+
|
21
|
+
|
22
|
+
|
23
|
+
- 全てのクラスは`Object`クラスの派生クラスであり、`toString`メソッドを持っている。
|
24
|
+
|
25
|
+
- Java APIでは、`toString`がそのクラス相応の文字列を返すようオーバーライドによって再実装されているものがある。`String`クラスはその最たる代表と言える。
|
26
|
+
|
27
|
+
- `System.out.println`メソッドの実体は、標準出力の`PrintStream.println`である。 `PrintStream.println`は、`String`クラス並びに根幹である`Object`クラスをも引数と取る各種のオーバーロード版のメソッドがある。
|
28
|
+
|
29
|
+
- `PrintStream.println`メソッドは、その処理の中で引数に対して`valueOf`メソッドや`toString()`メソッドを適時実行し、文字列を出力する
|
30
|
+
|
31
|
+
|
32
|
+
|
19
|
-
まず、`System.out.println`
|
33
|
+
です。では見ていきましょう。まず、疑問の発端となった`System.out.println`メソッドのリファレンスを見てみます。
|
20
34
|
|
21
35
|
[System.out.println](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/System.html#out) から辿って[PrintStream#println](https://docs.oracle.com/javase/jp/8/docs/api/java/io/PrintStream.html#println--)に行き着きます。引数の型ごとにいくつもオーバーロードされた`println`がありますが、`System.out.println(a)`を実行した場合に呼ばれるメソッドは、`a`は`String`クラスなので、[public void println(String x)](https://docs.oracle.com/javase/jp/8/docs/api/java/io/PrintStream.html#println-java.lang.String-) です。`String`ではない別のクラスであれば、`Object`クラスの変数を引数とする [public void println(Object x)](https://docs.oracle.com/javase/jp/8/docs/api/java/io/PrintStream.html#println-java.lang.Object-)が呼ばれます。このメソッドに関してリファレンスには次のように書いていますね。
|
22
36
|
|
4
文を修正
test
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
|
19
19
|
まず、`System.out.println`のメソッドのリファレンスを見てみます。
|
20
20
|
|
21
|
-
[System.out.println](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/System.html#out) から辿って[PrintStream#println](https://docs.oracle.com/javase/jp/8/docs/api/java/io/PrintStream.html#println--)に行き着きます。引数の型ごとにいくつもオーバーロードされた`println`がありますが、`System.out.println(a)`を実行した場合に呼ばれるメソッドは、`a`は
|
21
|
+
[System.out.println](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/System.html#out) から辿って[PrintStream#println](https://docs.oracle.com/javase/jp/8/docs/api/java/io/PrintStream.html#println--)に行き着きます。引数の型ごとにいくつもオーバーロードされた`println`がありますが、`System.out.println(a)`を実行した場合に呼ばれるメソッドは、`a`は`String`クラスなので、[public void println(String x)](https://docs.oracle.com/javase/jp/8/docs/api/java/io/PrintStream.html#println-java.lang.String-) です。`String`ではない別のクラスであれば、`Object`クラスの変数を引数とする [public void println(Object x)](https://docs.oracle.com/javase/jp/8/docs/api/java/io/PrintStream.html#println-java.lang.Object-)が呼ばれます。このメソッドに関してリファレンスには次のように書いていますね。
|
22
22
|
|
23
23
|
|
24
24
|
|
3
誤りを修正
test
CHANGED
@@ -18,7 +18,7 @@
|
|
18
18
|
|
19
19
|
まず、`System.out.println`のメソッドのリファレンスを見てみます。
|
20
20
|
|
21
|
-
[System.out.println](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/System.html#out) から辿って[PrintStream#println](https://docs.oracle.com/javase/jp/8/docs/api/java/io/PrintStream.html#println--)に行き着きます。引数の型ごとにいくつもオーバーロードされた`println`がありますが、`System.out.println(a)`を実行した場合に呼ばれるメソッドは、`Object`クラスの変数を引数とする `public void println(Object x)`
|
21
|
+
[System.out.println](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/System.html#out) から辿って[PrintStream#println](https://docs.oracle.com/javase/jp/8/docs/api/java/io/PrintStream.html#println--)に行き着きます。引数の型ごとにいくつもオーバーロードされた`println`がありますが、`System.out.println(a)`を実行した場合に呼ばれるメソッドは、`a`はこの場合`String`なので、[public void println(String x)](https://docs.oracle.com/javase/jp/8/docs/api/java/io/PrintStream.html#println-java.lang.String-) が呼ばれます。`String`ではない別のクラスであれば、`Object`クラスの変数を引数とする `public void println(Object x)` が呼ばれます。このメソッドに関してリファレンスには、次のように書いていますね。
|
22
22
|
|
23
23
|
|
24
24
|
|
2
実行例の内容を追記
test
CHANGED
@@ -150,7 +150,17 @@
|
|
150
150
|
|
151
151
|
|
152
152
|
|
153
|
-
```
|
153
|
+
```CMD
|
154
|
+
|
155
|
+
C>java --version
|
156
|
+
|
157
|
+
java 11.0.9 2020-10-20 LTS
|
158
|
+
|
159
|
+
Java(TM) SE Runtime Environment 18.9 (build 11.0.9+7-LTS)
|
160
|
+
|
161
|
+
Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.9+7-LTS, mixed mode)
|
162
|
+
|
163
|
+
|
154
164
|
|
155
165
|
C>java --source 8 Main.java
|
156
166
|
|
1
誤記修正
test
CHANGED
@@ -34,7 +34,7 @@
|
|
34
34
|
|
35
35
|
|
36
36
|
|
37
|
-
つまり、`System.out.println(a)` は、そのメソッドの中で `a.toString()`を実行しています。`toString()`メソッドとは何でしょう。これは、Javaのすべてのクラスの根本である[java.lang.Object](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Object.html)ラス
|
37
|
+
つまり、`System.out.println(a)` は、そのメソッドの中で `a.toString()`を実行しています。`toString()`メソッドとは何でしょう。これは、Javaのすべてのクラスの根本である[java.lang.Object](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Object.html)クラスが持つ、最低限の機能を必ず実装しているメソッドです。[Object#toString](https://docs.oracle.com/javase/jp/8/docs/api/java/lang/Object.html#toString--)デフォルトの実装では`toString()`は単純に参照の値を出力するようものですが、`String`クラスはこれをオーバーライドして、自身が管理している文字列を出力するようになっています。`String`クラスが担う役割を考えると、適当ですね。
|
38
38
|
|
39
39
|
|
40
40
|
|