`
mlc0202
  • 浏览: 102315 次
  • 来自: 北京
社区版块
存档分类
最新评论

说说java的自动装箱(autoboxing)和拆箱(unboxing)

 
阅读更多

Adversity makes a man wise, not rich. 逆境出人才

java作为面向对象语言,有人认为所看到的都是对象,事实上,在javase5之前,基本类型默认并不是采用对象存在的如果您想要把基本类型作为对象来处理,就必须自行转换,不过,在javase5之后,为基本数据类型提供了自动装箱和拆箱功能,使得将基本类型转换为对象变得极其便捷。

在这里来捋一捋java的基本数据类型,不理不要紧,一理才发现俺也掌握的不是那么明确,在这里俺也再次学习下
总计有八个,分别是
byte字节型(一个字节),char字符型(两个字节),short短整型(两个字节),int整型(四个字节),
long长整型(八个字节),float浮点型(四个字节),double 双精度浮点型(八个字节),boolean型(一个字节)

 在javase5之前,如果想要把基本数据类型作为对象来操作,就需要采用对应的对象,来把它们打包才行

现在虽然不用这样了,但其中也有一些要注意的地方,俺揪出来晒晒

   先说说类和对象,建立个概念吧先

类--可以认为是对象的设计图
对象--是按照设计图实现了的具体工具
先这么简单理解吧,如果真要扯开了说,那可是软件工程里面的一门专业课,我们有个概念就好

    之所以要将基本类型数据打包成为对象,原因很简单,是因为对象可以携带更多的数据

手动、自动装箱拆箱示例

    Long,Integer,Double,Float,Boolean等等的类就是所谓的wrapper类,就跟wrapper这个单词所代表的意思一样,就是提供一个“包装,加壳”,把基本数据类型放在里面,来看代码,体会下先

 

public class WrapperDemo{
	public static void main(String[] args){
	     int data1=21;
		 int data2=24;
		 //打包成为对象
		 Integer data1Wrapper = new Integer(data1);
		 Integer data2Wrapper = new Integer(data2);
		 //原始数据直接除以3
		 System.out.println(data1/3);
		 //将数据打包,转换为double型,除以3
		 System.out.println(data1Wrapper.doubleValue()/3);
		//比较
		System.out.println(data1Wrapper.compareTo(data2Wrapper));
	}

}
 

      图1-1是WrapperDemo的运行结果

   
  
       图1-1  WrapperDemo的运行结果

  通过上面的代码和运行结果,看到了将基本数据类型打包成为对象带来的好处了吧,别着急,这还只是javase5之前的做法,在javase5之后就已经支持自动装箱和拆箱了

 ,在这,就不再单独写代码出来了,只写几个能说明问题的语句就可以了,相信很容易理解的

javase5之前,手动打包
Integer data1 = new Integer(10);
事项将基本类型数据转换为对象
javase5之后,支持自动打包
Integer data1 = 10;
便可以实现将基本类型的数据转换为对象
eg:
    在上面的代码中,可以采用,可以直接进行两个基本数据类型的比较
    data1.compareTo(data2);
   基本数据类型本身没有什么方法,当你运行之后会发现,它仍然可以正确运行,这就自动装箱和拆箱带来的好处
 

再来说说自动装箱拆箱

    自动装箱和拆箱,从本质上讲,是编译器帮了我们的忙,这就是所谓的“编译器蜜糖”,既然这么好,是不是就可以放心的用了呢?

先别着急,喝口水,咱再接着唠

    看看下面的情况,您是否了解

 

Integer i = null;//表明i没有参考至任何对象
int j = i ;//相当于 int j = i.intValue()
这样的代码,编译时是可以通过的,因为它的语法是正确的,但在运行时,就会排除NullPointerException错误,这是由于i并没有参考至任何对象造成的
 
个人建议,如果您对装箱拆箱不是理解的很清楚,最好还是按部就班的一步一步的对它进行装包和拆包,这样,有的时候,可能会为你节省很多纠错的时间哦

 还是自动装箱拆箱

public class BoxDemo{
   public static void main(String[] args){
    Integer data1 = 500;
	Integer data2 = 500;
	System.out.println(data1==data2);
   }
}

   在你看到接下来的运行结果前,您先猜猜看,运行的结果会是怎样的呢?true or false?

   图1-2是代码运行的结果

 
  
              图1-2  BoxDemo运行结果

   false?没错,它就是false,自动装箱时,对于值从-128-127之间的数,被装箱后,会被放在内存中进行重用,

如果超出了这个值的范围就不会被重用的,所以每次new出来的都是一个新的对象,结果自然会是false

 

在这里,区别一个概念“==”和equals()
    “==”是比较两个对象是不是引用自同一个对象
     “equals()”是比较两个对象的内容
这个一定得搞清楚,否则,在遇到问题的时候,可真是会让人抓狂的
 

 

 

 

 

 

 

 

 

 

  • 大小: 2.7 KB
  • 大小: 2.2 KB
  • 大小: 2 KB
分享到:
评论
1 楼 ^=^ 2017-05-02  
原来是数字自动转换为对象的意思啊,这样岂不是重用内存变多了。

相关推荐

    java自动装箱拆箱深入剖析

    基本数据(Primitive)类型的自动装箱(autoboxing)、拆箱(unboxing)是自J2SE 5.0开始提供的功能。java语言规范中说道:在许多情况下包装与解包装是由编译器自行完成的(在这种情况下包装成为装箱,解包装称为拆箱)

    Java语言 包装类讲解案例代码 ( 设计目的(作用)和用途、自动装箱与拆箱、常用方法、 null和默认值)

    自动装箱与拆箱:自动装箱(Autoboxing)指的是自动地将基本数据类型转换为对应的包装类对象;自动拆箱(Unboxing)则是将包装类对象自动转换为基本数据类型。 常用方法:演示如何使用包装类中的这些常见方法。 null...

    关于Java自动装箱(autoboxing)的一些意想不到的结果

    Java 的自动装箱有很多意想不到的结果,其中有些是广为人知的,这些奇怪的结果多数是 因为自动装箱对象的缓存导致的。

    常用Java代码65个附示例代码

    3.Java中的自动装箱和拆箱(Autoboxing and Unboxing) 4.Java中的注解处理器(Annotation Processing) 5.Java中的Lambda表达式和函数式接口 6.Java中的Optional类和null安全编程 7.Java中的并发集合...

    JAVA基础课程讲义

    自动装箱和拆箱?autoboxing,unboxing 119 字符串相关类(String、 StringBuffer 、 StringBuilder) 120 String类的常用方法(已讲过,不再讲!) 120 StringBuffer和StringBuilder 121 String和StringBuffer和...

    JDK1.6学习笔记 林信良

    Java学习笔记 台湾 林信良 什么是Java 从autoboxing、unboxing认识对象 语法入门 Annotation 文本编辑器 Java SE6新功能简介 继承、多型

    Eclipse3.1中体验J2SE5.0之枚举类型

    本文将介绍J2SE5.0中三个比较重要的...这些特性包括范型(generics)的支持,枚举类型(enumeration)的支持,元数据(metadata)的支持,自动拆箱(unboxing)/装箱(autoboxing),可变个数参数(varargs),静态导入(staticimports),

    JAVA 5.0 TIGER程序高手秘笈

    java高手秘笈详细讲解了java底层的一点事 StringBuilder ...Autoboxing 和Unboxing vararge 可变参数 类型...数组名 Annotation @Override @Deprecated for/in 静态的import 格式化 Formatter Thread

    leetcodelrucache-algorithm:算法学习和练习

    自动装箱拆箱 jdk.longaccumulator 计数器 jdk.threadlocal DateFormatService: 如何线程安全的使用 SimpleDateFormat jdk.volatilex VolatileArrays: volatile 例子 jdk.collection.union JDK: javaAPI 方式 ...

    Java The Complete Reference ,11th Edition.pdf

    Java: The Complete Reference, Eleventh Edition By 作者: Herbert Schildt ISBN-10 书号: 1260440230 ISBN-13 书号: 9781260440232 Edition 版本: 11 出版日期: 2018-12-12 pages 页数: (1955) The Definitive ...

    Java-Language-Specification-3rd-Edition

    全面、准确、详尽地介绍了Java语言及其语法,论述了Java编译器所要检查的语法和Java运行模式的各个方面,同时还描述了Java语盲最重要的新特征(包括generics、annotationS、aSSertS、autoboxing、enumS、for-...

    Java典型模块

    3.1.4 基本数据的拆、装箱操作(autoboxing和unboxing) 3.2 枚举 3.2.1 枚举的实现原理 3.2.2 枚举的简单应用 3.2.3 枚举的高级特性 3.3 反射 3.3.1 反射的基石——Class类 3.3.2 反射的基本应用 3.3.3 反射的高级...

    Learn.Java.for.Android.Development_Apress.2010+src

    Continuing, you investigate strictfp, class literals, synchronized, volatile, the enhanced for loop statement, autoboxing/unboxing, and transient fields. The book also briefly presents most (if not ...

    Java Language Specification, Third Edition

    Java Language Specification, Third Edition 中文译名:Java编程规范(第三版) http://www.china-pub.com/30979 By James Gosling, Bill Joy, Guy Steele, Gilad Bracha ...

    Java语言规范(第三版) 英文

    Written by the inventors of the technology, The Java™ Language Specification, Third Edition, is the definitive technical reference for the Java™ programming language. If you want to know the precise...

    Java2核心技术卷I+卷2:基础知识(第8版) 代码

    Java 核心技术 卷1 Index Chapter 1: An Introduction to Java 1 Java As a Programming Platform 2 The Java “White Paper” Buzzwords 2 Java Applets and the Internet 7 A Short History of Java 9 ...

    java.核心技术.第八版 卷1

    java 核心技术 第八版 core 卷1 Core Java, 8th Edition Core Java. Volume I. Fundamentals, 8th Edition Core Java. Volume II. Advanced Features, 8th Edition 官方网站 http://horstmann.com/corejava.html ...

Global site tag (gtag.js) - Google Analytics