Java Integer.class vs int.class
Java Integer.class vs int.class,java,reflection,primitive,Java,Reflection,Primitive,Integer.class、Integer.TYPE和int.class之间有什么区别 根据我 Integer.class是Integer(包装器)类对象的引用 但是什么是int.class,因为int不是一个类,而是一个基本类型。Integer.TYPE指的是什么 简而言之: int-->是用于简单数学运算的基元。您不能添加它们 收藏 整数-->本身就是对象。。是int的包装。即, 它们可以与集合一起使用(因为它们是对象)。他们是 由GC作为普通对象收集 编辑: public static v
Integer.class
、Integer.TYPE
和int.class
之间有什么区别
根据我
Integer.class
是Integer(包装器)类对象的引用int.class
,因为int
不是一个类,而是一个基本类型。Integer.TYPE
指的是什么public static void main(String[] args) {
int i = 5;
System.out.println(int.class);
Integer i1 = new Integer(5);
System.out.println(Integer.TYPE);
}
O/P : int
int
因此,基本上,两者都返回int.Integer.TYPE,只返回Integer类的基元类型。对于任何包装类来说都是如此,Java通过为每个原语定义两种类型,以一种分裂的方式处理原语类型和类类型 例如,
int
是基元类型,Integer
是类类型。使用泛型时,您必须使用非基元类型,因此允许使用ArrayList
,但不允许使用ArrayList
由于有时需要执行反射,这种二元性导致两个类(否则如何检查方法publicintfoo();
)
假设你有一门课:
public class Foo {
private Integer value;
public int value1 () {
return value;
}
public Integer value2 () {
return value;
}
}
这两个方法并不总是返回相同的值,因为
value2()
可以返回null
,value1()
将抛出运行时错误。Integer.class
正如您所说,是对Integer
类型的类
对象的引用
int.class
是对int
类型的class
对象的引用。你说得对,这听起来不对;这些原语都有一个类
对象作为特例。如果您想区分foo(整数值)
和foo(int-value)
之间的差异,它对于反射非常有用
Integer.TYPE
(注意,不是Integer.TYPE
)只是int.class
的快捷方式
您可以通过一个简单的程序了解这一点:
public class IntClasses {
public static void main(String[] args) {
Class<Integer> a = int.class;
Class<Integer> b = Integer.TYPE;
Class<Integer> c = Integer.class;
System.out.println(System.identityHashCode(a));
System.out.println(System.identityHashCode(b));
System.out.println(System.identityHashCode(c));
}
}
来自
java.lang.Class.isPrimitive
API
有九个预定义的类对象来表示八种基本类型和void。它们是由Java虚拟机创建的,与它们所表示的基本类型具有相同的名称,即boolean、byte、char、short、int、long、float和double
这些对象只能通过以下公共静态最终变量
java.lang.Boolean.TYPE
,java.lang.Integer.TYPE
等来访问。对我来说,理解int.class
和Integer.class
最简单的方法是停止思考Integer
是包装器(这意味着它是事实上,把int看作一个特例更容易,也可能更合适
Integer只是一个普通的Java类,与String没有什么不同。它派生自对象
,操作类似于对象
,在运行时您可以创建Integer
的实例,该实例采用类似对象的内存布局,例如,在开始处有一个指针指向Integer.class
,即是什么使java具有多态运行时行为
关于Integer
,实际上还没有什么特别之处。如果你想象一个Java没有boolean,int,long这些原语,但只有Integer,boolean,long等,那么类型系统实际上是非常一致的
从概念上讲,您可以将int
视为一个特殊的类,稍后出于性能原因引入。最初,它与整数无关。在创建Java时,为纯数字维护一个类似对象的内存布局对于算术重的程序来说是非常昂贵的。而且大多数算术操作这种方法甚至根本不涉及多态动态调度。例如,调用诸如toString之类的方法来处理一个数字就不那么常见了
int是一个特殊的类,它的“实例”被放在内存中,公共对象结构被剥离——只有四个连续的字节,没有额外的元数据
因此,您无法执行123.getClass()
,因为int 123的运行时内存布局没有类指针。int.class
确实存在,但它与Integer.class
完全无关(尚未)。从某种意义上说,int更类似于Void,因为Void.class确实存在,但在对象o中,o.class==Void.class
Java可以在这里解决,int是int,Integer是Integer。但人们意识到,尽管不太常见,但将int视为普通Java对象仍然非常有用,否则您将始终必须至少维护两组方法—一组采用普通对象,另一组采用基本体—即使如此性能与您无关。在这些场景中,int的行为实际上类似于Integer。Java允许通过自动装箱过程自动进行这种转换,从而有效地将int和Integer关联起来
但是int仍然是int,Integer仍然是Integer(例如,int.class!=Integer.class
)但是Integer.class中引入了一个额外的字段来表示它与int.class相关,即Integer.TYPE
。因此Integer.TYPE==int.class
对我来说Integer。TYPE
只是捕捉Integer和int相关的概念。如何使用它,或者它是否有用,取决于你
在实践中,int和Integer仍然是独立的类型。例如:
void accept (int value);
void accept (Integer value);
仍然被认为是两个重载。因此,在处理反射时,可以使用int.class和Integer。
void accept (int value);
void accept (Integer value);
int value = 1;
Class c = ((Object)value).getClass();
int value = getValue("key", Integer.class); // will potentially throw NPE
int value = getValue("key", int.class); // will never throw NPE