关于String类型是否是引用类型

在学习原型模式的时候,需要实现ICloneable时,调用object的MemberwiseClone(浅表副本)方式时发现一个问题:
MemberwiseClone方法只会将值类型完全Clone,引用类型在Clone时只复制引用。
在我的实验中发现string类型的对象在MemberwiseClone之后地址发生了变化。


    class PrototypePattern : ICloneable
    {

        public String name;
        String info;
        String college;
        public PrototypePattern(String name, String info, String college)
        {
            this.name = name;
            this.info = info;
            this.college = college;
            Console.WriteLine("奖状创建成功!");
        }
        public void setName(String name)
        {
            this.name = name;
        }
        String getName()
        {
            return (this.name);
        }
        public void display()
        {
            Console.WriteLine(name + info + college);
        }
        public Object Clone()
        {
            Console.WriteLine("拷贝成功!");
            return base.MemberwiseClone() as PrototypePattern; ;
         }
}

        static void Main(string[] args)
        {

            PrototypePattern obj1 = new PrototypePattern("张三", "同学:在2016学年第一学期中表现优秀,被评为三好学生。", "韶关学院");
            obj1.display();
            PrototypePattern obj2 = (PrototypePattern)obj1.Clone();
            Console.WriteLine(obj1.name.Equals(obj2.name));
            //obj2.setName("李四");
            obj2.name += "李四";
            Console.WriteLine(obj1.name.Equals(obj2.name));
            obj2.display();
            obj1.display();
            Console.ReadLine();
        }

String类型本质是引用类型,但是String类型指向是一个常量,所以每次修改时需要重新创建一个新的常量字符串,所以有了值类型的效果。

上一篇:js的深拷贝与浅拷贝的区别


下一篇:JVM垃圾回收相关算法