`
iwindyforest
  • 浏览: 229829 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

Java中三种变量的拷贝方法比较: 值变量,对象变量,字符串变量

阅读更多
ps:本文的实例和思想引用自<深入浅出jdk6.0>

变量复制不是通过复制就可以实现的吗?这可是最基本的编程常识,为什么还要专门来阐述呢?

首先我们来看一下值类型怎么复制,看下面的代码:

public class ValcpyDemo
{
    public ValcpyDemo()
    {
        int x = 0;
        int y = x;
        x = 1;
        System.out.println("y = " + y);
    }

    public static void main(String[] args)
    {
        new ValcpyDemo();
    }

}



结果显而易见:y的值为0 也就是说,对于基本类型的变量来说,通过简单赋值就可以实现值变量的拷贝.

但是对于对象类型来说,情况却不那么简单.

看下面的代码:

public class ObjcpyDemo
{
    public ObjcpyDemo()
    {
        // 定义student1对象变量
        Student student1 = new Student();
        student1.id = "0001";
        student1.name = "Tom";
        // 将student1赋值给student2
        Student student2 = student1;
        student1.id = "0002";
        student1.name = "Jack";

        System.out.println("student2.id = " + student2.id);
        System.out.println("student2.name = " + student2.name);
    }


    public static void main(String[] args)
    {
        new ObjcpyDemo();
    }

}


结果是:

student2.id = 0002
student2.name = jack

对象变量student2从student1赋值得到,而且在student1值发生改变的同时, student2对象的属性值也相应的改变了,看起来student1和student2指向的是同一个对象(即同一块内存),根本没有达到复制的目的.

这是为什么呢?原来对象类型变量的复制,不能和简单类型变量一般,而必须引用Object.Clone()方法,否则赋予的 只是对象的引用而已. 而直接或者间接的使用Object.Clone()方法,来实现Clone的对象也有"浅层克隆"和"深层克隆"的说法,将在另一片文章中描述.

那么,让我们最后看一下字符串的拷贝又是怎么一回事呢?

虽然String类型也是继承自Object,但对于字符串来说,情况显得有点特殊.对于String类型的赋值是创建一个新的String对象,而不仅仅是将对象 引用赋值给对方.从这个意义上讲,对String的赋值更类似于基本类型.

下面是示例:

public class StrcpyDemo
{
    public StrcpyDemo()
    {
        String s1 = "1";
        String s2 = s1;
        s1 = "2";
        System.out.println("s2 = " + s2);
    }

    public static void main(String[] args)
    {
        new StrcpyDemo();
    }
}


答案:
s2 = 1

总结:


对于基本类型,通过简单赋值就可以实现值变量的拷贝.

对象类型 变量的复制,不能和简单类型变量一般,而必须引用Object.Clone()方法,否则赋予的 只是对象的引用而已.

对于String类型的赋值是创建一个新的String对象,而不仅仅是将对象 引用赋值给对方.从这个意义上讲,对String的赋值更类似于基本类型.
分享到:
评论

相关推荐

    ES6变量声明与赋值:值传递、浅拷贝与深拷贝详解

    本文首先介绍ES6中常用的三种变量声明方式,然后讨论了JavaScript按值传递的特性以及多种的赋值方式,最后介绍了复合类型拷贝的技巧。在JavaScript中,基本的变量声明可以用var方式;JavaScript允许省略var,直接对...

    SIMATIC Wincc中与字符串相关的函数使用方法(拷贝_比较_连接_转换)及举例说明.docx

    SIMATIC Wincc中与字符串相关的函数使用方法(拷贝_比较_连接_转换)及举例说明

    java设计模式【之】原型模式、深拷贝与浅拷贝【源码】【场景:克隆羊】

    两个对象中的该成员变量执行的是同一个地址,其中一个对象的值修改后,另一个对象的值也会改变。 * 深拷贝基本介绍 * 1)复制对象的所有基本数据类型的成员变量值 * 2)为所有引用数据类型的成员变量申请存储空间,...

    java 面对对象编程.pdf.zip

    面向对象三大特征 封装 继承 多态 接口和抽象类有什么共同点和区别? 深拷贝和浅拷贝区别了解吗?什么是引用拷贝? Java 常见类 Object Object 类的常见方法有哪些? == 和 equals() 的区别 hashCode() 有什么用? ...

    JavaScript对象拷贝与Object.assign用法实例分析

    因此对 JavaScript 中的复杂数据类型(object)来说,也会有浅拷贝和深拷贝的概念:浅拷贝指两个不同的变量存的是同一个对象的地址,即两个变量指向同一块内存区域;深拷贝则是重新分配了一块内

    tomcat环境变量配置

    1,新建变量名:JAVA_HOME,变量值:C:\Program Files\Java\jdk1.7.0 2,打开PATH,添加变量值:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin 3,新建变量名:CLASSPATH,变量值:.;%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\...

    【JavaScript源代码】详解JS变量存储深拷贝和浅拷贝.docx

     目录 变量类型与存储空间栈内存和堆内存基本数据类型引用类型图解存储空间引用类型的赋值深拷贝和浅拷贝深拷贝浅拷贝对象的赋值三者对比浅拷贝的常用的五种方法Object.assign()扩展运算符Array.prototype.slice...

    java常用环境变量

    java常用环境变量,环境变量的设置,直接拷贝就可以了

    Java 理论与实践: 正确使用 volatile 变量 线程同步

    Java语言规范中指出:为了获得佳速度,允许线程保存共享成员变量的私有拷贝,而且只当线程进入或者离开同步代码块时才与共享成员变量的原始值对比。  这样当多个线程同时与某个对象交互时,必须要注意到要让线程...

    Java环境变量配置说明.docx

    1、 在弹出的“新建系统变量”框中,输入变量名和变量值,...变量名为:JAVA_HOME 变量值为JDK的安装路径,到bin目录的上一层即可。比如E:\develop\Java\jdk-11 注意:为防止路径输入错误,可以打开文件夹,拷贝路径。

    javascript文档

    indexOf 方法 返回在 String 对象中第一次出现子字符串的字符位置。 不相等运算符 (!=) 比较两个表达式,看是否不相等。 Infinity 属性 返回 Number.POSITIVE_INFINITY 的初始值。 input 属性 返回进行查找的...

    java串口通信comm.jar

    1.把javax.comm.properties文件拷贝到Java运行时环境的lib目录中,即:  C:\Program Files\Java\jdk1.5.0_12\lib\javax.comm.properties  C:\Program Files\Java\jdk1.5.0_12\jre\lib\javax.comm.properties  ...

    DELPHI Variant变量的使用技巧

    你可以把一个值为字符串的variant 变量赋给编辑框Text 属性,还可以把值为整数或浮点数的variant 变量赋给Text属性。正如你在图10.1中所看到的,一切正常。 (图10.1)按Assign按钮后,例VariTest的输出结果 图 ...

    Maven2 + gwt 详细配置指南.doc

    变量名:JAVA_HOME 变量值:D:\Java\jdk1.6.0_02 变量注:这个变量是指定JDK放的位置,变量的值与JAVA根目录的路径对应 2、 变量名:TOMCAT_HOME 变量值:D:\project tools\Tomcat 5.5 变量注:这个变量指定TOMCAT...

    C#中的浅拷贝和深拷贝

    C#中的浅拷贝和深拷贝 C#中有两种类型变量,一种是值类型变量,一种是引用类型变量。

    深入Java虚拟机(原书第2版).pdf【附光盘内容】

    6.3 特殊字符串 6.3.1 全限定名 6.3.2 简单名称 6.3.3 描述符 6.4 常量池 6.4.1 constant_utf8_info表 6.4.2 constant_integer_info表 6.4.3 constant_float_info表 6.4.4 constant_long_...

    Java 基础核心总结 +经典算法大全.rar

    获取类中的变量(Field) 获取类中的方法(Method) 获取类的构造器(Constructor) 获取注解 通过反射调用方法反射的应用场景 Spring 的 IOC 容器反射 + 抽象工厂模式 JDBC 加载数据库驱动类反射的优势及缺陷 增加程序的...

    微软JavaScript手册

    indexOf 方法 返回在 String 对象中第一次出现子字符串的字符位置。 不相等运算符 (!=) 比较两个表达式,看是否不相等。 Infinity 属性 返回 Number.POSITIVE_INFINITY 的初始值。 input 属性 返回进行查找的...

Global site tag (gtag.js) - Google Analytics