黑马程序员技术交流社区

标题: 问大家一个可能简单的问题 [打印本页]

作者: 王梁星    时间: 2012-11-7 15:50
标题: 问大家一个可能简单的问题
本帖最后由 王梁星 于 2012-11-8 21:41 编辑

那就是,为什么System.out.println()语句能把一个其他进制数,输出为十进制数。

eg:
class demo{
  public static void main(String args[]){
    System.out.println(0x4B);
}

输出结果:70



以下是PrintStream.java源文件中的设计println()的源码,大家共同研究。有其他人发现的欢迎贴出来。
  1. private void newLine() {
  2.         try {
  3.             synchronized (this) {
  4.                 ensureOpen();
  5.                 textOut.newLine();
  6.                 textOut.flushBuffer();
  7.                 charOut.flushBuffer();
  8.                 if (autoFlush)
  9.                     out.flush();
  10.             }
  11.         }
  12.         catch (InterruptedIOException x) {
  13.             Thread.currentThread().interrupt();
  14.         }
  15.         catch (IOException x) {
  16.             trouble = true;
  17.         }
  18.     }

  19. public void println() {
  20.         newLine();
  21.     }
复制代码

作者: 颜峰    时间: 2012-11-7 16:12
System.out.println()语句输出的时候会调用被输入对象的toString()方法,应该是这个方法内部转成了10进制的表现形式
作者: 舒远    时间: 2012-11-7 16:24
编译期就能确定0x4B的十进制值为75,打印的就是这个常量值。
作者: 王梁星    时间: 2012-11-7 16:38
舒远 发表于 2012-11-7 16:24
编译期就能确定0x4B的十进制值为75,打印的就是这个常量值。

为什么打印出来的不是二进制,偏偏是十进制?
作者: 王梁星    时间: 2012-11-7 16:42
颜峰 发表于 2012-11-7 16:12
System.out.println()语句输出的时候会调用被输入对象的toString()方法,应该是这个方法内部转成了10进制的 ...

不是吧,toString()方法返回对象的字符串表现形式
作者: 颜峰    时间: 2012-11-7 18:05
王梁星 发表于 2012-11-7 16:42
不是吧,toString()方法返回对象的字符串表现形式

你怎么确定你看到的这个10是数字类型还是字符串类型啊
作者: 王梁星    时间: 2012-11-7 19:35
颜峰 发表于 2012-11-7 18:05
你怎么确定你看到的这个10是数字类型还是字符串类型啊

不大明白,你这句话的意思:dizzy:
作者: 舒远    时间: 2012-11-7 19:58
王梁星 发表于 2012-11-7 16:38
为什么打印出来的不是二进制,偏偏是十进制?

人机交互,你觉得计算机输出一个二进制给你看,你容易看懂还是看十进制的容易看懂?java的设计者又不是傻子。。。
作者: 王亚运    时间: 2012-11-8 09:11
printlnpublic void println(Object x)打印 Object,然后终止该行。此方法首先调用 String.valueOf(x) 获取打印对象的字符串值,然后的行为如同先调用 print(String) 再调用 println() 一样。

valueOfpublic static String valueOf(Object obj)返回 Object 参数的字符串表示形式。
参数:obj - 一个 Object。 返回:如果参数为 null,则字符串等于 "null";否则,返回 obj.toString() 的值。

printlnpublic void println()通过写入行分隔符字符串终止当前行。行分隔符字符串由系统属性 line.separator 定义,不一定是单个换行符 ('\n')。

这是三个方法,建议参考API文档,或许能明白点,

作者: 王梁星    时间: 2012-11-8 13:53
舒远 发表于 2012-11-7 19:58
人机交互,你觉得计算机输出一个二进制给你看,你容易看懂还是看十进制的容易看懂?java的设计者又不是傻 ...

对,说的也是
作者: 奋斗的青春    时间: 2012-11-8 14:02
看看API就明白了 。

println.png (6.32 KB, 下载次数: 55)

println.png

作者: 杨志男    时间: 2012-11-8 15:09
使用PrintStream类的println()方法输出结果的底层实现顺序可能是这样的:
首先使用String类的valueof()方法获取int型数值的字符串表现形式
其次调用PrintStream类的print(String str)方法将获取到的字符串按平台默认的编码表转换成字节,再使用write()方法将字节写入这个打印流
然后使用Integer.toString()方法将二进制字节转换成十进制,并以字符串形式返回
最后使用println(String str)方法打印字符串,并加入行分隔符终止打印;
作者: 惠晖    时间: 2012-11-8 15:45
想想都可怕啊, 我的天啊
作者: 王梁星    时间: 2012-11-8 21:28
惠晖 发表于 2012-11-8 15:45
想想都可怕啊, 我的天啊

怕什么:)
作者: 王梁星    时间: 2012-11-8 21:29
王亚运 发表于 2012-11-8 09:11
printlnpublic void println(Object x)打印 Object,然后终止该行。此方法首先调用 String.valueOf(x) 获取 ...

这个。。。
作者: 王梁星    时间: 2012-11-8 21:29
吴愿涛 发表于 2012-11-8 14:02
看看API就明白了 。

正因为看了还不懂
作者: 王梁星    时间: 2012-11-8 21:43
杨志男 发表于 2012-11-8 15:09
使用PrintStream类的println()方法输出结果的底层实现顺序可能是这样的:
首先使用String类的valueof()方法 ...

高见

看我的补充
作者: 王梁星    时间: 2012-11-8 21:43
吴愿涛 发表于 2012-11-8 14:02
看看API就明白了 。

看我的补充
作者: 王梁星    时间: 2012-11-8 21:44
舒远 发表于 2012-11-7 16:24
编译期就能确定0x4B的十进制值为75,打印的就是这个常量值。

看我的补充
作者: 王梁星    时间: 2012-11-8 21:44
颜峰 发表于 2012-11-7 16:12
System.out.println()语句输出的时候会调用被输入对象的toString()方法,应该是这个方法内部转成了10进制的 ...

看我的补充
作者: 胡小凡    时间: 2012-11-8 21:45
好强大。。。。。。。
作者: 王梁星    时间: 2012-11-8 21:46
胡小凡 发表于 2012-11-8 21:45
好强大。。。。。。。

怎么强大:funk:
作者: 胡小凡    时间: 2012-11-8 21:52
王梁星 发表于 2012-11-8 21:46
怎么强大

我还在看基础视频
作者: 杨志男    时间: 2012-11-9 00:06
王梁星 发表于 2012-11-8 21:43
高见

看我的补充

哪个补充?那张图?
作者: 杨志男    时间: 2012-11-9 00:09
嗯 看到了
作者: 王梁星    时间: 2012-11-9 10:32
胡小凡 发表于 2012-11-8 21:52
我还在看基础视频

至少我刚开始看第二遍,这次必须仔细,所以,问题肯定大堆阿
作者: 王梁星    时间: 2012-11-9 10:34
杨志男 发表于 2012-11-9 00:06
哪个补充?那张图?

是我问题的补充,无图的。

我补充了println()的相关源码。发现其实它调用的是newLine()方法。难道newL()方法里有文章?




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2