java - 未实例化的静态对象也能调用类中的非静态方法吗?
问题描述
有一个很常见的代码:System.out.println,这是再常见不过的输出语句,但是学了一段时间突然想起去看了下源码,下面是源码:
public final static PrintStream out = null;
out是在System类下定义的,还没实例化,out仅仅是一个null的变量,甚至都不能称之为静态对象,但是却能调用PrintStream类下的println()方法,这就不太理解了?请问为什么?
问题解答
回答1:详细解释:中文版http://www.cnblogs.com/skywan...英文版基于jdk7 https://luckytoilet.wordpress...
回答2:亲,首先,当你启动你的测试类,也就是实例化你的测试类时,你所调用的所有静态类都会先实例化了,所以其实当你执行到System.out.println语句时,System这个类里面的方法和属性都是已经被初始化好了的!
回答3:static {
registerNatives();
}上面这个静态方法的注解说会调用initializeSystemClass方法进行初始化,这个方法里面的 setOut0(newPrintStream(fdOut, props.getProperty('sun.stdout.encoding')));应该对out进行赋值, private static native void setOut0(PrintStream out)是本地方法;
回答4:一看到final static,第一反应就应该是这丫的是常量,常量必须是要初始化的,然后再找找,果然
他是调用本地方法去初始化的;
额, 在initializeSystemClass()这个函数里面做的初始化工作, 这个函数是在系统线程初始化后调用的, 也就是说, 所有的静态成员变量(err out in)都是在这函数里面初始化了的, 例如说这个out : FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out); setOut0(newPrintStream(fdOut, props.getProperty('sun.stdout.encoding')));而setOut0()函数是在native层,在native层把初始化的对象和这个out建立起连接
相关文章:
1. android - Manifest.xml自己生成的GMS服务怎么删掉呢?2. javascript - 如何为input的files赋值远程文件?3. java - git项目迁移到SVN怎么实现的?哪位大神指点指点4. css - 手机app中rem的基准值计算错误5. 为什么要通过常量的方式拐弯抹角的写呢,直接写DSN之类的不好吗6. 老师 我是一个没有学过php语言的准毕业生 我希望您能帮我一下7. 绘制图表的问题8. 请问永久和临时重定向有什么区别9. 站点内容复制额外增加的版权申明,真的很反人类。试问产品自己在用这个站点吗?10. 关于thinkphp 5.1中,ajax提交数据url的格式写法,加花括号就出错,请老师指点

网公网安备