为什么这个数字类赋值有效(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中也不存在将原语

我找了一个复制品,但没有看到一个足够相似的复制品

您不能在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的参考资料)

谢谢您的回答。我怀疑类似的事情正在发生,但需要确认。我选择了另一个答案,因为它详细了一点,两个答案几乎同时出现,但我想说声谢谢