java装箱和拆箱_java自动装箱和拆箱

这个是jdk1.5以后才引入的新的内容,作为秉承发表是最好的记忆,毅然决定还是用一篇博客来代替我的记忆:

java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装箱,解包装称为拆箱);

其实按照我自己的理解自动装箱就可以简单的理解为将基本数据类型封装为对象类型,来符合java的面向对象;例如用int来举例:

//声明一个Integer对象

Integer num = 10;

//以上的声明就是用到了自动的装箱:解析为

Integer num = new Integer(10);以上就是一个很好的体现,因为10是属于基本数据类型的,原则上它是不能直接赋值给一个对象Integer的,但jdk1.5后你就可以进行这样的声明,这就是自动装箱的魅力

自动将基本数据类型转化为对应的封装类型。成为一个对象以后就可以调用对象所声明的所有的方法

自动拆箱:故名思议就是将对象重新转化为基本数据类型:

//装箱

Integer num = 10;

//拆箱

int num1 = num;自动拆箱有个很典型的用法就是在进行运算的时候:因为对象时不恩直接进行运算的,而是要转化为基本数据类型后才能进行加减乘除

Integer num = 10;

//进行计算时隐含的有自动拆箱

System.out.print(num--);哈哈 应该感觉很简单吧,下面我再来讲点稍微难点的,

//在-128~127 之外的数

Integer num1 = 297; Integer num2 = 297;

System.out.println("num1==num2: "+(num1==num2));

// 在-128~127 之内的数

Integer num3 = 97; Integer num4 = 97;

System.out.println("num3==num4: "+(num3==num4)); 打印的结果是:num1==num2: false num3==num4: true

很奇怪吧:这就归结于java对于Integer与int的自动装箱与拆箱的设计,是一种模式:叫享元模式(flyweight)

为了加大对简单数字的重利用,java定义:在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,始终只存在一个对象

而如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个 Integer对象;明白了吧

以上的现象是由于使用了自动装箱所引起的,如果你没有使用自动装箱,而是跟一般类一样,用new来进行实例化,就会每次new就都一个新的对象;

这个的自动装箱拆箱不仅在基本数据类型中有应用,在String类中也有应用,比如我们经常声明一个String对象时:

String str = "sl";

//代替下面的声明方式

String str = new String("sl");

基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。虽然为您打包基本数据类型提供了方便,但提供方便的同时表示隐藏了细节,建议在能够区分基本数据类型与对象的差别时再使用。

autoboxing和unboxing

在Java中,所有要处理的东西几乎都是对象 (Object),例如之前所使用的Scanner是对象,字符串(String)也是对象,之后还会看到更多的对象。然而基本(Primitive)数据类型不是对象,也就是您使用int、double、boolean等定义的变量,以及您在中直接写下的字面常量。

在前一个小节中已经大致看到了操作对象的方便性,而使用Java有一段时间的人都知道,有时需要将基本数据类型转换为对象。例如使用Map对象要put()方法时,需要传入的参数是对象而不是基本数据类型。

要使用打包类型(Wrapper Types)才能将基本数据类型包装为对象,前一个小节中您已经知道在J2SE 5.0之前,要使用以下语句才能将int包装为一个Integer对象:Integer integer = new Integer(10);

在 J2SE 5.0之后提供了自动装箱的功能,您可以直接使用以下语句来打包基本数据类型:Integer integer = 10;

在进行编译时,编译器再自动根据您写下的语句,判断是否进行自动装箱动作。在上例中integer参考的会是Integer类的实例。同样的动作可以适用于 boolean、byte、short、char、long、float、double等基本数据类型,分别会使用对应的打包类型(Wrapper Types)Boolean、Byte、Short、Character、Long、Float或Double。下面直接使用自动装箱功能来改写范例 4.4。

范例4.5 AutoBoxDemo.java

public class AutoBoxDemo {

public static void main(String[] args) {

Integer data1 = 10;

Integer data2 = 20;

// 转为double值再除以3

System.out.println(data1.doubleValue() / 3);

// 进行两个值的比较

System.out.println(data1.compareTo(data2));

}

}

程序看来简洁了许多,data1与data2在运行时就是Integer的实例,可以直接进行对象操作。的结果如下:

3.3333333333333335

–1

自动装箱运用的方法还可以如下:

int i = 10;

Integer integer = i;

也可以使用更一般化的java.lang.Number类来自动装箱。例如:

Number number = 3.14f;

3.14f会先被自动装箱为Float,然后指定给number。

