`
- 浏览:
65119 次
- 性别:
- 来自:
杭州
-
public class test {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b= new StringBuffer("B");
operate(a,b);
System.out.println(a+","+b);
}
static void operate(StringBuffer x ,StringBuffer y){
x.append(y);
y = x;
y.append("c");
}
}
假设
new StringBuffer (“A”); 为内存1
new StringBuffer (“B”); 为内存2
a - 内存1
b- 内存2
方法的参数是引用的复制。虽然指向的是同一内存区域,但却是不同的句柄。
operate (StringBuffer x, StringBuffer y)
x - 内存1
y- 内存2
当 y = x时,是改变了 y 的引用指向,而不是 b 的,这里操作这块内存是没有问题的,但这样改变了引用的指向,也就是
x - 内存1
y- 内存1
这样对B指向的内存没有影响。
稍改了一下代码,这时Y已指向内存1了。
-------------
public class Foo {
public static void main(String[] args) {
StringBuffer a = new StringBuffer("A");
StringBuffer b = new StringBuffer("B");
operate(a, b);
System.out.println(a + "," + b);
}
static void operate(StringBuffer x, StringBuffer y) {
x.append(y);
y = x;
y.append("C");
}
}
ABC,B
参数是对象 ,副本和母本的值相同,指向了同一个对象,所以对副本指向的对象的操作会改变母本指向的对象的属性,所以x.append(y)会改变副本所指的对象的属性,而y=x只是修改副本的值,实参所指的对象的属性没有变化
再如:
public class Test1 {
public static void add(Integer i){
int val = i.intValue();
val +=3;
i = new Integer(val);
}
public static void main(String[] args) {
Integer i = new Integer(0);
add(i);
System.out.println(i.intValue());
}
}
i= new Integer(val); 关键也在此,理由同上
分享到:
Global site tag (gtag.js) - Google Analytics
相关推荐
这意味着,尽管函数不能改变引用指向的对象,但可以修改对象的属性。例如,`changeModel(Model model)`函数中,`model`是`main`方法中`model`的一个引用副本,函数内部可以修改`model`引用的对象的属性,但不能改变`...
- **改变引用指向**:通过`veh2 = new Vehicle();`,`veh2`将指向一个新的`Vehicle`对象。此时,原来由`veh2`指向的对象不再有任何引用指向它,因此可能成为垃圾回收的目标。 #### 5. 值传递与引用传递 在Java中,...
因此,尽管可以改变对象的状态(即其属性),但不能改变引用指向的对象。这也是为什么有人会说Java是值传递,因为传递的是对象引用的副本,而不是实际的对象;同时,也有人会说Java是引用传递,因为通过这个引用可以...
当你尝试修改这些类型的一个实例时,Python实际上会创建一个新的对象,并改变引用指向这个新对象,而不是在原地修改。 例如,尝试修改字符串: ```python s1 = "hello" s2 = s1 + " world" ``` 虽然看起来`s1`被...
这意味着无法在函数内部改变引用指向的对象。 #### 指针传递与引用传递的区别 1. **可变性:** 指针可以改变其指向的对象,而引用一旦初始化后就不能改变其绑定的对象。 2. **初始化:** 引用必须在定义时初始化,...
这意味着,尽管我们不能改变引用指向的对象,但我们可以通过引用访问并修改对象的属性: ```java public class Test { public static void main(String[] args) { Person person = new Person("Alice"); ...
因此,尽管在方法内部不能改变引用指向的对象,但可以通过这个引用来修改对象的属性。"方法传入对象类型参数,对象引用不能被修改.png"和".vsd"文件可能描绘了当方法尝试更改对象引用时,外部引用仍然指向原对象,而...
引用数据类型改变堆的指向地址.png
引用传递时,不能改变引用指向的对象。 - **编译角度:** 指针和引用在符号表中的表示不同,指针存储自身地址,引用存储实参地址。 #### 四、形参与实参的区别 **1. 生命周期:** - **形参:** 调用函数时分配内存...
这意味着当你传递一个对象的引用时,你不能改变引用指向的对象,但可以修改对象的属性。 3. **特殊类型:String和包装类的不可变性**: 尽管String和包装类(如Integer, Boolean等)的对象看起来像是通过引用传递...
// 可以改变引用指向 myRunnable.run(); // 输出 "Horse is running" } } ``` 3. 方法的覆盖(Override):当子类继承父类并重新定义了父类中的某个方法时,这就叫做方法覆盖。在多态中,如果父类引用指向子类...
- **不可改变**: 一旦引用被初始化为指向一个特定的变量,就不能改变引用指向其他变量。 - **不占用额外空间**: 引用本身并不占用额外的存储空间。 **示例**: ```c++ int a = 10; int& ref_a = a; // ref_a 是 a 的...
如果尝试改变引用指向另一个对象,那么这种改变只在方法内部有效,不会影响到原始引用。 - **可变参数列表的限制**:虽然可变参数列表非常方便,但它也有一些限制,比如不能与其他参数一起出现在方法签名中,只能...
但请注意,不能改变引用指向另一个对象,因为这只是副本,不是真正的引用传递: ```java public void changeObject(MyObject obj) { obj.value = 10; // 修改对象的成员变量 } MyObject originalObj = new My...
* volatile数组的特点:如果改变引用指向的数组,将会受到volatile的保护,但是如果多个线程同时改变数组的元素,volatile标示符就不能起到之前的保护作用了。 9. volatile变量和atomic变量 * volatile变量:可以...
- 在方法内部,可以改变引用指向的对象,但方法结束后,引用会恢复到调用时的状态,指向原来的对象。 - 如果在方法内修改了对象的属性,即使方法结束后,对象的属性改变依然有效。 3. **方法重载**: - 方法重载...
这意味着如果改变引用指向的数组,其他线程可以看到这个变化,但对数组元素的并发修改不会受到`volatile`的保护。 2) `volatile`不能使非原子操作变为原子操作。例如,对非`volatile`的`long`或`double`类型的变量...
- 对于引用类型,虽然不能改变引用本身,但可以改变引用指向的对象的内容,因为它们共享同一内存地址。 3. **可变参数**: - **定义**:可变参数允许方法接收不确定数量的参数,这些参数是同一种类型的。 - **...
对引用类型的变量进行操作,实际上是改变引用指向的对象,而不是变量本身。这是理解面向对象编程中一个关键的区别。 五、数据结构中的值 在数据结构如数组、链表、树等中,每个元素通常包含一个或多个值。例如,...