现金与存折---值类型和引用类型

     在软考的时候也接触过值类型和引用类型,那时候应付做题还是可以的,可是考完之后再突然面对这两个词汇,又觉得迷茫无措了。现在想想,还是实践吧,当时只是简单的了解了其原理,没有用代码来实现,所以只能算是初步的,暂时的了解。这篇文章就是为了弥补初步的遗憾,进行深一步的学习。

     理论联系实践,才是对现实的超越。就像门和钥匙一样,完美结合才有防窃和安全之功效。所以,该篇文章的主要思路也是从理论和实践两个方面分别对“值类型和引用类型”进行详细阐述。


-------------------------------------------理 论 篇------------------------------------

     

     1.值类型

     直接将内存存储在栈内,由系统自动释放资源的数据类型。简单来说:值类型就好像现金,需要的时候直接用就可以;

     2.引用类型

     由类型的实际值引用表示的数据类型。简单来说:引用类型就好像是存折,需要的时候必须先去银行换成现金,然后使用。

    3.两者对比

     先用一张简单的图表显示,更为直观易懂。

    

 

-------------------------------------------实 践 篇------------------------------------

     

     看了上图后,会对值类型和引用类型有个大概的了解,下面详细说说两者在内存分配方面的区别。

     如上表可知,值类型变量是在栈内存中分配空间,引用类型则是在堆内存中分配空间的。这么说是什么意思呢?通过下面的代码实例和内存分配图来看看吧。

//首先,构造一个最简单的类引用类型
Publicclass MyClass
{
}
 
//然后,对比值类型和引用类型
private static void Main()
{
int i;                    //定义值类型变量
MyClass mc;    //定义引用类型变量
 
 
i = 5;               //值类型变量的赋值
mc = new MyClass();    //创建引用类型变量
}

     很简单的一段代码,我们就以此为例,配合内存分配图,来详细对比一下值类型和引用类型在内存分配上的区别。

     首先是他们共同的开始,那就是只要是变量(不管是值类型还是引用类型变量)声明后,都会在栈内存中分配其相应的一部分空间。如下图:

                                                                                                    

     至于这部分空间里存放的是什么东西,就要看这个变量是值类型还是引用类型了。


     (1)值类型

i = 5;               //值类型变量的赋值

     当为值类型变量进行赋值时,栈内存中存放的就是这个值类型自身的值。如下图所示:

                                                                                                   

     由图可知,值类型变量本身所占的内存中就存放着其值,就好比上文提到的“现金”一样,需要用的时候直接使用就可以,很简单,一步就可到位。


    (2)引用类型

mc = new MyClass();    //创建引用类型变量

     当为引用类型变量时,不仅仅需要在栈内存中为其分配空间,也要在堆内存中为其分配适当的空间。不过这里需要注意,需要了解的就是---栈内存中存放的是什么?堆内存中存放的又是什么?还是看图来说话吧:

           

     由图可知,引用类型变量的值是存放在堆内存中的,在栈内存中存放的则是该变量在堆内存中相对应的首地址,就好比是“存折”一样,栈中存放的只是存折的账号,需要使用时,我们还需要根据栈中的“账号”找到堆内存中相对应的“现金”,然后才可使用。

 

     不知道说到这里,读者朋友们理解了值类型和引用类型的区别了吗?尤其是在内存分配方面的区别,这是其本质上的不同。期待与您的交流~

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 18
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 18
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值