黑马程序员技术交流社区

标题: 关于引用类型的问题 [打印本页]

作者: 葛杨杨    时间: 2013-5-19 08:47
标题: 关于引用类型的问题
本帖最后由 葛杨杨 于 2013-5-20 18:58 编辑

代码如下, 其中
C r1 = new C();
C r2 = r1;
这块,声明r2的时候是不是重新创建了一个C的对象实例,这个对象实例跟r1对应的对象实例是同一个还是全新的两个?
  1. using System;
  2. using System.Collections.Generic;
  3. using System.Linq;
  4. using System.Text;

  5. namespace 引用类型
  6. {
  7.     class Program
  8.     {
  9.         class C
  10.         {
  11.             public int Value = 0;
  12.         }

  13.         static void Main(string[] args)
  14.         {
  15.             int v1 = 0;
  16.             int v2 = v1;
  17.             v2 = 927;
  18.             C r1 = new C();
  19.             C r2 = r1;
  20.             r2.Value = 112;
  21.             Console.WriteLine("Values:{0},{1}",v1,v2);
  22.             Console.WriteLine("Refls:{0},{1}",r1.Value, r2.Value);
  23.             Console.ReadKey();
  24.         }
  25.     }
  26. }
复制代码

作者: 斩_梦    时间: 2013-5-19 09:05
一个。
两个都是同一个实例,只是初始化了一个实例,第一个初始化一个类的时候在堆中分配了空间,栈中有堆地址的引用,C r2=r1;实际上就是把r1的地址给了r2.
作者: 王朋    时间: 2013-5-19 11:20
值类型是在栈上的,赋值的时候直接把值复制进行了传递,引用类型是在堆中,赋值的时候是直接复制了引用的地址,但实际上还是只想的是堆中的同一块内存。
上面的代码开始int类型是值类型,这个时候输出结果v1=0,v2开始=0,后来经过赋值变成927了
而类是引用类型,r1和r2都是只想了内存中的同一个地址,这个时候他们俩的value字段的值应该都是赋值以后的值了也就是112




欢迎光临 黑马程序员技术交流社区 (http://bbs.itheima.com/) 黑马程序员IT技术论坛 X3.2