2013-04-26 5 views
0

Непосредственно из javadoc:Java: происходит автоматическая упаковка?

s', 'S' вообще Если аргумент аргумент имеет нулевое значение, то результат "нуль". Если arg реализует Formattable, тогда вызывается arg.formatTo. В противном случае результат получается путем вызова arg.toString().

Означает ли это, что в следующей строке кода число 3 (arg) получает автобокс в Integer, а затем вызывается метод arg.toString()?

System.out.format("%10s",3); 

ответ

1

Он делает. Все вариационные аргументы являются автобоксами. И да, вызывается метод toString().

+0

Приветствия очень благодарны. – Rollerball

1

Вы можете сами проверить, что происходит именно путем компиляции небольшую тестовую программу, а затем декомпилировать его с javap (инструмент в комплекте с JDK):

public class Example { 
    public static void main(String[] args) { 
     System.out.format("%10s",3); 
    } 
} 

Компиляция это с javac Example.java, а затем декомпилировать его с javap -c Example :

Compiled from "Example.java" 
public class Example { 
    public Example(); 
    Code: 
     0: aload_0 
     1: invokespecial #1     // Method java/lang/Object."<init>":()V 
     4: return 

    public static void main(java.lang.String[]); 
    Code: 
     0: getstatic  #2     // Field java/lang/System.out:Ljava/io/PrintStream; 
     3: ldc   #3     // String %10s 
     5: iconst_1 
     6: anewarray  #4     // class java/lang/Object 
     9: dup 
     10: iconst_0 
     11: iconst_3 
     12: invokestatic #5     // Method java/lang/Integer.valueOf:(I)Ljava/lang/Integer; 
     15: aastore 
     16: invokevirtual #6     // Method java/io/PrintStream.format:(Ljava/lang/String;[Ljava/lang/Object;)Ljava/io/PrintStream; 
     19: pop 
     20: return 
} 

Вы видите, что это делает:

  • Это создает Object[], в котором первая строка "%10s" хранится (строки 3-10)
  • Он вызывает Integer.valueOf() в поле на значение 3 (строки 11, 12)
  • Объект Integer хранится в массиве (строка 15)
  • Тогда метод format(Object[]) называется (строка 16)

Примечание: массив используется, потому что метод format представляет собой метод переменных аргументов; varargs реализуются с использованием массивов.