次の リンク で、著者は次のように述べています
「out」はクラスSystemに属する静的変数であるとすでに推論しました。しかし、「out」はメソッド「println()」を呼び出しているため、クラスのインスタンスである必要があることがわかります。
しかし、クラス変数、つまり静的変数をインスタンス変数にする方法はありますか?それはそれがクラスのインスタンスであると述べています、それは本当です-クラスがなければ、out
は存在しなくなります。ただし、out
オブジェクトのインスタンスごとにSystem
が1つしかないため、インスタンス変数ではありません。 (システムはプライベートコンストラクターを所有していることに注意してください。)
では、ProgrammerInterviewは間違っていましたか?
では、ProgrammerInterviewは間違っていましたか?
いいえ、正解です。
それは言う:
「しかし今では、
out
はクラスのインスタンスでなければならないことがわかります...」
out
がインスタンス変数であると言っているわけではありません。インスタンス変数は、インスタンスに属する変数であり、インスタンスを含む(参照する)変数ではありません。
ただし、このステートメントのロジックには欠陥があると思います。
しかし、「out」はクラスのインスタンスである必要があることがわかります。なぜならはメソッド「println()」を呼び出しているからです。
...これを参照するとき:
_ System.out.println();
_
これは、System.out.println()
がインスタンスメソッドを呼び出すための構文であり、、したがって_System.out
_の値であると読んでいます。あるクラスのインスタンスである必要があります。
_System.out
_がインスタンスを参照しているのは事実であり、println()
は確かにインスタンスメソッドです。しかし、これは構文から論理的に従いません。
どうして?まったく同じ構文を使用してstatic
メソッドを呼び出すことができるためです。 (これは JLS 15.12 ...で指定されていますが、長くて複雑な読み取りです。)
例:
_ public class Test {
private static void jello() {
System.out.println("jello world");
}
public static void main(String[] args) {
// The preferred way to invoke a static method
Test.jello();
// This also works ...
Test test = new Test();
test.jello();
}
}
_
したがって、使用されている構文から、インスタンスメソッドが呼び出されていることを推測することはできません。
しかし、「out」はメソッド「println()」を呼び出しているため、クラスのインスタンスである必要があることがわかります。
あなたの混乱は、この文が少し不正確であるという事実から来ています(間違いではなく、ただずさんな言葉です)。より正確には次のようになります。
しかし今、「out」はへの参照を含むクラスのインスタンスでなければならないことがわかります
(ここで意味するクラスはPrintStream
ではなくSystem
です)。
他の回答で概説されているように、オブジェクトインスタンスとインスタンス変数には違いがあるため、作成者は間違いではありません。
ただし、作成者は、out
がインスタンス変数であると判断する方法について間違っています。著者はこう書いています:
Javaでは、ドット演算子はメソッドと変数の呼び出しにのみ使用できるため、「out」はメソッドまたは変数のいずれかでなければならないことがわかっています...
しかし、これはそれほど簡単ではないことを示す簡単な反例です。ここで、私のout
はクラスです。
public class JavaTest
{
public static void main (String[] args)
{
Mysystem.out.println("Hello world");
}
static class Mysystem
{
static class out
{
static void println(String s)
{
System.out.println(s);
}
}
}
}
他の答えは、記事のテキストの正しさをカバーしています。しかし、記事のセクション見出しが正しくないため、混乱している可能性があります。 System.out.println()の「out」とは何ですか?というタイトルのセクションで、彼らはout
がインスタンス変数ではないと判断します。次のセクションのタイトルはSystem.out.println()の「out」はインスタンス変数ですか?しかし、彼らはそれに答えただけです!もう一度尋ねる必要はありません。そして、彼らはこのセクションでこれに疑問を投げかけません。代わりに、このセクションでは、out
が「クラスのインスタンス」であるかどうかを調べます。これにより、「インスタンス変数」は「クラスのインスタンス」と同じ意味であるように見えます。これは、一方を他方を意味するときに記述したためです。しかし、これはタイプミスであり、同義語ではありません。それらはおそらくそのセクションにタイトルを付けることを意味していましたSystem.out.println()の「out」はインスタンスですか?