我是靠谱客的博主 长情指甲油,最近开发中收集的这篇文章主要介绍java中包装类与引用类型_java包装类和值类型的关系,觉得挺不错的,现在分享给大家,希望可以做个参考。

概述

java包装类总是让人疑惑 它与值类型到底是怎么样一种关系? 本文将以int和Integer为例来探讨它们的关系

java值类型有int short char boolean byte long float double

除此之外的类型皆为引用类型 引用类型和值类型的区别大家都很熟悉 在这里就不多说了

引用类型和值类型有一个很重要的区别 那就是引用类型继承Object类 值类型不是

而java很多泛型容器都要求类型继承Object 调用虚方法要求必须是引用类型 很明显这些值类型不满足这个要求 怎么办? 包装类应运而生

包装类有Integer Short Char Boolean Byte Long Float Double和上文的值类型是对应的

既然包装类是引用类型 那么他就应该可以传递到别的方法被修改

public static voidchange(Integer a)

{

a*= 6;

}public static voidmain(String[] args)

{

Integer integer= new Integer(5);

change(integer);

System.out.println(integer);

}

然而 以上程序输出的结果是5 跟下文代码的结果是相同的 这是为什么?

public static void change(inta)

{

a*= 6;

}public static voidmain(String[] args) {int integer = 5;

change(integer);

System.out.println(integer);

}

这就得从包装类的设计讲起了 前文说过 包装类是为了能够弥补值类型的缺陷而设计的

有了包装类后 对于一个整数的表达就出现了int和Integer这两个类型 一个是值类型一个是引用类型 这会让程序员在使用过程中产生困扰

为了消除这种困扰 java在设计时就尽可能地减少它们的区别 让包装类表现得如同值类型 于是就出现了上文的结果

这种区别减少是通过编译器完成 如果我们查看编译好的字节码 就会看到上文的Integer其实是这样工作的

public static voidchange(Integer a)

{

a= Integer.valueOf(a.intValue() * 6);

}public static voidmain(String[] args)

{

Integer integer= new Integer(5);

change(integer);

System.out.println(integer);

}

a*=6的结果返回了一个新的Integer对象

所以也就不可能修改传入的Integer的值了 就算要修改   Integer这个类的成员是final修饰 还是无法修改

然后我还发现了一点Object强制转换为int

Object obj = new Integer(5);int a = (int)obj;

在编译器处理后 其实是这样的 这也进一步说明引用类型和值类型完全是两个世界的东西

Object obj = new Integer(5);int a = ((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;new Integer(a).toString();

或者是这样

int a = 233;

((Integer)a).toString();

END

最后

以上就是长情指甲油为你收集整理的java中包装类与引用类型_java包装类和值类型的关系的全部内容,希望文章能够帮你解决java中包装类与引用类型_java包装类和值类型的关系所遇到的程序开发问题。

如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。

本图文内容来源于网友提供,作为学习参考使用,或来自网络收集整理,版权属于原作者所有。
点赞(50)

评论列表共有 0 条评论

立即
投稿
返回
顶部