自己的电脑可以做网站服务器,全国建筑四库一平台,各大游戏网站,怎样接做网站的活自动装箱和拆箱自Java 1.5以来#xff0c;所有Java开发人员都可以使用自动装箱功能。嗯#xff0c;我可能太乐观了。 至少所有开发人员都应该可以使用自动装箱。 毕竟#xff0c;在ORACLE页面上有一个很好的教程。 自动装箱是指Java编译器在需要时自动从原始类型创建用于创… 自动装箱和拆箱 自Java 1.5以来所有Java开发人员都可以使用自动装箱功能。嗯我可能太乐观了。 至少所有开发人员都应该可以使用自动装箱。 毕竟在ORACLE页面上有一个很好的教程。 自动装箱是指Java编译器在需要时自动从原始类型创建用于创建对象的代码的现象。 例如您可以编写 Integer a 42; 它将自动生成将值int 42放入Integer对象的JVM代码。 编译器为我们做到这一点真是太好了以至于一段时间后程序员往往会忘记它背后的复杂性而我们有时会碰壁。 例如我们有double.class和Double.class 。 它们都是对象作为一个类每个类本身都是permgen中的对象或者只是后permgen版本的JVM中的堆。 这两个对象均为Class类型。 而且由于Java 1.5都属于ClassDouble类型。 如果两个对象具有相同的类型那么它们也必须是赋值兼容的。 似乎是一个显而易见的陈述。 如果您有对象O a和对象O b则可以指定a b 。 查看代码但是我们可能会发现遗忘而不是显而易见 public class TypeFun {public static void main(String[] args) {// public static final ClassDouble TYPE (ClassDouble)Class.getPrimitiveClass(double);System.out.println(Double.TYPE double.class: (Double.TYPE double.class));System.out.println(Double.TYPE Double.class: (Double.TYPE Double.class));System.out.println(double.class.isAssignableFrom(Double.class): (double.class.isAssignableFrom(Double.class)));System.out.println(Double.class.isAssignableFrom(double.class): (Double.class.isAssignableFrom(double.class)));}
} 结果 Double.TYPE double.class: true
Double.TYPE Double.class: false
double.class.isAssignableFrom(Double.class): false
Double.class.isAssignableFrom(double.class): false 这意味着Double的原始对是double.class 不足为奇。 即使不能从另一个分配一个。 我们至少可以查看其中之一的来源。 Double类的源代码位于RT.jar中并且是开源的。 在那里您可以看到 public static final ClassDouble TYPE (ClassDouble) Class.getPrimitiveClass(double); 为什么使用奇怪的Class.getPrimitiveClass(double)而不是double.class 那就是Double类型的原始对。 答案并不简单您可以深入研究Java和JVM的细节。 由于double不是一个类因此实际上没有像double.class这样的类。 但是您仍然可以在Java源代码中使用此文字并且Java语言编译器和运行时具有很强的约束力。 编译器知道Double类定义了一个名为TYPE的字段该字段表示其原始类型。 每当编译器在源代码中看到double.class 它都会生成JVM代码Double.TYPE 尝试一下然后使用javap解码生成的代码。 因此RT的开发人员无法编写 public static final ClassDouble TYPE double.class; 进入Double类的源代码。 它将编译为等效的代码 public static final ClassDouble TYPE TYPE; 那么自动装箱如何进行 来源 Double b (double)1.0; 结果 0: dconst_1 1: invokestatic #2 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;4: astore_1 但是如果我们替换两个“ d”字母 double b (Double)1.0; 然后我们得到 0: dconst_1 1: invokestatic #2 // Method java/lang/Double.valueOf:(D)Ljava/lang/Double;4: invokevirtual #3 // Method java/lang/Double.doubleValue:()D7: dstore_1 进食可以解释很多事情。 double.class类和Double.class类的实例不分配兼容。 自动装箱解决了这个问题。 Java 4很久以前了幸运的是我们忘记了它。 您的作业重读带有“类”类型和相应原始类型参数的方法时重读与自动装箱相关的事情。 翻译自: https://www.javacodegeeks.com/2014/09/autoboxing.html自动装箱和拆箱