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
    指的是什么
  • 简而言之:

    int-->是用于简单数学运算的基元。您不能添加它们 收藏

    整数-->本身就是对象。。是int的包装。即, 它们可以与集合一起使用(因为它们是对象)。他们是 由GC作为普通对象收集

    编辑:

    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