A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© Destiny 中级黑马   /  2012-3-21 20:33  /  2756 人查看  /  5 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

对于“System.out.print( );” 有些疑问: out是Printstream类型的,这个我清楚。而且print()方法是在PrintStream类中定义的,这个我也清楚。但是我有个地方不明白:这些在PrintStream类中定义的print( )方法都是非static的,为什么可以正确的由out直接调用而没有抛出“空引用”的异常呢 ?

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

5 个回复

倒序浏览
其实您调用System.out你得到的是一个Printstream类型的对象,因为print()方法是在PrintStream类中定义的,所以对print()方法的调用其实相当于Printstream类型的对象对该对象中的成员函数的调用

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
out是Printstream的实例对象,那么由out直接调用应该不会抛出“空引用”吧

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
看java API文档,out是System类的一个字段,返回值是静态PrintStream 对象:
out,
     public static final PrintStream out“标准”输出流。此流已打开并准备接受输出数据。
通常,此流对应于显示器输出或者由主机环境或用户指定的另一个输出目标。
这样就可以解决lz疑问,当我们写到 System.out 时就已经得到了一个PrintStream 对象,继而调用PrintStream 对象的print()方法。
其实System.out.print( );可以这样写:
PrintStream  ps = System.out ;
ps.println("heima");


评分

参与人数 1技术分 +1 收起 理由
房宝彬 + 1

查看全部评分

回复 使用道具 举报
out是printStream类型的类变量,指向一个已经打开的流,同时该变量又是定义在System类中的固定的字段摘要,且是静态的,所以可以写成System.out形式,println是print中的非静态方法
,printStream创建的对象调用。System.out.println(data);是正确而且标准的写法

评分

参与人数 1技术分 +1 收起 理由
老罗 + 1

查看全部评分

回复 使用道具 举报
LZ的这个问题我以前也想过,今天专门翻了下源码,写了篇总结,大家交流下。

http://www.cnblogs.com/zr-714/archive/2012/03/22/2411926.html
回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马