1. ホーム

[解決済み】System.out.print()はどのように機能するのですか?

2022-04-14 14:05:49

質問

私はかなり長い間、Javaを使用してきました。 System.out.print() が動作します。

ここで、私の疑問があります。

関数である以上、その宣言は イオ パッケージで提供されます。しかし、この関数はどんな数の引数でも、どんな引数の型でも、どのように並べても取り込むことができるので、Javaの開発者はどのようにしたのでしょうか? 例えば、以下のように。

System.out.print("Hello World");
System.out.print("My name is" + foo);
System.out.print("Sum of " + a + "and " + b + "is " + c);
System.out.print("Total USD is " + usd);

変数のデータ型が何であっても a, b, c, usd, foo またはどのように渡されるかを指定します。 System.out.print() は決してエラーを投げない。

私としては、このような要件のプロジェクトに携わったことはありません。もし、このような要件があった場合、どのように解決したらいいのかわからないのです。

どなたか説明していただけませんか?

どのように解決するのですか?

System.out のインスタンスに過ぎません。 PrintStream . その JavaDoc . その可変性は メソッドのオーバーロード (同じ名前で、異なるパラメータを持つ複数のメソッド)。

このプリントストリームは、その出力を、いわゆる 標準出力 .


ご質問の中で、以下のようなテクニックが紹介されています。 バリアディック関数 (または ヴァーラグ ). 残念ながらそれは PrintStream#print ということで、何かと勘違いしているようですね。しかし、これらをJavaで実装するのは非常に簡単です。 ドキュメントを確認するだけです。


また、Java が文字列でない変数の連結をどのように行っているのか気になる方は "foo" + 1 + true + myObj それは、主にJavaコンパイラの責任です。

連結に変数が含まれない場合、コンパイラは単に文字列を連結する。変数がある場合、連結は次のように変換される。 StringBuilder#append を連鎖させます。結果のバイトコードには連結命令はありません。 + 演算子(文字列の連結について話す場合)はコンパイル時に解決されます。

Java のすべての型は、文字列に変換することができます ( int のメソッドを介して Integer クラスがあります。 boolean のメソッドを介して Boolean クラス、オブジェクトはそれ自身の #toString , ...). 興味のある方はStringBuilderのソースコードをご覧ください。


UPDATEです。 自分でも気になったので調べてみました( ジャバップ ) 私の例の System.out.println("foo" + 1 + true + myObj) にコンパイルされます。その結果

System.out.println(new StringBuilder("foo1true").append(myObj).toString());