为什么这个数字类赋值有效(java)?
我找了一个复制品,但没有看到一个足够相似的复制品 您不能在Java中实例化抽象类,而且数字是抽象的,所以为什么这一行要编译:为什么这个数字类赋值有效(java)?,java,numbers,abstract-class,autoboxing,Java,Numbers,Abstract Class,Autoboxing,我找了一个复制品,但没有看到一个足够相似的复制品 您不能在Java中实例化抽象类,而且数字是抽象的,所以为什么这一行要编译: Number num = 3; 若它是整数num,那个么它会自动装箱,但自动装箱在某种程度上也适用于数字,即使它是抽象的吗?还是发生了其他事情?Integer是Number的一个子类,因此3从int自动装箱到Integer,然后Integer存储在Number变量中。自动装箱对Number不起作用。您完全正确,Number类是抽象的,不能实例化。Java中也不存在将原语
Number num = 3;
若它是整数num,那个么它会自动装箱,但自动装箱在某种程度上也适用于数字,即使它是抽象的吗?还是发生了其他事情?
Integer
是Number
的一个子类,因此3
从int
自动装箱到Integer
,然后Integer
存储在Number
变量中。自动装箱对Number
不起作用。您完全正确,Number
类是抽象的,不能实例化。Java中也不存在将原语数字自动装箱到number
对象中的通用机制
自动装箱的工作范围是从int
到Integer
。文本3
是int
(没有例外)。而Integer
是Number
的一个具体子类,因此将Integer
的引用放入声明为Number
的变量中是没有问题的
我同意你的看法,这可能有点令人惊讶。自动装箱的基本规则是,可以将int
放在需要Integer
的位置,将double
放在需要double
的位置,以此类推。我们很难说初始化的右侧必然会出现整数。看来他们已经扩大了规则的适用范围。毫无疑问,它存在于JLS的某个地方(JLS:Java语言规范)
为了便于检查,我们可以:
Number num = 3;
System.out.println(num.getClass());
输出:
类java.lang.Integer
您可以进一步扩展该规则:
Object obj = 3;
它仍然提供一个整数
(而不仅仅是对象
,即使对象
是一个具体的类)
链接:类似问题:(您也可以在那里找到JLS的参考资料)谢谢您的回答。我怀疑类似的事情正在发生,但需要确认。我选择了另一个答案,因为它详细了一点,两个答案几乎同时出现,但我想说声谢谢