Java 如果类号是抽象的,为什么我';我可以写n=5的数字吗?

Java 如果类号是抽象的,为什么我';我可以写n=5的数字吗?,java,numbers,wrapper,Java,Numbers,Wrapper,Number n=new Number(5)是非法的,但是Number n=5不是。为什么?因为自动装箱5不是一个对象,所以它被包装成一个对象(Integer,在本例中,Integer是一个数字,从根本上说,这是因为Number是一个抽象类,没有对应于Number(5)的构造函数,即使有,你仍然不能直接实例化这个类,因为它是抽象的 正如Bombe所解释的,在第二种情况下,您实际上是在创建一个Integer对象*——它作为Number的子类,可以分配给这样一个变量。因为它是一个具体的类,所以可以实

Number n=new Number(5)
是非法的,但是
Number n=5
不是。为什么?

因为自动装箱
5
不是一个对象,所以它被包装成一个对象(
Integer
,在本例中,
Integer
是一个
数字
,从根本上说,这是因为
Number
是一个抽象类,没有对应于
Number(5)
的构造函数,即使有,你仍然不能直接实例化这个类,因为它是抽象的

正如Bombe所解释的,在第二种情况下,您实际上是在创建一个
Integer
对象*——它作为
Number
的子类,可以分配给这样一个变量。因为它是一个具体的类,所以可以实例化它


*尽管在实践中,它实际上更等同于
Integer.valueOf(5)
,它在Sun JREs上不会创建额外的Integer对象,但会使用一个合并版本(如Flyweight模式)。

不应该这样。自动装箱是一个很大的错误。

它类似于下面的工作方式:

List bob = new ArrayList();
列表是一个接口,所以不能直接实例化它。但是,您可以声明List类型的变量,然后为其指定一个实现该接口的具体对象。同样,您可以声明一个Number类型的变量,然后将该类型的具体实例中的任何值对象赋给它。出于所有目的,您对功能代码所做的是(由于自动装箱):


要亲自验证这一点,只需添加System.out.println(n.getClass().getName());问题主要是关于抽象类。不,问题是关于“如果
Number
是抽象的,那么
Number n=5;
是如何工作的?”请参见上文了解其工作原理:为什么它必须是一个静态类?+1你的答案比Bombe的要好得多,他在回答中甚至没有使用抽象这个词,这就是问题所在about@Carlos-我指的是具体类,而不是静态类;我已经纠正了这个错误(“thinko”?),谢谢你指出。好了,静态类本身是不存在的(忽略静态内部类,这是一个独立的东西)。我不同意。int是错误的。语言会更简单,所有东西都被定义为整数(或Long或Number的任何子类),然后让编译器将其优化为int(或任何原语)。当然,它必须以合理的方式处理==。
Number n = new Integer(5);