CodeGym/Java 博客/随机的/Java 中的自动装箱和拆箱
John Squirrels
第 41 级
San Francisco

Java 中的自动装箱和拆箱

已在 随机的 群组中发布
个会员
在 Java 中,原语及其包装器的一个功能是自动装箱/拆箱。让我们深入研究一下这个概念。正如我们已经了解到的,Java 是一种面向对象的语言。这意味着所有用 Java 编写的程序都是由对象组成的。基元不是对象。但即便如此,包装变量也可以被分配一个原始值。这个过程称为自动装箱。类似地,可以为原始变量分配一个包装对象。这个过程称为拆箱。例如:
public class Main {
   public static void main(String[] args) {
       int x = 7;
       Integer y = 111;
       x = y; // Unboxing
       y = x * 123; // Autoboxing
   }
}
在第 5 行中,我们将 y(一个Integer对象)分配给基元x。正如您所看到的,我们不必采取任何额外的步骤:编译器知道intInteger本质上是相同的东西。这就是开箱。第 6 行的自动装箱也发生了类似的情况:原始值 (x * 123) 很容易分配给对象y。这是自动装箱的示例。这就是该术语包含“自动”一词的原因:因为您不必执行任何特殊操作即可将基元分配给相应的包装对象(反之亦然)。这一切都是自动发生的。方便吧?:) 我们看到了使用方法时自动装箱/拆箱的便利性的另一个例子。这是因为方法参数也会自动装箱和取消装箱。例如,如果一个方法接受两个Integer对象作为输入,我们可以轻松地传递普通int
public class Main {
   public static void main(String[] args) {

       printNumber(7);// A standard int, not even an int variable
   }

   public static void printNumber(Integer i) {
       System.out.println("You entered the number " + i);
   }
}
输出:
You entered the number 7
反之亦然:
public class Main {
   public static void main(String[] args) {

       printNumber(new Integer(632));
   }

   public static void printNumber(int i) {
       System.out.println("You entered the number " + i);
   }
}
您需要记住的重要一点是:自动装箱和拆箱不适用于数组!
public class Main {
   public static void main(String[] args) {

       int[] i = {1,2,3,4,5};

       printArray(i);// Error, this won't compile!
   }

   public static void printArray(Integer[] arr) {
       System.out.println(Arrays.toString(arr));
   }
}
尝试将基元数组传递给采用对象数组的方法将导致编译错误。总之,让我们再简要比较一下原语和包装器。

原语:

  • 具有性能优势
包装纸:
  • 让我们不要违反“一切皆对象”的原则,这意味着数字、字符和布尔值都不会违反这个概念
  • 通过提供方便的方法和字段,扩大使用这些值的可能性
  • 当方法仅适用于对象时是必需的
为了巩固您所学到的知识,我们建议您观看我们的 Java 课程中的视频课程
评论
  • 受欢迎
你必须先登录才能发表评论
此页面还没有任何评论