在java的sysout中使用unbing或toString()
我们知道,当我们在sysout(System.out.Println)语句内部使用对象时,它的toString方法被调用。使用原语,它可以直接打印。但是,当我们使用任何包装器类时,使用的对象类型是假设整数,如下所示在java的sysout中使用unbing或toString(),java,Java,我们知道,当我们在sysout(System.out.Println)语句内部使用对象时,它的toString方法被调用。使用原语,它可以直接打印。但是,当我们使用任何包装器类时,使用的对象类型是假设整数,如下所示 Integer i = new Integer(10) System.out.Println(i); Integer i = new Integer(10) System.out.println(i); Integer i = new Inte
Integer i = new Integer(10)
System.out.Println(i);
Integer i = new Integer(10)
System.out.println(i);
Integer i = new Integer(10)
System.out.println(i);
是toString()负责打印还是取消装箱?所有这些都是在1.5版本中引入的。回答这些问题的代码——或者API文档——在1.5+版本中根本没有改变 基本上,在这行的末尾是针对非原语(如
Integer
实例)的toString
方法
首先,对于原语,每个原语都有不同的处理方法。例如,对于int
打印一个整数。弦产生了
通过字符串。valueOf(int)被转换
根据平台的
默认字符编码,以及
字节以完全相同的格式写入
写入(int)方法的方式
但是对于像Integer
这样的对象,println调用:
打印一个对象。弦产生了
通过String.valueOf(Object)方法
根据
平台的默认字符
编码,然后写入这些字节
完全按照
write(int)方法
那么valueOf
使用了什么呢?这就是您问题的答案:forInteger
调用其toString
方法。这是上一页的文档
如果参数为null,则为字符串
等于“空”;否则,值
返回obj.toString()的值
快速测试和调试运行表明调用了
print(Object)
,而不是print(int)
检查这一点的一个好方法是:
Integer val = null;
System.out.print(val);
如果使用了unboxing,这将抛出NullPointerException。但这不会发生,它会打印字符串null
,这是传入null时string.valueOf(Object)
的输出
要记住的另一个方面是PrintStream
在Java5之前就存在了。在Java5中引入自动装箱时,必须确保使用PrintStream
的任何现有代码不会突然改变其行为。因此,任何调用print(Object)
的现有代码都不能因为新的语言特性而突然将其行为更改为调用print(int)
。必须始终保持向后兼容性
(…)但是当我们使用任何包装类类型时
对象的数量用于假设整数
像下面
Integer i = new Integer(10)
System.out.Println(i);
Integer i = new Integer(10)
System.out.println(i);
Integer i = new Integer(10)
System.out.println(i);
是toString()负责的吗
打印还是拆箱
您正在将一个对象
传递给println
,因此很明显,如果obj
不是null
,那么调用的输出将被调用
附言:无意冒犯,但是,你为什么不看看资料来源呢
更新:我可能没有抓住问题的重点(如果可以的话,这在当前的形式中是误导性的)。事实上,问题可能是:
(…)但是当我们使用任何包装类类型时
对象的数量用于假设整数
像下面
Integer i = new Integer(10)
System.out.Println(i);
Integer i = new Integer(10)
System.out.println(i);
Integer i = new Integer(10)
System.out.println(i);
将调用什么方法:
println(对象)
或println(int)
如果这就是问题所在,那么答案当然就在这里。为了简化,在运行时调用的方法将是在编译时确定的方法。现在,编译器如何确定要调用的方法?好的,这一部分已经解释过了。我不会涵盖所有细节,规范比我做得更好,但基本上,第一步是找到要搜索的类或接口,第二步是找到所有适用的方法,然后选择最具体的方法,第三步是验证选择的方法是否合适。我将关注第二步(这是这里有趣的一步)。如第节所述:
如果方法是
适用于子类型,
可通过方法调用应用
转换,或者它是一个
适用的变量算术方法
决定的过程
适用性从确定
可能适用的方法
. 剩余的
该过程分为三个阶段
讨论 划分为 阶段是为了确保与 Java编程的旧版本 语言
第一阶段 执行重载解析,而无需 允许装箱或拆箱 转换,或变量的使用 arity方法调用。如果没有 在此过程中找到了适用的方法 阶段,然后处理继续到 第二阶段
讨论 这保证了任何调用 在旧版本的中有效 语言不被认为是模棱两可的 由于引入了 隐式变量算术方法 装箱和/或拆箱
第二阶段 执行重载解析,同时 允许装箱和拆箱,但是 仍然排除了变量的使用 arity方法调用。如果没有 在此过程中找到了适用的方法 阶段,然后处理继续到 第三阶段
讨论 这确保了变量的算术性 如果 存在适用的固定算术方法
第三阶段 允许将重载与 变量算术方法、装箱和 拆箱 决定一个方法是否正确 适用遗嘱,在以下情况下: 通用方法, 要求指定实际的类型参数 决心实际类型参数可能是 可以显式或隐式地传递。如果 它们是隐式传递的,它们必须 从 T