ホームページ  >  に質問  >  本文

インスタンス化されていない静的オブジェクトは、クラス内の非静的メソッドも呼び出すことができますか?

非常に一般的なコードがあります: System.out.println。これは非常に一般的な出力ステートメントですが、しばらく勉強した後、突然ソース コードを見ることを思い出しました。以下はソース コードです:

リーリー

out は System クラスの下で定義されており、インスタンス化されていません。Out は単なる null 変数であり、静的オブジェクトを呼び出すことさえできません。ただし、PrintStream クラスの下で println() メソッドを呼び出すことはできます。これは問題ではありません。理解?どういうことなんですか?

为情所困为情所困2712日前635

全員に返信(5)返信します

  • 我想大声告诉你

    我想大声告诉你2017-05-17 10:09:52

    詳しい説明: 中国語版 http://www.cnblogs.com/skywan...
    jdk7 ベースの英語版 https://luckytoilet.wordpress...

    返事
    0
  • 滿天的星座

    滿天的星座2017-05-17 10:09:52

    まず第一に、テスト クラスを開始するとき、つまりテスト クラスをインスタンス化するとき、呼び出すすべての静的クラスが最初にインスタンス化されるため、実際に System.out.println ステートメントを実行すると、 System クラスのメソッドとプロパティが初期化されました。

    返事
    0
  • 仅有的幸福

    仅有的幸福2017-05-17 10:09:52

    静的{

    リーリー

    }
    上記の静的メソッドのアノテーションは、初期化のために initializeSystemClass メソッドが呼び出されることを示しています。このメソッドの setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));出力するには、
    private staticative void setOut0(PrintStream out) はネイティブ メソッドです。

    返事
    0
  • 天蓬老师

    天蓬老师2017-05-17 10:09:52

    final static を見たとき、私の最初の反応は、これは定数であり、定数は初期化する必要があるということでした。そして、再度それを探しました。そして、案の定、初期化するためにローカル メソッドを呼び出しています。

    返事
    0
  • 给我你的怀抱

    给我你的怀抱2017-05-17 10:09:52

    initializeSystemClass() 関数で行われる初期化作業は、システム スレッドが初期化された後に呼び出されます。つまり、すべての静的メンバー変数 (err out in) がこの関数で初期化されます。
    たとえば、この out:
    FileOutputStream。 fdOut = new FileOutputStream(FileDescriptor.out);
    setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));
    setOut0() 関数はネイティブ層にあり、初期化されたファイル間の接続を確立します。オブジェクトとこれをネイティブレイヤーに出力します

    返事
    0
  • キャンセル返事