A股上市公司传智教育(股票代码 003032)旗下技术交流社区北京昌平校区

 找回密码
 加入黑马

QQ登录

只需一步,快速开始

© 葛杨杨 中级黑马   /  2013-5-19 08:47  /  1315 人查看  /  2 人回复  /   0 人收藏 转载请遵从CC协议 禁止商业使用本文

本帖最后由 葛杨杨 于 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. }
复制代码

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

2 个回复

倒序浏览
一个。
两个都是同一个实例,只是初始化了一个实例,第一个初始化一个类的时候在堆中分配了空间,栈中有堆地址的引用,C r2=r1;实际上就是把r1的地址给了r2.

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
值类型是在栈上的,赋值的时候直接把值复制进行了传递,引用类型是在堆中,赋值的时候是直接复制了引用的地址,但实际上还是只想的是堆中的同一块内存。
上面的代码开始int类型是值类型,这个时候输出结果v1=0,v2开始=0,后来经过赋值变成927了
而类是引用类型,r1和r2都是只想了内存中的同一个地址,这个时候他们俩的value字段的值应该都是赋值以后的值了也就是112

评分

参与人数 1技术分 +1 收起 理由
苏波 + 1

查看全部评分

回复 使用道具 举报
您需要登录后才可以回帖 登录 | 加入黑马