`
悟空派来的猴子
  • 浏览: 64432 次
  • 性别: 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); 关键也在此,理由同上



















分享到:
评论

相关推荐

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

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

    指针和引用的区别

    1.从现象上看:指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变 2.从内存分配上看:程序为指针变量分配内存区域,而引用不分配内存区域 3.从编译上看:程序在编译时分别将指针和引用添加到...

    C++对象和指针的引用

    从输出结果可以看出,当在被调用函数fun中,改变了对象的数据成员值[m1.setxy(12, 15)]和指向对象指针的数据成员值[m2->setxy(22, 25)]以后,可以看到只有指向对象指针作参数所指向的对象被改变了,而另一个对象作...

    内存中引用与指针之间的使用与区别

    深入理解引用与指针的关系从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被...

    java的传值与传引用详解

     如果我们定义了不止一个引用指向同一个对象,那么这些引用是不相同的,因为引用也是一种数据类型,需要一定的内存空间来保存。但是它们的值是相同的,都指示同一个对象在内存的中位置。比如 String a = "Hello"; ...

    浅谈C++左值引用和右值引用

    引用可以改变指针的指向,还可以改变指针所指向的值。 引用的基本规则: 声明引用的时候必须初始化,且一旦绑定,不可把引用绑定到其他对象;即引用必须初始化,不能对引用重定义; 对引用的一切操作,就相当于对原...

    c++面试题题目集锦

    2)引用在定义的时候必须进行初始化,并且不能够改变。指针在定义的时候不一定要初始化,并且指向的空间可变。(注:不能有引用的值不能为NULL) 3)有多级指针,但是没有多级引用,只能有一级引用。 4)指针和引用的...

    C/C++中指针和引用之相关问题深入研究

    它们的区别:①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,...

    上课时的练习代码主要为C语言代码,部分C++.rar

    作为参数传递时,指针需要被解引用才可以对对象进行操作,而直接对引用的修改都会改变引用所指向的对象; 指针在使用中可以指向其他对象,但是引用只能是一个对象的引用,不能被改变; 指针可以是多级,而引用没有

    大公司c与c++面试题汇总

    大公司c++求职面试题 1. static有什么用途?(请至少说明两种) ... 3) 不存在指向空值的引用,但是存在指向空值的指针。 3. 描述实时系统的基本特性 在特定时间内完成特定的任务,实时性与可靠性

    C/C++中指针和引用之相关问题研究

    它们的区别:①从现象上看,指针在运行时可以改变其所指向的值,而引用一旦和某个对象绑定后就不再改变。这句话可以理解为:指针可以被重新赋值以指向另一个不同的对象。但是引用则总是指向在初始化时被指定的对象,...

    Java岗面试核心MCA版

    new关键字,new创建对象实例(对象实例在堆内存中),对象引用指向对象实 例(对象引用存放在栈 内存中)。一个对象引用可以指向0个或1个对象(一根 绳子可以不系气球,也可以系一个气球);一个 对象可以有n个引用...

    还是一部分C++面试题

    3) 不存在指向空值的引用,但是存在指向空值的指针。 3. 描述实时系统的基本特性 在特定时间内完成特定的任务,实时性与可靠性 4. 全局变量和局部变量在内存中是否有区别?如果有,是什么区别? 全局变量储存在...

    C语言面试题大全(很全的挺好)

    C语言面试题大全 1.限制变量的作用域(DL:使其只在定义的当前文件中起作用,static是只能由与变量在同一个文件中定义的程序 存取的全局变量。...2) 不存在指向空值的引用,但是存在指向空值的指针。 。。。。。

    C++ 中指针和引用有什么区别详解

    2指针初始化以后可以改变指向的对象,而引用定义的时候必须要初始化,且初始化以后不允许再重新绑定对象。 3.所以引用访问对象是直接访问。指针访问对象是间接访问。 4。如果pa是指针,那么*pa就是引用了。 但是两者...

    C++ 指针和引用的区别

     指针从本质上讲是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。  而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,...

    2个数组指向同一个空间.txt

    数组一旦被创建,就不能改变它的大小。 例如: a = new int[10]; //将 a 初始化为大小为 10 的整型数组。 int[] b = {0,1,2,3} //将 b 初始化为大小为 4 的整型数组, //并且 4 个分量的值分别等于 0,1,2,3 ...

    Java垃圾回收详解

    垃圾回收 对象是使用new创建的, 但是并没有与之相对应的delete操作来回收对象占用的内存. 当我们完成对某个 对象的使用时, 只需停止该对象的引用: ...->将引用指向null ->从方法中返回, 使得该方法的局部变量不复存在

    C++中指针和引用的区别分析

    指针从本质上讲就是存放变量地址的一个变量,在逻辑上是独立的,它可以被改变,包括其所指向的地址的改变和其指向的地址中所存放的数据的改变。 而引用是一个别名,它在逻辑上不是独立的,它的存在具有依附性,所以...

    JavaScript中的this引用(推荐)

    this引用 引用(指向)的是一个对象,它有着会根据代码上下文语境自动改变其引用对象的特性。它的引用规则如下: • 在最外层代码中,this引用 引用的是全局对象。 • 在函数内,this引用根据函数调用的方式的...

Global site tag (gtag.js) - Google Analytics