先看个实例吧:
public static void main(String[] args) {
NewsJob job = new NewsJob();
job.setId(UUIDGenerator.getUUID());
System.out.println(job.getId());
NewsJob job2 = job;
job2.setId("asdf");
System.out.println(job.getId());
System.out.println(job2.getId());
}
输出结果为:
4adc3123c1d94e63a57c30b4bd9884a9
asdf
asdf
原理:
有两个实例A、B,要实现把B的值赋给A,大部分初学者会想到A=B,没错,进行这个操作以后,实例A、B包含的值是相同的,不过实际上却与我们期望的有所差异。我们知道A、B是实例句柄,而对象的实际数据是保存在内存堆中,在Java中执行A=B,实际上是把句柄B的值赋给句柄A,用C的说法就是,把指针B赋给指针A。OK,现在我们明白了,其实句柄A原来引用的对象已经失去了,再没法找回,句柄A、B已经引用到同一个内存堆的对象上去了,当然实例A、B是相同的,而句柄A原来引用的对象所占用的内存就靠GC来回收了。
现在我们如果修改实例A的数据成员的值,同样实例B的相应数据成员也会被修改成同样的值,这很容易理解,因为实例A、B引用的同一个对象实体。
分享到:
相关推荐
Java 中的基本类型和引用类型变量是两个不同的概念,它们在内存分配、变量赋值和函数传递等方面有着本质的区别。 基本类型是 Java 中的八种基本类型,包括 byte、short、int、long、float、double、char 和 boolean...
通过以上讨论,我们可以看到,Java中子类对象赋值给父类对象是一种强大且灵活的设计模式,它允许我们在代码中使用抽象的父类引用,从而简化编程,增加代码的通用性和可维护性。在实际项目中,合理利用这一特性,能够...
### 浅析Java引用类型和方法参数传递 #### 一、引言 在Java编程语言中,理解数据类型的处理方式对于编写高效、可维护的代码至关重要。本文将深入探讨Java中的引用类型及其如何影响方法参数的传递机制。通过具体实例...
- 强引用是最常见的引用类型,即通常的变量赋值。只要对象通过强引用与任何可达变量关联,就不会被垃圾收集器回收。例如: ```java String str = new String("Hello"); ``` - 当强引用导致内存泄漏时,如在缓存...
如果是引用类型,则参数`value`必须是该类型的实例。 4. **Field.get()**:获取指定对象的字段值。 #### 实现细节与注意事项 - **异常处理**:使用反射时应谨慎处理异常,例如`NoSuchFieldException`和`...
在Java编程语言中,String类型变量的赋值问题是一个重要的概念,主要涉及到对象引用和不可变性。这里我们将深入探讨这两个关键点。 首先,Java中的String类是不可变的,这意味着一旦创建了一个String对象,就不能...
当我们创建一个接口类型的引用并将其赋值给实现该接口的类的对象时,这个引用变量可以调用接口中定义的所有方法。在运行时,实际调用的是哪个实现类的方法,取决于引用变量实际指向的对象。 以下是一个简单的例子:...
值类型如整型、浮点型、布尔型等,它们在赋值或作为参数传递时会进行副本复制,而引用类型则有所不同。本篇文章将详细探讨引用类型的传值方式。 首先,理解引用类型的概念至关重要。引用类型包括类(classes)、...
Java中的String类型是一种特殊的引用类型,它被设计为不可变对象。这意味着一旦创建了一个String对象,就不能更改它的值。这是由于String对象存储在常量池中,修改String对象实际上会创建一个新的对象,而原始对象...
在Java中,为了更好地管理对象的生命周期,从JDK 1.2开始引入了四种不同级别的引用类型:强引用、软引用、弱引用和虚引用。每种引用类型都有其特定的应用场景,通过灵活运用这些引用类型,开发者可以在内存管理和...
Java编程语言中有两种基本的数据类型:原始类型(Primitive Types)和引用类型(Reference Types),它们在行为、存储和使用上存在显著的区别。 1. **原始类型(Primitive Types)**: - Java的原始类型包括布尔型...
在Java编程语言中,`String`类型的变量有一些特殊的性质,这主要源于它的不可变性(immutability)。不可变性意味着一旦一个`String`对象被创建,它的内容就不能被修改。下面我们将深入探讨这个问题,并通过给出的...
- **自动类型转换**:当一个较低级别的基本数据类型赋值给一个较高级别的数据类型时,系统会自动进行类型提升,如`byte`到`int`,`char`到`int`。例如,`byte b = 10; int i = b;` - **强制类型转换**:相反,从高...
原因在于Java中的赋值操作对于引用类型来说,仅仅是改变了局部变量(即方法内部的`b`或`sb1`)的引用,而非原始对象的引用。 例如,在`modifyA`方法中,`b = "转变的值";`这行代码创建了一个新的`String`对象,并让...
4. **赋值**: `=` 运算符将新创建的对象的内存地址赋值给引用变量 `stu`。 #### 三、对象与引用之间的关系 为了更直观地理解对象与引用之间的关系,可以将其比喻为风筝与线之间的关系。假设我们有一个风筝,但没有...
- 范围较大的数据类型赋值给范围较小的数据类型时,需要强制类型转换,例如`(short) value`,但可能会丢失精度或导致溢出。 2. 浮点型转换: - float可以自动转换为double,但double不能自动转换为float,因为...
在Java编程语言中,类赋值是一个至关重要的概念,它涉及到对象引用以及内存管理。本文将深入探讨类赋值的原理,并通过实例来详细解析这一主题。 首先,我们需要理解Java中的对象和引用。在Java中,当我们创建一个类...
- **转换示例**: 在Java中,可以通过多态来实现引用数据类型的隐式转换,例如将子类对象赋值给父类引用变量。 #### 强制手动类型转换 强制手动类型转换是指程序员明确指定的类型转换过程,通常用于较大类型向较小...
在Java编程语言中,引用类型变量实际上是对象的引用或指针,而非对象本身。当我们讨论“引用类型传值”时,意味着在方法调用时,传递的是对象引用的一个副本,而不是对象本身。以下是对给定代码清单的详细解释: 1....