Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/326.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在java的sysout中使用unbing或toString()_Java - Fatal编程技术网

在java的sysout中使用unbing或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

我们知道,当我们在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 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
使用了什么呢?这就是您问题的答案:for
Integer
调用其
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