我总是怀疑JVA包类与值类型之间的关系。 本文以int和Integer为例探讨它们之间的关系
java值类型有intshortcharbooleanbytelongfloatdouble
其他类型都是参照型参照型和值型的不同,大家都很熟悉,所以在这里就不多说了
引用类型和值类型之间的一个重要区别在于引用类型继承了Object类的值类型
在java的许多通用容器中,类型继承Object调用的虚拟方法要求必须是引用类型,这些值类型是否明显不能满足此要求? 包装类应运而生
integershortcharbooleanbytelongfloatdouble和上述值类型对应于包类
既然包类是引用类型,他应该可以通过其他方法进行修改
公共声明更改(integera ) )。
{
*=6;
} publicstaticvoidmain (string [ ] args ) ) )。
{
integerinteger=newinteger(5;
change (整数;
system.out.println(integer;
() ) ) ) )。
但是,上述程序的输出结果5和以下代码的结果相同。 为什么?
公共语音更改(inta ) )。
{
*=6;
} publicstaticvoidmain (string [ ] args ) {int integer=5;
change (整数;
system.out.println(integer;
() ) ) ) )。
从包装类的设计来看,这一点我们已经说过了,包装类是为了弥补值类型的缺点而设计的
如果有包类,整数的表示形式会出现int和Integer两种类型。 一个是值类型,另一个是引用类型。 程序员在使用过程中会遇到麻烦
为了消除这些烦恼,java的设计将差异降至最低,并通过将包类表示为值类型来获得以上结果
这种差异的减少是由编译器完成的。 通过查看编译的字节码,您可以看到上面提到的Integer实际上是这样工作的
公共声明更改(integera ) )。
{
a=integer.valueof(a.intvalue () * 6);
} publicstaticvoidmain (string [ ] args ) ) )。
{
integerinteger=newinteger(5;
change (整数;
system.out.println(integer;
() ) ) ) )。
a=6的结果返回了新的Integer对象
因此,不能更改传递的Integer的值。 必须更改名为Integer的类的成员是final限定的还是不能更改的
而且还发现了一点Object被强制转换为int
objectobj=newinteger(5; inta=(int ) obj;
编译器处理后,实际上就是这样。 这表明引用类型和值类型完全属于两个世界
objectobj=newinteger(5; inta=(integer ) obj ).intValue );
题外话:
我非常不喜欢java的值类型和包类的设计
在java中,对象值类型全部除外
我觉得没有必要将同一整数类型分为int Interger两种类型
c#的int继承了Object,如果需要调用虚函数,它会自动装箱
int a=233;
a.ToString ()。
在jvm中奔跑的Kotlin具有特殊的映射定律,可以根据情况自动将Int转换为Int和Integer,但在语言级别上只有一个Int
Int a=233;
a.toString (;
但是到了java就只能这样了
int a=233; newinteger(a ).toString );
或者说是
int a=233;
(Integer ) a ).toString );
结束