web-dev-qa-db-ja.com

メソッドを呼び出す場合、変数にはクラスのインスタンスが含まれている必要がありますか?

次の リンク で、著者は次のように述べています

「out」はクラスSystemに属する静的変数であるとすでに推論しました。しかし、「out」はメソッド「println()」を呼び出しているため、クラスのインスタンスである必要があることがわかります。

しかし、クラス変数、つまり静的変数をインスタンス変数にする方法はありますか?それはそれがクラスのインスタンスであると述べています、それは本当です-クラスがなければ、outは存在しなくなります。ただし、outオブジェクトのインスタンスごとにSystemが1つしかないため、インスタンス変数ではありません。 (システムはプライベートコンストラクターを所有していることに注意してください。)

では、ProgrammerInterviewは間違っていましたか?

1
Jossie Calderon

では、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();
        }
    }
_

したがって、使用されている構文から、インスタンスメソッドが呼び出されていることを推測することはできません。

6
Stephen C

しかし、「out」はメソッド「println()」を呼び出しているため、クラスのインスタンスである必要があることがわかります。

あなたの混乱は、この文が少し不正確であるという事実から来ています(間違いではなく、ただずさんな言葉です)。より正確には次のようになります。

しかし今、「out」はへの参照を含むクラスのインスタンスでなければならないことがわかります

(ここで意味するクラスはPrintStreamではなくSystemです)。

2
Doc Brown

他の回答で概説されているように、オブジェクトインスタンスとインスタンス変数には違いがあるため、作成者は間違いではありません。

ただし、作成者は、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);
            }
        }
    }
}
0
NESPowerGlove

他の答えは、記事のテキストの正しさをカバーしています。しかし、記事のセクション見出しが正しくないため、混乱している可能性があります。 System.out.println()の「out」とは何ですか?というタイトルのセクションで、彼らはoutがインスタンス変数ではないと判断します。次のセクションのタイトルはSystem.out.println()の「out」はインスタンス変数ですか?しかし、彼らはそれに答えただけです!もう一度尋ねる必要はありません。そして、彼らはこのセクションでこれに疑問を投げかけません。代わりに、このセクションでは、outが「クラスのインスタンス」であるかどうかを調べます。これにより、「インスタンス変数」は「クラスのインスタンス」と同じ意味であるように見えます。これは、一方を他方を意味するときに記述したためです。しかし、これはタイプミスであり、同義語ではありません。それらはおそらくそのセクションにタイトルを付けることを意味していましたSystem.out.println()の「out」はインスタンスですか?

0
Dan Getz