我们知道,所有对象型的数据类型的基类是java.lang.Object。而写java程序的时候非常多的工作都是在写这些类,和实现里面的方法。而偏偏就有那么8种基本类型和他们不一样。以至于让你来回在这两种之间转换,只是很让人头疼的事情。Java中的int , long , char这样的类型不是对象型。因此,java里提供了一种叫做包装类(wrapper)的东西,是基本类型,有着相应的对象类型Integer , Long , Character等。表1列出了java API中的包装器类:
基本类型 包装器类 构造函数变元
boolean Boolean boolean或String
byte Byte byte或String
char Character char
double Double double或String
float Float float、double或String
int Integer int或String
long Long long或String
short Short short或String
Java中的包装器类有两个主要的目的:
1.提供一种机制,将基本值“包装”到对象中,从而使基本值能够包含在为对象而保留的操作中,比如添加到Collections 中,或者从带对象返回值的方法中返回。注意,java5增加了自动装箱和拆箱,程序员过去需手工执行的许多包装操作,现在可以由java自动处理了。
2.为基本值提供分类功能。这些功能大多数于各种转换有关:在基本值和String 对象间相互转换,在基本值和String 对象之间按不同基数转换,如二进制、八进制和十六进制。
基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。虽然为您打包基本数据类型提供了方便,但提供方便的同时表示隐藏了细节,建议在能够区分基本数据类型与对象的差别时再使用。
看下面的例子:
public class Test1 {
public static void main(String[] args) {
//装箱
int i = 0;
Integer integer = i;//i这么一个基本类型的数,可以赋值给Integer型的变量
//简单的拆箱
int j = integer;//integer这种包装类型的数,也能赋值给j这个原始类型的变量
Integer counter = 1; //装箱
int counter2 = counter; //拆箱
while (counter < 100) {
System.out.println("计数 "+counter++); //看啊,counter这个对象型的数,还能自动增加
}
}
}
在幕后JVM已经自动执行了转换,同理Boolean和boolean之间也可以,自动拆箱装箱。但是,Integer和int毕竟还是有着不同的。
java 自动装箱与拆箱 中的陷阱
自动装箱与拆箱的功能事实上是编译器来帮您的忙,编译器在编译时期依您所编写的语法,决定是否进行装箱或拆箱动作。例如:
Integer i = 100;相当于编译器自动为您作以下的语法编译:
Integer i = new Integer(100);所以自动装箱与拆箱的功能是所谓的“编译器蜜糖”(Compiler Sugar),虽然使用这个功能很方便,但在程序运行阶段您得了解Java的语义。例如下面的程序是可以通过编译的:
Integer i = null;int j = i;这样的语法在编译时期是合法的,但是在运行时期会有错误,因为这种写法相当于:
Integer i = null;int j = i.intValue();null表示i没有参考至任何的对象实体,它可以合法地指定给对象参考名称。由于实际上i并没有参考至任何的对象,所以也就不可能操作intValue()方法,这样上面的写法在运行时会出现NullPointerException错误。
自动装箱、拆箱的功能提供了方便性,但隐藏了一些细节,所以必须小心。再来看范例4.6,您认为结果是什么呢?
Ü 范例4.6 AutoBoxDemo2.java
public class AutoBoxDemo2 {
public static void main(String[] args) {
Integer i1 = 100;
Integer i2 = 100;
if (i1 == i2)
System.out.println("i1 == i2");
else
System.out.println("i1 != i2");
}
}
从自动装箱与拆箱的机制来看,可能会觉得结果是显示i1 == i2,您是对的。那么范例4.7的这个程序,您觉得结果是什么?
Ü 范例4.7 AutoBoxDemo3.java
public class AutoBoxDemo3 {
public static void main(String[] args) {
Integer i1 = 200;
Integer i2 = 200;
if (i1 == i2)
System.out.println("i1 == i2");
else
System.out.println("i1 != i2");
}
}
结果是显示i1 != i2,这有些令人惊讶,两个范例语法完全一样,只不过改个数值而已,结果却相反。
其实这与==运算符的比较有关,在第3章中介绍过==是用来比较两个基本数据类型的变量值是否相等,事实上==也用于判断两个对象引用名称是否参考至同一个对象。
在自动装箱时对于值从–128到127之间的值,它们被装箱为Integer对象后,会存在内存中被重用,所以范例4.6中使用==进行比较时,i1 与 i2实际上参考至同一个对象。如果超过了从–128到127之间的值,被装箱后的Integer对象并不会被重用,即相当于每次装箱时都新建一个Integer对象,所以范例4.7使用==进行比较时,i1与i2参考的是不同的对象。
所以不要过分依赖自动装箱与拆箱,您还是必须知道基本数据类型与对象的差异。范例4.7最好还是依正规的方式来写,而不是依赖编译器蜜糖(Compiler Sugar)。例如范例4.7必须改写为范例4.8才是正确的。
Ü 范例4.8 AutoBoxDemo4.java
public class AutoBoxDemo4 {
public static void main(String[] args) {
Integer i1 = 200;
Integer i2 = 200;
if (i1.equals(i2))
System.out.println("i1 == i2");
else
System.out.println("i1 != i2");
}
}
结果这次是显示i1 == i2。使用这样的写法,相信也会比较放心一些,对于这些方便但隐藏细节的功能到底要不要用呢?基本上只有一个原则:如果您不确定就不要用。
包装器对象的几种最常见方法:
1. 构造函数
除了Character类之外,所有包装器类都提供两个构造函数:一个以要构建的基本类型作为变元,另一个以要构建类型的String表示作为变元。例如:
Integer i1 = new Integer(42);
Integer i2 = new Integer(“42”);
Character类只有一个构造函数,它以一个字符作为变元。例如:
Character c1 = new Character(‘c’);
2. valueOf()方法
多数包装器类都提供两个静态valueOf()方法,从而使我们能用另一种方法来创建包装器类对象。这两种方法都以适合基本类型的String 表示作为第一个变元,第二个方法带一个额外的变元int radix , 它表示第一个变元以什么基数(二进制、八进制或十六进制)。例如:
Integer i2 = Integer. valueOf(“101011”,2);
3. xxxValue()方法
当需要将被包装的数值转换为基本类型时,可使用几个xxxValue()方法之一。这一系列的方法都是无变元方法。一共有36个xxxValue()方法。6种数值包装器类中每一种都有6个方法,因此任何数值包装器都能够转换成任何基本数值类型。例如:
Integer i2 = new Integer(42);
byte b = i2.byteValue();
short s = i2.shortValue();
double d = i2.doubleValue();
4. parseXxx()和valueOf()方法
6种parseXxx()方法与在所有数值包装器类中存在的valueOf()方法紧密相关。parseXxx()和valueOf()方法都已String作变元,如果String变元形式不正确,则会抛出NumberFormatException(也称NFE)。如果底层基本类型是4种整数类型中的任何一种时,二者都能够以不同的基转换String对象。这两个方法的不同之处是:
parseXxx()方法返回所指定的基本类型。
valueOf()方法返回新创建的包装对象,对象的类型与调用该方法的类型相同。
5. toString()方法
Object类是java中开篇的类,它具有toString()方法。所有其他java类都继承自Object类,而且所有其他java类都有toString()方法。toString()方法的想法是使你能够获得指定对象的有意义表示。例如,如果有一个各种类型对象的Collection,则可以遍历该Collection,使用每个类中都具备的toString()方法输出每个的有意义表示。所有包装器类都有toString()的无变元、非静态且为final的实力版本。例如;
Double d = new Double(“3.14”);
System.out.println(“d = ” + d. toString());
总之,包装器转换方法的实质是:
primitive..xxxValue()------将包装器转换为基本类型
primitive.parseXxx(String)-------将String转换为基本类型
Wrapper.valueOf(String)--------将String转换为包装器。
分享到:
相关推荐
浅谈消费类电子信息产品的包装运输的试验.pdf
随着计算机技术的发展,PLC(可编程逻辑控制器)的应用让生产线的控制更加灵活和高效。到了21世纪初,随着CAD(计算机辅助设计)等计算机辅助技术的加入,生产线的设计和优化得到了巨大的提升。 二、包装码垛自动...
采购总成本通常由直接采购成本和间接采购成本两大部分构成,而直接采购成本包括原材料成本、加工成本、包装成本、管理费用和利润等。 为了优化采购成本,战略采购通常采取以下途径: 1. 供应商分类管理:企业会...
"浅谈SAP期末清帐与重分类" SAP 是一款强大的企业资源规划(ERP)软件,提供了全面、系统化的解决方案,帮助企业更好地管理业务流程。其中,期末清帐与重分类是 SAP 的一个重要功能,旨在帮助企业更好地管理应收...
在某些包装过程中,如图案印刷、材料处理等,可能仍需人工审核,微处理结构能够处理这类影响商品包装质量的问题。常用的方法是调整外部机械的做功速率,以实现自动化包装。设计时可根据产品的尺寸和包装速度、时间等...
本文将浅谈 SAP 期末清帐和重分类的相关知识点。 一、应收应付管理 SAP 提供了强大的应收应付管理功能,包括购销合同中的明确条款、双方往来对帐、自动支付、催款、制定激励政策和评估和信用机制等。 购销合同中...
其次,图形与文字的结合形式多样,主要分为两类。一是根据图形特点使文字依附于图形,图形占据主导地位,文字作为辅助元素,如使用图形化的文字设计,增加视觉冲击力。二是根据网格进行组合,文字与图形按照一定的...
### 浅谈Java集合框架 Java集合框架是一个用于存储、操作和检索一组对象的强大工具集。集合框架的设计目的是为了提供一套高效且灵活的数据结构来满足不同的应用需求。本篇文章将详细探讨Java集合框架中的一些核心...
浅谈 Spring 原理 透析,IOC 和 AOP Spring 框架是一个从实际项目开发经验中抽取的,可高度重用的应用框架。它是一个轻量级容器,带有包装器,使许多不同的服务和框架更易于使用。轻量级容器接受任何 JavaBean,而...
机电类专业自动化产线实训教学实践的知识点包括以下几个方面: 1. 自动化和智能化趋势:随着工业4.0概念的深入人心,工厂自动化、智能化成为不可逆转的发展趋势。未来机电类专业从业人员需要对自动化产线的设备和...
### 浅谈物流成本管理论文知识点详述 #### 一、引言 物流成本管理作为企业财务管理的重要组成部分,在提升企业竞争力、降低成本、增加利润等方面发挥着至关重要的作用。随着经济全球化的发展,物流成本管理越来越...
SAP外包流程浅谈 在SAP系统中,外包流程是一种常见的生产方式,涉及到委外加工和委外采购。委外加工是指企业将某些生产过程委托给其他公司,而委外采购则是指企业将某些原材料或零部件委托给其他公司采购。在本文中...
SAP外包流程浅谈 SAP外包流程是指在SAP系统中,将部分或全部生产过程外包给第三方企业,以满足生产需求或降低成本。本文将详细介绍SAP外包流程的实现方法和注意事项。 一、外包方式 SAP外包流程可以分为两种:...
为了便于在视图层访问这些属性,Struts2提供了一个名为StrutsRequestWrapper的类,它是HttpServletRequest的包装器。StrutsRequestWrapper重写了getAttribute方法,使得在获取请求属性时,不仅检查...
医疗废物包括感染性废物、病理性废物、损伤性废物、化学性废物和药物性废物五大类,每类废物都有其特殊的处理要求。 在实践中,医院医疗废物管理存在多方面的问题。首先,【医生护士对医疗废物的认识不足】,他们...
最后,医疗废物管理的相关法规是指导实践的重要依据,如《医疗卫生机构医疗废物管理办法》、《医疗废物管理条例》、《医疗废物分类目录》和《医疗废物专用包装袋、容器和警示标志标准》等,这些法规提供了具体的操作...
《浅谈小麦粉生产加工企业食品安全管理》 食品安全问题是当今社会极为关注的话题,尤其是在生活水平日益提升的背景下,人们对食品安全的需求愈发强烈。小麦粉作为人们日常生活中的主要食品原料,其安全问题直接影响...
标题中的“浅谈医疗器械行业100级洁净区的空调净化系统设计与实施”涉及到的是医疗器械制造领域的一个关键环节,即在无菌生产环境中如何设计和实施满足100级洁净标准的空调净化系统。这一等级的洁净区是用于生产高...
在传统的面向对象编程(Object-Oriented Programming, OOP)中,横切关注点往往分散在多个类中,这导致了代码的重复、难以维护等问题。AOP通过引入连接点(join points)、切入点(pointcuts)、方面(aspects)等...