为什么这个Number类分配起作用(java)?

问题描述 投票:1回答:2

我正在寻找一个副本,但是没有看到一个副本足以满足要求。

您无法在Java中实例化抽象类,并且Number是抽象的,所以为什么要编译此行:

Number num = 3;

如果它是Integer num,它将自动装箱,但是即使它是抽象的,自动装箱也能以某种方式为Number工作吗?还是正在发生其他事情?

java numbers abstract-class autoboxing
2个回答
0
投票

不是自动装箱适用于Number。您完全正确,Number类是抽象的,无法实例化。 Java中也没有将原始数字自动装箱到Number对象中的通用机制。

这是自动装箱从intInteger的过程。文字3int(无例外)。并且IntegerNumber的具体子类,因此将对Integer的引用放入声明为Number的变量中是没有麻烦的。

我同意你的想法,这可能有点令人惊讶。自动装箱的基本规则是,可以将int放在期望的Integer处,将double放在期望的Double处,依此类推。我们很难说在初始化的右侧必定会出现Integer。看来他们已经扩展了该规则以适用于此。毫无疑问,在JLS的某个地方(JLS:Java语言规范)。

仅供检查,我们可以这样做:

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

输出:

class java.lang.Integer

您可以将规则进一步扩展:

    Object obj = 3;

它仍然会为您提供Integer(即使Object是一个具体的类,也不只是Object

Link:相似的问题:Does Java autobox when assigning an int to an Object?(您还将在此处找到对JLS的引用)


2
投票

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

© www.soinside.com 2019 - 2024. All rights reserved.