我读过这篇文章:用Java编写一个对象吗?.
在帖子中,有人认为这int不是继承自的Object.如果是这样的话,为什么下面的代码编译没有任何错误?鉴于int不是Object,format()方法的签名public static String format(String format, Object... args)如文档所示:javadoc for String!
public class Testing {
public static void main(String[] args) {
int integer = 7;
String str = String.format("%03d", integer);
System.out.println(str);
}
}
Run Code Online (Sandbox Code Playgroud)
我还读过"Autoboxing".这到底是什么意思?Object在编译之前是否所有的原语都被适当的原语取代了?如果是这样,那么在使用大量的int's(int[])over Integers(Integer[])时,是否有使用内存的优势?类似的论据遵循双重等.
任何见解都是受欢迎的.
它是由Autoboxing引起的.
这是链接的Java文档中的一个小片段,它比我更好地解释了它:
自动装箱是Java编译器在基元类型和相应的对象包装类之间进行的自动转换.例如,将int转换为Integer,将double转换为Double,依此类推.如果转换是另一种方式,则称为拆箱.
以下是自动装箱的最简单示例:
Character ch = 'a';
Run Code Online (Sandbox Code Playgroud)
本节中的其余示例使用泛型.如果您还不熟悉泛型的语法,请参阅泛型(更新)课程.
请考虑以下代码:
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
li.add(i);
Run Code Online (Sandbox Code Playgroud)
虽然您将int值作为基本类型而不是Integer对象添加到li,但代码会进行编译.因为li是Integer对象的列表,而不是int值列表,所以您可能想知道为什么Java编译器不会发出编译时错误.编译器不会生成错误,因为它从i创建一个Integer对象并将对象添加到li.因此,编译器在运行时将以前的代码转换为以下代码:
List<Integer> li = new ArrayList<>();
for (int i = 1; i < 50; i += 2)
li.add(Integer.valueOf(i));
Run Code Online (Sandbox Code Playgroud)