質問するログイン新規登録

回答編集履歴

5

頭の方でまとめを列挙。

2021/09/11 02:11

投稿

dodox86
dodox86

スコア9427

answer CHANGED
@@ -7,7 +7,14 @@
7
7
  > なぜ、参照型の変数である'a'だけをSystem.out.printlnに入れるだけで
8
8
  > 文字を出力できているのでしょうか。(メソッド名が必要ない?)
9
9
 
10
+ 色々な疑問が湧いてしまったようですが、それぞれは関連していて、また、Javaと言うプログラミング言語を理解するきっかけとしてもとても良いものだと思います。話が前後するかたちになりますが、説明の前にポイントをまとめておきましょうか。
11
+
12
+ - 全てのクラスは`Object`クラスの派生クラスであり、`toString`メソッドを持っている。
13
+ - Java APIでは、`toString`がそのクラス相応の文字列を返すようオーバーライドによって再実装されているものがある。`String`クラスはその最たる代表と言える。
14
+ - `System.out.println`メソッドの実体は、標準出力の`PrintStream.println`である。 `PrintStream.println`は、`String`クラス並びに根幹である`Object`クラスをも引数と取る各種のオーバーロード版のメソッドがある。
15
+ - `PrintStream.println`メソッドは、その処理の中で引数に対して`valueOf`メソッドや`toString()`メソッドを適時実行し、文字列を出力する
16
+
10
- まず、`System.out.println`メソッドのリファレンスを見てみます。
17
+ です。では見ていきしょう。まず、疑問の発端となった`System.out.println`メソッドのリファレンスを見てみます。
11
18
  [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-)が呼ばれます。このメソッドに関してリファレンスには次のように書いていますね。
12
19
 
13
20
  > Objectを出力して、行を終了します。このメソッドは最初にString.valueOf(x)を呼び出して出力されるオブジェクト> の文字列値を取得してから、print(String)、そしてprintln()を呼び出すのと同じように動作します。

4

文を修正

2021/09/11 02:11

投稿

dodox86
dodox86

スコア9427

answer CHANGED
@@ -8,7 +8,7 @@
8
8
  > 文字を出力できているのでしょうか。(メソッド名が必要ない?)
9
9
 
10
10
  まず、`System.out.println`のメソッドのリファレンスを見てみます。
11
- [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)` が呼ばれます。このメソッドに関してリファレンスには次のように書いていますね。
11
+ [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-)が呼ばれます。このメソッドに関してリファレンスには次のように書いていますね。
12
12
 
13
13
  > Objectを出力して、行を終了します。このメソッドは最初にString.valueOf(x)を呼び出して出力されるオブジェクト> の文字列値を取得してから、print(String)、そしてprintln()を呼び出すのと同じように動作します。
14
14
 

3

誤りを修正

2021/09/10 21:29

投稿

dodox86
dodox86

スコア9427

answer CHANGED
@@ -8,7 +8,7 @@
8
8
  > 文字を出力できているのでしょうか。(メソッド名が必要ない?)
9
9
 
10
10
  まず、`System.out.println`のメソッドのリファレンスを見てみます。
11
- [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)` す。リファレンスには、次のように書いていますね。
11
+ [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)` が呼ばれます。このメソッドに関してリファレンスには、次のように書いていますね。
12
12
 
13
13
  > Objectを出力して、行を終了します。このメソッドは最初にString.valueOf(x)を呼び出して出力されるオブジェクト> の文字列値を取得してから、print(String)、そしてprintln()を呼び出すのと同じように動作します。
14
14
 

2

実行例の内容を追記

2021/09/10 21:22

投稿

dodox86
dodox86

スコア9427

answer CHANGED
@@ -74,7 +74,12 @@
74
74
  ```
75
75
  上記プログラムのWindowsコマンドプロンプト上での実行例です。`System.out.println`の実行と照らし合わせてみてください。
76
76
 
77
- ```terminal
77
+ ```CMD
78
+ C>java --version
79
+ java 11.0.9 2020-10-20 LTS
80
+ Java(TM) SE Runtime Environment 18.9 (build 11.0.9+7-LTS)
81
+ Java HotSpot(TM) 64-Bit Server VM 18.9 (build 11.0.9+7-LTS, mixed mode)
82
+
78
83
  C>java --source 8 Main.java
79
84
  run
80
85
  Mainクラスのインスタンスです。

1

誤記修正

2021/09/10 21:13

投稿

dodox86
dodox86

スコア9427

answer CHANGED
@@ -16,7 +16,7 @@
16
16
 
17
17
  「Object引数の文字列表現を返します」そうです。戻り値としては「引数がnullの場合は"null"に等しい文字列。それ以外の場合はobj.toString()の値が返される。」とあります。
18
18
 
19
- つまり、`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`クラスが担う役割を考えると、適当ですね。
19
+ つまり、`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`クラスが担う役割を考えると、適当ですね。
20
20
 
21
21
  参考:
22
22
  [toStringメソッドのオーバーライドについて - teratial#70200](https://teratail.com/questions/70200)