为什么这个 Number class 赋值有效 (java)?

Why does this Number class assignment work (java)?

我寻找了这个副本,但没有找到足够相似的副本来满足。

你不能在Java中实例化抽象类,而Number是抽象的,那么为什么这一行编译:

Number num = 3;

如果它是 Integer num,它会被自动装箱,但是自动装箱是否也适用于 Number,即使它是抽象的?还是发生了其他事情?

IntegerNumber 的子类,因此 3int 自动装箱到 Integer,然后存储 IntegerNumber 变量中。

并不是自动装箱适用于 Number。您完全正确,Number class 是抽象的,无法实例化。 Java.

中也不存在将原始数字自动装箱为 Number 对象的通用机制

自动装箱从 intInteger。文字 3int(无一例外)。 IntegerNumber 的具体子 class,因此将对 Integer 的引用放入声明为 Number 的变量中是没有问题的。

它的工作原理可能有点令人惊讶,我同意你的看法。自动装箱的基本规则是您可以在需要 Integer 的地方放置 int,在需要 Double 的地方放置 double,等等。我们很难说 Integer 一定会出现在初始化的右侧。无论如何,他们似乎已经将规则扩展到此处适用。毫无疑问,在 JLS 的某个地方(JLS: Java Language Specification)。

只是为了检查我们可能会做:

    Number num = 3;
    System.out.println(num.getClass());

输出:

class java.lang.Integer

您可以进一步扩展规则:

    Object obj = 3;

它仍然给你一个 Integer(不只是一个 Object,尽管 Object 是一个具体的 class)。

Link: 类似问题:Does Java autobox when assigning an int to an Object?(您还会在那里找到对 JLS 的引用)