C#(对象引用)
1:关于实例化对象
我先创建一个FullChannel对象, FullChannel fullchannel = new FullChannel(); 这个时候堆栈内存的示意图如下 在栈内存里面有块区域划出来给FullCannel用,在堆内存里面也划出了一块区域用来存储FullCannel里面的数据,并且把堆内存的引用给了栈内存的FullCannel。 现在我再创建一个对象 MyFavor myFavor = fullcannel; 这个时候堆栈内存的示意图如下 执行MyFavor myFavor = fullcannel;的时候也就是把fullcannel在堆内存中的引用给了myFaovr。也就是说两个对象共用一块堆内存。 我要是修改了fullcannel里面的数据,那么我用myFaovr也能看到这个修改过的数据。 例如: 我给fullcannel赋值“你好” fullcannel = “你好”; System.out.println(fullcannel); System.out.println(myFavor); 这个时候会显示两行字: 你好 你好 我继续编写代码将fullcannel的值修改为“您好” fullcannel = "您好"; Sysout.out.println(fullcannel); System.out.println(myFavor); 这个时候显示的就是: 您好 您好 这就说明了,两个对象是引用同一块堆内存的 接下去的才是重点! 我把fullcannel重新实例化对象。 fullcannel = new FullCannel(); 这个时候堆栈内存中的示意图变成了这样: 当执行了fullcannel = new FullCannel();的时候,就将fullcannel这个对象在堆内存中的引用给清除了。fullcannel对象又在堆内存中划分出一块区域并且附上引用。 好了,那么现在这两个对象引用的就不是同一块堆内存了。
例如: 我给fullcannel赋值“你好” fullcannel = “你好”; myFavor = “你坏”; System.out.println(fullcannel); System.out.println(myFavor); 这个时候会显示两行字: 你好 你坏 我继续编写代码将fullcannel的值修改为“您好” fullcannel = "您好"; Sysout.out.println(fullcannel); System.out.println(myFavor); 这个时候显示的就是: 您好 你坏 这就说明了,两个对象是引用的不是同一块堆内存 |