`
悟空派来的猴子
  • 浏览: 65036 次
  • 性别: Icon_minigender_2
  • 来自: 杭州
文章分类
社区版块
存档分类
最新评论

改变引用指向

阅读更多
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); 关键也在此,理由同上



















分享到:
评论

相关推荐

    java中传值与传引用

    这意味着,尽管函数不能改变引用指向的对象,但可以修改对象的属性。例如,`changeModel(Model model)`函数中,`model`是`main`方法中`model`的一个引用副本,函数内部可以修改`model`引用的对象的属性,但不能改变`...

    引用和对象的关系,还有值传递

    - **改变引用指向**:通过`veh2 = new Vehicle();`,`veh2`将指向一个新的`Vehicle`对象。此时,原来由`veh2`指向的对象不再有任何引用指向它,因此可能成为垃圾回收的目标。 #### 5. 值传递与引用传递 在Java中,...

    java参数传递时到底是值传递还是引用传递[归类].pdf

    因此,尽管可以改变对象的状态(即其属性),但不能改变引用指向的对象。这也是为什么有人会说Java是值传递,因为传递的是对象引用的副本,而不是实际的对象;同时,也有人会说Java是引用传递,因为通过这个引用可以...

    python数字金字塔-32-了解引用之不可变类型.ev4.rar

    当你尝试修改这些类型的一个实例时,Python实际上会创建一个新的对象,并改变引用指向这个新对象,而不是在原地修改。 例如,尝试修改字符串: ```python s1 = "hello" s2 = s1 + " world" ``` 虽然看起来`s1`被...

    C++与操作系统等面试题3

    这意味着无法在函数内部改变引用指向的对象。 #### 指针传递与引用传递的区别 1. **可变性:** 指针可以改变其指向的对象,而引用一旦初始化后就不能改变其绑定的对象。 2. **初始化:** 引用必须在定义时初始化,...

    Java是值传递,传对象引用也是通过值

    这意味着,尽管我们不能改变引用指向的对象,但我们可以通过引用访问并修改对象的属性: ```java public class Test { public static void main(String[] args) { Person person = new Person("Alice"); ...

    Java 值传递Visio资源

    因此,尽管在方法内部不能改变引用指向的对象,但可以通过这个引用来修改对象的属性。"方法传入对象类型参数,对象引用不能被修改.png"和".vsd"文件可能描绘了当方法尝试更改对象引用时,外部引用仍然指向原对象,而...

    引用数据类型改变堆的指向地址.png

    引用数据类型改变堆的指向地址.png

    C++面试题集锦.pdf

    引用传递时,不能改变引用指向的对象。 - **编译角度:** 指针和引用在符号表中的表示不同,指针存储自身地址,引用存储实参地址。 #### 四、形参与实参的区别 **1. 生命周期:** - **形参:** 调用函数时分配内存...

    方法的参数的传递机制1

    这意味着当你传递一个对象的引用时,你不能改变引用指向的对象,但可以修改对象的属性。 3. **特殊类型:String和包装类的不可变性**: 尽管String和包装类(如Integer, Boolean等)的对象看起来像是通过引用传递...

    Java-Java面向对象多态性教程

    // 可以改变引用指向 myRunnable.run(); // 输出 "Horse is running" } } ``` 3. 方法的覆盖(Override):当子类继承父类并重新定义了父类中的某个方法时,这就叫做方法覆盖。在多态中,如果父类引用指向子类...

    函数的返回值(微软).

    - **不可改变**: 一旦引用被初始化为指向一个特定的变量,就不能改变引用指向其他变量。 - **不占用额外空间**: 引用本身并不占用额外的存储空间。 **示例**: ```c++ int a = 10; int& ref_a = a; // ref_a 是 a 的...

    Java零基础-参数传递-2.md

    如果尝试改变引用指向另一个对象,那么这种改变只在方法内部有效,不会影响到原始引用。 - **可变参数列表的限制**:虽然可变参数列表非常方便,但它也有一些限制,比如不能与其他参数一起出现在方法签名中,只能...

    浅谈Java中方法的参数传值.zip

    但请注意,不能改变引用指向另一个对象,因为这只是副本,不是真正的引用传递: ```java public void changeObject(MyObject obj) { obj.value = 10; // 修改对象的成员变量 } MyObject originalObj = new My...

    并发编程 70 道面试题及答案.docx

    * volatile数组的特点:如果改变引用指向的数组,将会受到volatile的保护,但是如果多个线程同时改变数组的元素,volatile标示符就不能起到之前的保护作用了。 9. volatile变量和atomic变量 * volatile变量:可以...

    scjp考试学习笔记

    - 在方法内部,可以改变引用指向的对象,但方法结束后,引用会恢复到调用时的状态,指向原来的对象。 - 如果在方法内修改了对象的属性,即使方法结束后,对象的属性改变依然有效。 3. **方法重载**: - 方法重载...

    Java试题笔试题目答案.docx

    这意味着如果改变引用指向的数组,其他线程可以看到这个变化,但对数组元素的并发修改不会受到`volatile`的保护。 2) `volatile`不能使非原子操作变为原子操作。例如,对非`volatile`的`long`或`double`类型的变量...

    Value

    对引用类型的变量进行操作,实际上是改变引用指向的对象,而不是变量本身。这是理解面向对象编程中一个关键的区别。 五、数据结构中的值 在数据结构如数组、链表、树等中,每个元素通常包含一个或多个值。例如,...

Global site tag (gtag.js) - Google Analytics