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 void change(Integer a)
{
a *= 6;
}
public static void main(String[] args)
{
Integer integer = new Integer(5);
change(integer);
System.out.println(integer);
}
然而 以上程序输出的结果是5 跟下文代码的结果是相同的 这是为什么?
public static void change(int a)
{
a *= 6;
}
public static void main(String[] args) {
int integer = 5;
change(integer);
System.out.println(integer);
}
这就得从包装类的设计讲起了 前文说过 包装类是为了能够弥补值类型的缺陷而设计的
有了包装类后 对于一个整数的表达就出现了int和Integer这两个类型 一个是值类型一个是引用类型 这会让程序员在使用过程中产生困扰
为了消除这种困扰 java在设计时就尽可能地减少它们的区别 让包装类表现得如同值类型 于是就出现了上文的结果
这种区别减少是通过编译器完成 如果我们查看编译好的字节码 就会看到上文的Integer其实是这样工作的
public static void change(Integer a)
{
a = Integer.valueOf(a.intValue() * 6);
}
public static void main(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 = ;
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包装类介绍与类型之间相互转换
1.包装类存在的意义 通俗解释就是由于Java是面对对象的语言,而基本类型不具有面对对象的概念,为了弥补不足,引入了包装类方便使用面对对象的变成思想操作基本类型. 2.基本类型和包装类对应关系 byt ...
- java和c#值类型和引用类型
java数据类型分为基本数据类型和引用类型 基本数据类型:int float double bool char byte 引用数据类型:string array class interfa ...
- 【转】Java 有值类型吗?
Java 有值类型吗? 有人看了我之前的文章『Swift 语言的设计错误』,问我:“你说 Java 只有引用类型(reference type),但是根据 Java 的官方文档,Java 也有值类型( ...
- java中值类型与引用类型的关系
值类型:就是java的基本类型.byte.short.int.long.float.char.double.boolean 引用类型:类(class).接口(Interface).数组(Array) ...
- [原创]java WEB学习笔记81:Hibernate学习之路--- 对象关系映射文件(.hbm.xml):hibernate-mapping 节点,class节点,id节点(主键生成策略),property节点,在hibernate 中 java类型 与sql类型之间的对应关系,Java 时间和日期类型的映射,Java 大对象类型 的 映射 (了解),映射组成关系
本博客的目的:①总结自己的学习过程,相当于学习笔记 ②将自己的经验分享给大家,相互学习,互相交流,不可商用 内容难免出现问题,欢迎指正,交流,探讨,可以留言,也可以通过以下方式联系. 本人互联网技术爱 ...
- 学习记录 java 值类型和引用类型的知识
1. Java中值类型和引用类型的不同? [定义] 引用类型表示你操作的数据是同一个,也就是说当你传一个参数给另一个方法时,你在另一个方法中改变这个变量的值, 那么调用这个方法是传入的变量的值也将改变 ...
- 第47节:Java当中的基本类型包装类
Java当中的基本类型包装类 01 基本数据类型对象的包装类 什么是基本数据类型对象包装类呢?就是把基本数据类型封装成对象,这样就可以提供更多的操作基本数值的功能了. 基本数据类型对象的包装类8个: ...
- Java中包装类型和基本类型的使用场景(什么时候使用包装类型)(转)
说明:最简单的理解,基本类型有默认值,而包装类型初始为null.然后再根据这两个特性进行分业务使用,在阿里巴巴的规范里所有的POJO类必须使用包装类型,而在本地变量推荐使用基本类型. Java语言提供 ...
- JAVA是否允许返回值类型不同的重载overload或覆盖override
在看<Thinking in java>的时候,看到子类的方法和父类的方法名字相同,但是返回值类型不同,然后就开始怀疑这属于覆盖吗,到网上找到了答案,分析见接下来的网址: http://g ...
随机推荐
- 服务器学习--Linux、CentOS下安装zip与unzip指令
Linux下安装zip解压功能 Linux服务器上一般默认没是没有有安装zip命令 安装zip指令 apt-get install zip 或 yum install zip 输入zip OK li ...
- Axel多线程工具安装
Axel 是 Linux 下一个不错的轻量级高速下载工具,支持HTTP/FTP/HTTPS/FTPS协议,支持多线程下载.断点续传,且可以从多个地址或者从一个地址的多个连接来下载同一个文件. 大家使用 ...
- python 类 专有方法
__init__ : 构造函数,在生成对象时调用 __del__ : 析构函数,释放对象时使用 __repr__ : 打印,转换 __setitem__ : 按照索引赋值 __getitem__: 按 ...
- Excel 日期和时间函数
1.TODAY和NOW函数 today和now函数 日期可以进行加减运算 2.提取日期和时间的函数 公式=Year() 公式=month() 公式=day() 公式=hour() 公式=minute( ...
- Win10提示 该文件没有与之关联的程序来执行操作
在Win10 2018年更新系统中,如果你手动删除注册表里的快捷箭头注册项,就会打开固定到底部任务栏的应用就会报错,要想恢复正常,先手动恢复原来删除的注册表项. 注册表位置:HKEY_CLASSES_ ...
- 开源推荐 - CoDo开源一站式DevOps平台
一群有梦想的年轻人开源了一个云管理平台,他们的口号是:让天下没有996的运维 有幸参与到CoDo项目的开发,这是一个非常棒的一站式开源运维平台,分享给大家 平台介绍 CODO是一款为用户提供企业多混合 ...
- Deepin (Linux Debian)使用日记
(现在Deepin使用了debian的stable源,如果求新,推荐使用排行榜前三的Linux发行版——> Manjaro) 修复开启混合显卡驱动后,屏幕泛白偏灰问题“: https://blo ...
- Via板载声卡底噪严重、播放卡顿及耳机与扬声器音源切换问题【解决方法】
HD VDeck[VIA威盛HD audio系列音频驱动] 关闭音效增强之后,一切正常............ 默默骂一句VIA沙雕 另外附上:开启耳机和扬声器独立音源的设置 注册表 Computer ...
- 运行带参数的python脚本
问题描述: 要执行python脚本,有哪几种方法. 特别是看书的时候,书上只讲解了如何在linux下运行,windows根本就没有那些命令,该怎么办呢? 方法1:python自带的IDLE编辑器 Ru ...
- Kelp.Net是一个用c#编写的深度学习库
Kelp.Net是一个用c#编写的深度学习库 基于C#的机器学习--c# .NET中直观的深度学习 在本章中,将会学到: l 如何使用Kelp.Net来执行自己的测试 l 如何编写测试 l ...