`
jameszou
  • 浏览: 73097 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

装箱拆箱(转)

阅读更多
     偶今天看JDK5的时候也发现了装箱/拆箱概念,遂作一总结,以备后用。
     .net中有一个很重要的概念,装箱与拆箱,之后在jdk5也出现了自动装箱/拆箱的概念。偶对此表一下自己的理解。
一、什么时装箱/拆箱。
    这要涉及到数据类型,在.net中所有的类型都继承自System.Object,所有的类型都是对象.类型主要分为两种,一是值类型,包括原类型(Sbyte、Byte、Short、Ushort、Int、Uint、Long、Ulong、Char、Float、Double、Bool、Decimal)、枚举(enum)、结构(struct).另一类是引用类型,包括类、数组、接口、委托、字符串等.
    其中值类型是在栈中分配内存,本身的声明就是一个初始化的过程,其不需要进行垃圾回收,只要超出所定义的作用范围会自动释放内存.
    而引用类型则是在堆中分配的,和java一样,在堆种分配内存,而其托管堆进行垃圾回收.
当两种数据类型进行转换时就引出了装箱/拆箱.
    装箱:值类型到引用类型或到此值类型所实现的任何接口类型的隐式转换
            例如: int temp = 3;
                      System.Object obj = temp;
            其中,temp为值类型,在栈中分配;当分配obj这个引用类型时,我们需要在堆中分配一个obj对象,然后把temp值赋给它,这么一系列的过程就是装箱的过程。
    拆箱:从引用类型到任意值类型的显式转换。与装箱不同,拆箱式显示装换。
    例如:int temp = 3;
                System.Object obj = temp;
                int i = (int) obj;
            拆箱过程中,首先来确定对象obj为一个值类型的装箱值,然后把值赋给值类型。
     加个例子强化一下理解,西西
        int temp = 3;
      object obj = temp;
      Console.WriteLine (temp + "," + (int) obj);
      在此过程中,进行了3次装箱和1次拆箱;很明显,obj = temp时第一次装箱,temp + "," + (int) obj中,temp要先转换为String类,第2次装箱,(int)obj第3次装箱成引用类型。obj转换为int时拆箱。
二、评价装箱/拆箱。
    装箱和拆箱虽然满足了两只类型之间的转换。但是从装箱的过程中不难看出,每次装箱时要在堆中new一个新的对象,当量特别大是肯定会大大影响程序的效率。事物总有两面性,every sword has two sides,事情便简单了,性能也下来了。所以,在应用中,我们应该尽量避免装箱操作。
三、对装箱/拆箱更进一步的了解
    最后引用一个例子,摘自http://blog.csdn.net/tiger119/archive/2006/08/28/1134068.aspx
   装箱/拆箱并不如上面所讲那么简单明了,比如:装箱时,变为引用对象,会多出一个方法表指针,这会有何用处呢?
   我们可以通过示例来进一步探讨。
   举个例子。
   Struct A : ICloneable
   {
      public Int32 x;
      public override String ToString() {
         return String.Format("{0}",x);
      }
      public object Clone()   {
         return MemberwiseClone();
      }
   }
   static void main()
   {
     A a;
     a.x = 100;
     Console.WriteLine(a.ToString());
     Console.WriteLine(a.GetType());
     A a2 = (A)a.Clone();
     ICloneable c = a2;
     Ojbect o = c.Clone();
   }
   5.0:a.ToString()。编译器发现A重写了ToString方法,会直接调用ToString的指令。因为A是值类型,编译器不会出现多态行为。因此,直接调用,不装箱。(注:ToString是A的基类System.ValueType的方法)
   5.1: a.GetType(),GetType是继承于System.ValueType的方法,要调用它,需要一个方法表指针,于是a将被装箱,从而生成方法表指针,调用基类的System.ValueType。(补一句,所有的值类型都是继承于System.ValueType的)。
   5.2:a.Clone(),因为A实现了Clone方法,所以无需装箱。
   5.3:ICloneable转型:当a2为转为接口类型时,必须装箱,因为接口是一种引用类型。
   5.4:c.Clone()。无需装箱,在托管堆中对上一步已装箱的对象进行调用。
   附:其实上面的基于一个根本的原理,因为未装箱的值类型没有方法表指针,所以,不能通过值类型来调用其上继承的虚方法。另外,接口类型是一个引用类型。对此,我的理解,该方法表指针类似C++的虚函数表指针,它是用来实现引用对象的多态机制的重要依据。
分享到:
评论

相关推荐

    java装箱拆箱.ppt

    java装箱拆箱.ppt java装箱拆箱.ppt

    c#数值类型,转换和装箱拆箱

    在实际开发中,理解数值类型、装箱拆箱以及类型转换对于编写高效、安全的代码至关重要。通过学习和实践,你可以更好地掌握这些概念,并避免潜在的性能问题和错误。为了深入理解这些知识点,阅读提供的"数据类型_4_值...

    JAVA装箱拆箱(很详细、易于理解)

    Java中的装箱和拆箱是面向对象编程中的一个重要概念,主要涉及到Java的自动类型转换机制。装箱是指将基本数据类型(如int、char、boolean等)转换为对应的包装器类对象,而拆箱则是相反的过程,即把包装器类的对象...

    C#语言中的装箱和拆箱操作

    C#语言中的装箱和拆箱操作 C#语言中的装箱和拆箱操作是类型系统中的核心概念,它们使得在C#类型系统中任何值类型、引用类型和object对象类型之间进行转换。装箱和拆箱机制可以将任何类型的值看作是object类型。 ...

    装箱与拆箱(二)

    在C#编程语言中,装箱与拆箱是两种重要的操作,主要涉及到值类型与引用类型之间的转换。本文将深入探讨这两个概念,并结合实例来帮助理解。 首先,我们需要明确值类型(如int、bool、char、结构体等)和引用类型...

    C#示例:装箱、拆箱、自定义数据类型转换、ToString方法重载、类方法扩展

    在C#编程中,装箱、拆箱、自定义数据类型转换、ToString方法重载以及类方法扩展是几个核心概念,对于理解和优化程序性能至关重要。本文将深入探讨这些主题,并通过具体的实例来阐述它们的应用。 1. 装箱与拆箱 装箱...

    装箱与拆箱(一)

    在C#编程语言中,装箱与拆箱是两种关键的操作,它们涉及到值类型与引用类型之间的转换。本文将深入探讨这两个概念,以及它们在实际编程中的应用。 首先,我们来理解什么是装箱。装箱(Boxing)是指将值类型(如int...

    万物之父和装箱拆箱练习题及参考答案

    万物之父和装箱拆箱练习题及参考答案

    36装箱拆箱(1).rar

    在C#编程语言中,装箱(Boxing)和拆箱(Unboxing)是两个重要的概念,特别是对于理解和优化性能至关...通过观看"A212]C#语言参考视频 装箱拆箱.swf"这样的资源,初学者能够直观地理解这两个概念,并通过实例加深理解。

    java自动装箱拆箱深入剖析

    Java中的自动装箱和拆箱是自J2SE 5.0版本引入的特性,它极大地简化了基本数据类型与其对应的包装类之间的转换过程。基本数据类型包括int、double、boolean等,而包装类如Integer、Double和Boolean分别对应这些基本...

    C# 装箱和拆箱的知识回顾

    C#中的装箱和拆箱是两种特殊类型的转换操作,它们涉及到值类型与引用类型之间的交互。在C#中,值类型包括基本类型(如int、char、bool等)和结构(如DateTime、Decimal等)。而引用类型主要是类实例以及接口实例。...

    《深入理解java虚拟机》自动装箱拆箱实例.doc

    ### 自动装箱与拆箱概念 在Java中,自动装箱是指将基本数据类型自动转换为对应的包装类对象的过程,而自动拆箱则是指将包装类对象自动转换为基本数据类型的逆过程。这一特性自Java 5起引入,极大地简化了开发者的...

    Java自动装箱与拆箱深度解析:原理、应用与性能考量

    在Java编程中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是两个非常核心的概念,它们允许基本数据类型和它们对应的包装类之间无缝转换。这种转换机制在Java 5中引入,极大地简化了代码编写,但同时也带来了一些...

    Java中的自动装箱与拆箱Java开发Java经验技巧共6

    在Java编程语言中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是两个重要的特性,它们简化了基本类型(如int、double等)与对应的包装类(如Integer、Double等)之间的转换过程。这些特性是在Java 5引入的,极大...

    C#源代码-装箱和拆箱.zip

    在.NET框架中,C#是一种面向对象的编程语言,它提供了装箱和拆箱的概念来处理值类型与引用类型之间的转换。本压缩包文件“C#源代码-装箱和拆箱.zip”显然包含了关于这一主题的源代码示例,这对于我们深入理解这两种...

    深入剖析Java中的装箱和拆箱

    自动装箱和拆箱问题是Java中一个老生常谈的问题了,我们来一些看一下装箱和拆箱中的若干问题。本文先讲述装箱和拆箱基本的东西,再来看一下面试笔试中经常遇到的与装箱、拆箱相关的问题。  以下是本文的目录大纲:...

    C#装箱与拆箱1

    C#装箱与拆箱第一部分。是一个很好的视频,帮助大家学习C#装箱和拆箱的知识

    C# 装箱和拆箱[整理].pdf

    【C# 装箱和拆箱】是C#编程中的关键概念,涉及到值类型与引用类型之间的转换。装箱是将值类型转换为引用类型,而拆箱则是将引用类型转换回值类型。这一机制使得C#能够处理不同类型之间的交互,尤其是在需要使用通用...

    Java中自动装箱、拆箱引起的耗时详解

    Java中自动装箱、拆箱引起的耗时详解 Java中自动装箱和拆箱是Java语言中一个重要的特性,它可以将基本数据类型和它们的包装类之间进行转换,这个过程是透明的,程序员不需要手动进行转换。但是,这个过程会引起一些...

    Java中的自动装箱与拆箱_.docx

    在Java编程语言中,自动装箱(Autoboxing)和自动拆箱(Unboxing)是从Java 1.5版本开始引入的一项特性,其目的是简化原始类型(Primitive Types)与它们对应的包装类(Wrapper Classes)之间的转换过程。...

Global site tag (gtag.js) - Google Analytics