`
iwindyforest
  • 浏览: 233686 次
  • 性别: 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的赋值更类似于基本类型.
分享到:
评论

相关推荐

    java中的static变量,方法,代码块

    其最显著的特点在于,无论创建多少个该类的实例,`static`变量在内存中仅存在一份拷贝,这意味着所有实例共享同一份变量值。这不仅节约了内存资源,还便于统一管理和访问,因为可以直接通过类名进行访问,无需实例化...

    Java成员变量局部变量静态变量成员方法全局方法等概念的区

    在Java编程语言中,了解和区分不同类型的变量和方法是至关重要的。这关系到程序的结构、内存管理和代码的可维护性。以下是关于Java成员变量、局部变量、静态变量以及成员方法和全局方法的基本概念和区别的详细阐述。...

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

    在示例中,`tag` 的值被转换成字符串并附加到 `a` 的末尾,形成 "Tomorrow is the %d" 的格式化字符串。`sprintf()` 是非常灵活的,可以处理各种数据类型,并且允许使用格式控制符来定制输出。 这些函数在SIMATIC ...

    Java成员变量类变量局部变量的区别共5页.pdf.zip

    Java编程语言中有三种主要的变量类型:成员变量(也称为实例变量)、类变量(也称为静态变量)和局部变量。理解这些变量之间的区别是掌握Java基础的重要部分,这对于编写高效、可维护的代码至关重要。 成员变量是...

    JAVA类的方法调用和变量

    在 Java 中,类的分类主要有三种: 1. **普通类**:这是最常见的类,需要通过 `new` 关键字实例化后才能使用。实例化一个类意味着创建了一个对象,这个对象可以访问类中定义的非静态成员。 2. **抽象类**:抽象类...

    Java类变量和方法.doc

    Java 类变量和方法是编程语言Java的核心组成部分,它们定义了类的行为和属性。在这个文档中,我们将深入探讨这些概念。 首先,我们来看类的修饰符。在Java中,类可以被`public`、`abstract`或`final`修饰。`public`...

    java变量的五种方式t共2页.pdf.zip

    Java是一种广泛使用的面向对象的编程语言,其变量的声明和使用是编程的基础。在这个文档“java变量的五种方式t共2页.pdf.zip”中,我们预计会涵盖Java中的五种主要的变量类型及其用法。尽管实际内容无法在当前环境中...

    静态的魔力:Java中静态方法和变量的深度解析

    ### 静态的魔力:Java中静态方法和变量的深度解析 #### 一、引言 Java作为一门强大的编程语言,在软件开发领域占据着举足轻重的地位。其面向对象的特性、跨平台的能力以及强大的标准库,使得Java成为开发企业级...

    Java中的静态变量静态方法静态块与静态类.docx

    ### Java中的静态变量、静态方法、静态块与静态类 #### 一、静态变量 静态变量,也称为类变量,是定义在类中方法之外的,并且被`static`关键字修饰的变量。这类变量并不属于类的任何实例,而是属于类本身。这意味...

    JAVA创建对象的四种方法

    - clone() 方法是 Java 中的一个方法,它可以创建对象的拷贝,但是需要实现 Cloneable 接口,clone() 方法可以创建浅拷贝或深拷贝,浅拷贝只拷贝对象的引用,而深拷贝则拷贝对象的所有成员变量。 - 序列化机制是 ...

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

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

    在C语言函数中调用汇编语言程序实现字符串的拷贝

    在C语言中,我们通常使用标准库函数如`strcpy`来拷贝字符串。然而,在某些特定情况下,如优化性能或理解底层操作,我们可能需要直接调用汇编语言程序来实现这一功能。在这个主题中,我们将探讨如何在C语言函数中嵌入...

    Java变量(学习笔记).pdf

    - 局部变量:存在于方法、构造器或块中,生命周期仅限于该方法、构造器或块的执行期间。局部变量必须在使用前初始化。 7. Java的命名规范: - 包名:所有字母小写,如`xxxyyyzzz`。 - 类名和接口名:每个单词首...

    MLDN魔乐JAVA_08字符串题目、引用传递.rar

    2. 字符串不可变性:Java中的String类是final的,这意味着一旦创建了字符串对象,就不能改变它的内容。任何试图修改字符串的操作(如`append()`、`substring()`)都会返回一个新的字符串对象,而不是修改原始对象。 ...

    Java第三章习题

    2. 封装:Java 语言提供了封装机制,通过访问控制符(Access Modifier)来控制成员变量和成员方法的访问权限,例如 public、private、protected 等。 3. 继承:Java 语言提供了继承机制,通过继承可以实现代码的重用...

    易语言内存取变量数据地址

    在描述中提到的“取文本地址”,这通常是指获取字符串变量在内存中的起始地址。在易语言中,字符串是以字符数组的形式存储的,每个字符占用一个字节。获取文本地址后,可以通过指针操作读取或修改字符串的内容。 ...

    java中的指针,引用及对象的clone

    浅拷贝是指创建一个新的对象,然后将原对象的所有非引用类型的成员变量复制到新对象中,但对于引用类型的成员变量,则只复制引用本身。这意味着原对象和新对象中的引用类型成员变量指向同一对象。例如: ```java ...

Global site tag (gtag.js) - Google Analytics