从J2SE 5.0开始可以自动装箱,也可以自动拆箱(unboxing),也就是将对象中的基本数据形态信息从对象中自动取出。例如下面这样写是可以的:

复制代码代码如下:

Integer fooInteger = 10;

int fooPrimitive = fooInteger;

fooInteger引用至自动装箱为Integer的实例后,如果被指定给一个int类型的变量fooPrimitive,则会自动变为int类型再指定给fooPrimitive。在运算时,也可以进行自动装箱与拆箱。例如:

复制代码代码如下:

Integer i = 10;

System.out.println(i + 10);

System.out.println(i++);

上例中会显示20与10,编译器会自动进行自动装箱与拆箱,也就是10会先被装箱,然后在i + 10时会先拆箱,进行加法运算;i++该行也是先拆箱再进行递增运算。再来看一个例子:

复制代码代码如下:

Boolean boo = true;

System.out.println(boo && false);

同样的boo原来是Boolean的实例,在进行AND运算时,会先将boo拆箱,再与false进行AND运算,结果会显示false。

//

装箱:从基本类型转换成Object类型,称之为装箱;***拆箱:从Object转换乘基本类型的操作,称之为拆箱。 这个操作在反射过程中用的比较的多。

装箱:在堆中建立一个Object实例,把你指定的值复制进去;***拆箱:判别引用指向的堆中信息是否是要拆成的类型,是取出堆中值送给栈中变量,否则报异常

///

装箱是值类型到object类型或到该值类型所实现的任何接口类型的隐士转换。

将一个值类型装箱会分配一个对象实例并将该值复制到新的对象中。

int i=123;

object o=i;

这句话的结果是在堆栈上创建一个对象o,而该对象在堆上引用int类型的值。该值是赋值给变量i

的值类型值的一个副本。

下面是显示执行装箱转换

复制代码代码如下:

int i=123;

ojbect o=(object)i;

此例将整数变量i通过装箱转换为对象o。这样,存储在变量i中的值就从123改为456。此例显示对象保留了内容的原始副本。即123。

取消装箱是从object类型到值类型或从接口类型到实现该接口的值类型的显示转换。取消装箱操作包括:

检查对象实例,确保它是给定值类型的一个装箱值。

将该值从实例复制到值类型变量中。

例子:

int i=123;

object box=i;

int j=(int)box;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/429080.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

java 插桩 工具_一个基于Eclipse的通用Java程序插桩工具.pdf

第38卷第7期 计算机科学 V01.38NO.7Science 20112011年7月 Computer July一个基于Eclipse的通用Java程序插桩工具郑晓梅(南京中医药大学信息技术学院 南京210046)(南京大学计算机软件新技术国家重点实验室 南京210093)摘要插桩技术作为一种有效理解程序动…

【FICO 汇率】汇率

