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的赋值更类似于基本类型.
分享到:
相关推荐
其最显著的特点在于,无论创建多少个该类的实例,`static`变量在内存中仅存在一份拷贝,这意味着所有实例共享同一份变量值。这不仅节约了内存资源,还便于统一管理和访问,因为可以直接通过类名进行访问,无需实例化...
在Java编程语言中,了解和区分不同类型的变量和方法是至关重要的。这关系到程序的结构、内存管理和代码的可维护性。以下是关于Java成员变量、局部变量、静态变量以及成员方法和全局方法的基本概念和区别的详细阐述。...
在示例中,`tag` 的值被转换成字符串并附加到 `a` 的末尾,形成 "Tomorrow is the %d" 的格式化字符串。`sprintf()` 是非常灵活的,可以处理各种数据类型,并且允许使用格式控制符来定制输出。 这些函数在SIMATIC ...
Java编程语言中有三种主要的变量类型:成员变量(也称为实例变量)、类变量(也称为静态变量)和局部变量。理解这些变量之间的区别是掌握Java基础的重要部分,这对于编写高效、可维护的代码至关重要。 成员变量是...
在 Java 中,类的分类主要有三种: 1. **普通类**:这是最常见的类,需要通过 `new` 关键字实例化后才能使用。实例化一个类意味着创建了一个对象,这个对象可以访问类中定义的非静态成员。 2. **抽象类**:抽象类...
Java 类变量和方法是编程语言Java的核心组成部分,它们定义了类的行为和属性。在这个文档中,我们将深入探讨这些概念。 首先,我们来看类的修饰符。在Java中,类可以被`public`、`abstract`或`final`修饰。`public`...
Java是一种广泛使用的面向对象的编程语言,其变量的声明和使用是编程的基础。在这个文档“java变量的五种方式t共2页.pdf.zip”中,我们预计会涵盖Java中的五种主要的变量类型及其用法。尽管实际内容无法在当前环境中...
### 静态的魔力:Java中静态方法和变量的深度解析 #### 一、引言 Java作为一门强大的编程语言,在软件开发领域占据着举足轻重的地位。其面向对象的特性、跨平台的能力以及强大的标准库,使得Java成为开发企业级...
### Java中的静态变量、静态方法、静态块与静态类 #### 一、静态变量 静态变量,也称为类变量,是定义在类中方法之外的,并且被`static`关键字修饰的变量。这类变量并不属于类的任何实例,而是属于类本身。这意味...
- clone() 方法是 Java 中的一个方法,它可以创建对象的拷贝,但是需要实现 Cloneable 接口,clone() 方法可以创建浅拷贝或深拷贝,浅拷贝只拷贝对象的引用,而深拷贝则拷贝对象的所有成员变量。 - 序列化机制是 ...
- 局部变量:存在于方法、构造器或块中,生命周期仅限于该方法、构造器或块的执行期间。局部变量必须在使用前初始化。 7. Java的命名规范: - 包名:所有字母小写,如`xxxyyyzzz`。 - 类名和接口名:每个单词首...
2. 字符串不可变性:Java中的String类是final的,这意味着一旦创建了字符串对象,就不能改变它的内容。任何试图修改字符串的操作(如`append()`、`substring()`)都会返回一个新的字符串对象,而不是修改原始对象。 ...
2. 封装:Java 语言提供了封装机制,通过访问控制符(Access Modifier)来控制成员变量和成员方法的访问权限,例如 public、private、protected 等。 3. 继承:Java 语言提供了继承机制,通过继承可以实现代码的重用...
在描述中提到的“取文本地址”,这通常是指获取字符串变量在内存中的起始地址。在易语言中,字符串是以字符数组的形式存储的,每个字符占用一个字节。获取文本地址后,可以通过指针操作读取或修改字符串的内容。 ...
浅拷贝是指创建一个新的对象,然后将原对象的所有非引用类型的成员变量复制到新对象中,但对于引用类型的成员变量,则只复制引用本身。这意味着原对象和新对象中的引用类型成员变量指向同一对象。例如: ```java ...
Java编程语言中有三种类型的变量:类变量(静态变量)、实例变量和局部变量,每种都有其特定的用途和生命周期。 1、类变量(静态变量) 类变量,也被称为静态变量,使用`static`关键字声明,存在于类的静态存储区。...
在IT行业中,Java是一种广泛应用的面向对象编程语言,以其健壮性、可移植性和高性能而闻名。本话题将深入探讨Agile Java中的类方法和类变量,这些是面向对象编程的基础概念,对于理解和编写高质量的Java代码至关重要...