为了账号安全,请及时绑定邮箱和手机立即绑定

未实例化的静态对象也能调用类中的非静态方法吗?

未实例化的静态对象也能调用类中的非静态方法吗?

慕桂英4014372 2019-03-01 11:08:19
有一个很常见的代码:System.out.println,这是再常见不过的输出语句,但是学了一段时间突然想起去看了下源码,下面是源码: public final static PrintStream out = null; out是在System类下定义的,还没实例化,out仅仅是一个null的变量,甚至都不能称之为静态对象,但是却能调用PrintStream类下的println()方法,这就不太理解了?请问为什么?
查看完整描述

4 回答

?
撒科打诨

TA贡献1934条经验 获得超2个赞

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

查看完整回答
反对 回复 2019-03-01
?
慕的地8271018

TA贡献1796条经验 获得超4个赞

static {

    registerNatives();

}
上面这个静态方法的注解说会调用initializeSystemClass方法进行初始化,这个方法里面的 setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));应该对out进行赋值,
private static native void setOut0(PrintStream out)是本地方法;

查看完整回答
反对 回复 2019-03-01
?
呼如林

TA贡献1798条经验 获得超3个赞

额, 在initializeSystemClass()这个函数里面做的初始化工作, 这个函数是在系统线程初始化后调用的, 也就是说, 所有的静态成员变量(err out in)都是在这函数里面初始化了的,
例如说这个out :
FileOutputStream fdOut = new FileOutputStream(FileDescriptor.out);
setOut0(newPrintStream(fdOut, props.getProperty("sun.stdout.encoding")));
而setOut0()函数是在native层,在native层把初始化的对象和这个out建立起连接

查看完整回答
反对 回复 2019-03-01
  • 4 回答
  • 0 关注
  • 826 浏览

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号