汇率存储的表位TCURR 汇率维护的事务代码为:OB08 每一种货币汇率都有很多版本,按照时间有效性管理 汇率涉及的两种货币,第一个为从,第二个为到,一般换算比率都是1,但也有不是1的情况(主要是换算…

java 新窗口跳转页面_Java web开发中页面跳转小技巧——跳转后新页面在新窗口打开...

最近学习Java web,在学习过程中想实现一个需求,就是在jsp页面跳转的时候,希望跳转后的新页面在新窗口中打开,而不是覆盖原来的页面,这个需求使我困惑了好长时间,后来通过大海捞针似的在网上寻找方法&#x…

分辨率到底是个什么概念?它和DPI之间是什么关系?

"分辨率"到底是个什么概念?它和DPI之间是什么关系? 分辨率:显示分辨率(屏幕分辨率)是屏幕图像的精密度,是指显示器所能显示的像素有多少。由于屏幕上的点、线和面都是由像素组成的,显…

mysql.w002_mysql简单例子

登陆数据库:mysql -u用户名 -p密码 -P端口 -h数据库地址‍‍‍‍‍‍修改mysql提示符:(仅本次连接有效)‍‍‍‍‍‍方法一:执行mysql -uroot -proot -prompt \h结果为:localhost方法二:进入mysql后,执行PR…

mysqli mysql的区别_phpmysqli和mysql区别详解

本文介绍下,php中有关mysqli与mysql类的一些区别,有需要的朋友,可以作个参考哦。一,PHP-MySQL 是 PHP 操作 MySQL 资料库最原始的 Extension ,PHP-MySQLi 的 i 代表 Improvement ,提更了相对进阶的功能。PD…

JQuery中的Deferred-详解和使用

首先,为什么要使用Deferred? 先来看一段AJAX的代码: 1 var data; 2 $.get(api/data, function(resp) { 3 data resp.data; 4 }); 5 doSomethingFancyWithData(data); View Code 这段代码极容易出问题,请…

ps aux grep java_linux命令ps-aux监控java进程

linux下用ps -aux可以监控java的进程情况。linux根据内核的不同对每个进程分配的最大使用内存不同,如果是32位机器,cpu最大的寻址空间是2的32次方,4G,但内核分配给每个进程最大的内存肯定是小于4G,经过重新编译的内核分…

【Eclipse】eclipse在线安装反编译插件

1.help->install new software 2.Add Name:jd-eclipse_update_site Location:http://jd.benow.ca/jd-eclipse/update 3.等待加载出来 4.持续点击下一步,直到完成。 转载于:https://www.cnblogs.com/flydkPocketMagic/p/7170283.html

java一维数组存入_java一维数组

1.通过数组名进行赋值,其实质是引用比如数组array1和数组array2若执行array2array1,实际上将array1的引用传递给array2,array1和array2 最后都指向同一个数组,array2原来引用的数组被回收。例如:int [] array1{1,2,3};…

Spring Boot 系列(一)快速入门

简介 Spring Boot是由Pivotal团队提供的全新框架,其设计目的是用来简化新Spring应用的初始搭建以及开发过程。该框架使用了特定的方式来进行配置,从而使开发人员不再需要定义样板化的配置。通过这种方式,Spring Boot致力于在蓬勃发展的快速应…

python代码编码成jni_python 设置文件编码格式的实现方法

如果要在python2的py文件里面写中文,则必须要添加一行声明文件编码的注释,否则python2会默认使用ASCII编码。(python3已经没有这个问题了,python3默认的文件编码是UTF-8)必须将编码注释放在第一行或者第二行,一般来说,Python文件的…

Entity Framework context per request

原文发布时间为:2011-09-24 —— 来源于本人的百度文章 [由搬家工具导入]http://www.blog.cyberkinetx.com/2011/05/15/entity-framework-context-per-request/Are you still using the?1234using(DBContext context newDBContext()){ ..}way of accessing the d…

Java commit()_Java XAResource.commit方法代码示例

import javax.transaction.xa.XAResource; //导入方法依赖的package包/类public void testSuspendableTx() throws Exception {if (!versionMeetsMinimum(5, 0)) {return;}Connection conn1 null;MysqlXADataSource suspXaDs new MysqlXADataSource();suspXaDs.setUrl(BaseTe…

python如何优雅判断类型

http://note.youdao.com/noteshare?id6f3a7963efc57b5d0b1c712654d100c6转载于:https://www.cnblogs.com/taiyang-li/p/7190195.html

java网络io_彻底搞懂Java的网络IO

该楼层疑似违规已被系统折叠 隐藏此楼查看此楼java.io包基于流模型实现,提供File抽象、输入输出流等IO的功能。交互方式是同步、阻塞的方式,在读取输入流或者写入输出流时,在读、写动作完成之前,线程会一直阻塞。java.io包的好处是…

1. 在虚拟机中 添加内容

步骤: 1. 找到要添加的内容,按住 ctrl c 复制 ,例如:复制 飞秋 2. 打开 虚拟机,找到 要复制文件的位置。 3. 将 复制的文件添加到 共享文件夹下面。 4. 打开虚拟机,安装飞秋 5, 最后就完成了…

JavaScript设计模式-10.工厂模式实例xhr

1 <!DOCTYPE html>2 <html>3 <head>4 <meta charset"UTF-8">5 <title>Javascript高级语法10-工厂模式实例xhr</title>6 </head>7 <body>8 <script>9 //接口…

java web scala_spring boot+scala编写web接口

本人是Java开发者&#xff0c;有面向对象的基础&#xff0c;而Scala也是面向对象的语言&#xff0c;学习后可快速入门。通过学习Scala的面向对象(和java面向对象类似)、Scala的高级函数(map,reduce等&#xff0c;和Java8中的stream编程类似)、Scala的隐式转换(在Java中可通过sp…

java对象引用出错_上传图片错误:尝试在空对象引用上调用虚拟方法’java.lang.String android.net.Uri.getLastPathSegment()’...

我有“用相机捕获图像”的问题,并将其存储到Firebase中.我认为该代码是正确的,因为它可以与“从图库中选择图像”一起使用.捕获完图像后,该应用程序停止了,并且没有存储在数据库中.我认为这对于android M和N是个问题.我只是看到其他类似的问题,但它们对我不起作用.我为此寻求帮…