在java中编译 Integer a =3,不会报错,对象a是如何初始化的?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了在java中编译 Integer a =3,不会报错,对象a是如何初始化的?相关的知识,希望对你有一定的参考价值。

就如 String a = "abc" 一样,为什么一个类可以这么初始化?

参考技术A Integer a =3;
这是Java 5引入的自动装箱autoboxing。等价与之前版本的
Integer a =new Integer(3);
以及
int b=a; //自动拆箱
不同与String a = "abc" ,字符这个是属于专用的语法糖。追问

我能看到相应的代码不?

追答

什么相应的代码?

追问

就是你所说的自动拆箱的编码啊

追答

Integer a =3;////自动装箱
int b=a; //自动拆箱

追问

你在Integer a = 3时,考虑到Integer是一个类,我们初始化一个类,要么使用New方法,要么get方法返回一个类的对象,没有对Integer 变量 = 某一个int值的定义..你所说的拆箱和装箱最开始又是从何而来。
我先同意你的观点,是自动装箱和自动拆箱..关键是3是如何装上去的,什么时候装上去的,Integer有缓存机制?

追答

首回帖已经回答了,你不看吗

你说"【没有】对Integer 变量 = 某一个int值的定义.."

我首贴就说“有”,是java 5/JDK1.5 新定义的语法。你凭什么说没有。

对于语言学习使用者,Java语言规范上定义了,就按规范写的理解。

Integer a =3;

被编译器自动翻译成

Integer a =Integer.valueOf(3) ;和Integer a =new Integer(3);是等价的

字节码是

    0  iconst_3
    1  invokestatic java.lang.Integer.valueOf(int) : java.lang.Integer [19]

int b=a; //自动拆箱会被编译成int b=a.intValue();

字节码

   6  invokevirtual java.lang.Integer.intValue() : int [25]
   9  istore_2 [b]

本回答被提问者和网友采纳
参考技术B 因为String 本身就是一个对象 参考技术C 自动装箱和自动拆箱机制,自动装箱打把基本数据类型装箱为基本数据类型的封装类的对象,自动拆箱把封装类的对象自动拆箱为基本数据类型。

以上是关于在java中编译 Integer a =3,不会报错,对象a是如何初始化的?的主要内容,如果未能解决你的问题,请参考以下文章

mybatis查询的字段类型因为冲突报错is outside of valid range for type java.lang.Integer

wenet编译报Do not know how to define a 32-bit integer quantity on your system

wenet编译报Do not know how to define a 32-bit integer quantity on your system

java mybatis insert的时候Integer的类型是空值

java el表达式报空指针异常(nullpointexception)

java中整数的常量优化机制