如果int不继承Object,那么为什么"String.format(String,Object ...)"用int编译?

Sou*_*hat 4 java

我读过这篇文章:用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[])时,是否有使用内存的优势?类似的论据遵循双重等.

任何见解都是受欢迎的.

mko*_*bit 5

它是由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)