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

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 王梁星 中级黑马   /  2012-11-7 15:50  /  3632 人查看  /  26 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 王梁星 于 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.     }
复制代码

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

26 个回复

倒序浏览
System.out.println()语句输出的时候会调用被输入对象的toString()方法,应该是这个方法内部转成了10进制的表现形式

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
编译期就能确定0x4B的十进制值为75,打印的就是这个常量值。

评分

参与人数 1技术分 +1 收起 理由
滔哥 + 1

查看全部评分

回复 使用道具 举报
舒远 发表于 2012-11-7 16:24
编译期就能确定0x4B的十进制值为75,打印的就是这个常量值。

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

不是吧,toString()方法返回对象的字符串表现形式
回复 使用道具 举报
王梁星 发表于 2012-11-7 16:42
不是吧,toString()方法返回对象的字符串表现形式

你怎么确定你看到的这个10是数字类型还是字符串类型啊
回复 使用道具 举报
颜峰 发表于 2012-11-7 18:05
你怎么确定你看到的这个10是数字类型还是字符串类型啊

不大明白,你这句话的意思:dizzy:
回复 使用道具 举报
舒远 黑马帝 2012-11-7 19:58:34
8#
王梁星 发表于 2012-11-7 16:38
为什么打印出来的不是二进制,偏偏是十进制?

人机交互,你觉得计算机输出一个二进制给你看,你容易看懂还是看十进制的容易看懂?java的设计者又不是傻子。。。
回复 使用道具 举报
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文档,或许能明白点,

评分

参与人数 1技术分 +1 收起 理由
古银平 + 1 赞一个!

查看全部评分

回复 使用道具 举报
舒远 发表于 2012-11-7 19:58
人机交互,你觉得计算机输出一个二进制给你看,你容易看懂还是看十进制的容易看懂?java的设计者又不是傻 ...

对,说的也是
回复 使用道具 举报
看看API就明白了 。

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

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

怕什么:)
回复 使用道具 举报
王亚运 发表于 2012-11-8 09:11
printlnpublic void println(Object x)打印 Object,然后终止该行。此方法首先调用 String.valueOf(x) 获取 ...

这个。。。
回复 使用道具 举报
吴愿涛 发表于 2012-11-8 14:02
看看API就明白了 。

正因为看了还不懂
回复 使用道具 举报
杨志男 发表于 2012-11-8 15:09
使用PrintStream类的println()方法输出结果的底层实现顺序可能是这样的:
首先使用String类的valueof()方法 ...

高见

看我的补充
回复 使用道具 举报
吴愿涛 发表于 2012-11-8 14:02
看看API就明白了 。

看我的补充
回复 使用道具 举报
舒远 发表于 2012-11-7 16:24
编译期就能确定0x4B的十进制值为75,打印的就是这个常量值。

看我的补充
回复 使用道具 举报
颜峰 发表于 2012-11-7 16:12
System.out.println()语句输出的时候会调用被输入对象的toString()方法,应该是这个方法内部转成了10进制的 ...

看我的补充
回复 使用道具 举报
12下一页
您需要登录后才可以回帖 登录 | 加入黑马