首頁  >  問答  >  主體

java - 未實例化的靜態物件也能呼叫類別中的非靜態方法嗎?

有一個很常見的程式碼:System.out.println,這是再常見不過的輸出語句,但是學了一段時間突然想起去看了下源碼,下面是源碼:

public final static PrintStream out = null;

out是在System類別下定義的,還沒實例化,out僅僅是一個null的變量,甚至都不能稱之為靜態對象,但是卻能調用PrintStream類別下的println()方法,這就不太理解了?請問為什麼?

为情所困为情所困2734 天前658

全部回覆(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

    static {

        registerNatives();

    }
    上面這個靜態方法的註解說會呼叫initializeSystemClass方法進行初始化,這個方法裡面的setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));應該對out進行賦值,
    private static native 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(eative ,在native層把初始化的物件和這個out建立起連接

    回覆
    0
  • 取消回覆