Heim  >  Fragen und Antworten  >  Hauptteil

Kann ein nicht instanziiertes statisches Objekt auch nicht statische Methoden in einer Klasse aufrufen?

Es gibt einen sehr häufigen Code: System.out.println Dies ist eine sehr häufige Ausgabeanweisung, aber nachdem ich sie eine Weile studiert hatte, fiel mir plötzlich ein, mir den Quellcode anzusehen:

public final static PrintStream out = null;

out ist unter der System-Klasse definiert und wurde nicht instanziiert. Es kann nicht einmal als statisches Objekt aufgerufen werden, aber es kann die println()-Methode unter der PrintStream-Klasse aufrufen. Bereits? Darf ich fragen warum?

为情所困为情所困2712 Tage vor632

Antworte allen(5)Ich werde antworten

  • 我想大声告诉你

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

    详细解释:中文版http://www.cnblogs.com/skywan...
    英文版基于jdk7 https://luckytoilet.wordpress...

    Antwort
    0
  • 滿天的星座

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

    亲,首先,当你启动你的测试类,也就是实例化你的测试类时,你所调用的所有静态类都会先实例化了,所以其实当你执行到System.out.println语句时,System这个类里面的方法和属性都是已经被初始化好了的!

    Antwort
    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)是本地方法;

    Antwort
    0
  • 天蓬老师

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

    一看到final static,第一反应就应该是这丫的是常量,常量必须是要初始化的,然后再找找,果然

    他是调用本地方法去初始化的;

    Antwort
    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()函数是在native层,在native层把初始化的对象和这个out建立起连接

    Antwort
    0
  • StornierenAntwort