`
zhengyu
  • 浏览: 4546 次
  • 性别: Icon_minigender_1
  • 来自: 潮州
最近访客 更多访客>>
文章分类
社区版块
存档分类
最新评论

传值与传引用的理解

阅读更多
例子代码
public class ParaTest {

	protected int intNum = 0;//栈A

	public static void main(String[] args) {
		ParaTest pt=new ParaTest();//对像A
		
		
		pt.change(pt.intNum);
		System.out.println("change int "+pt.intNum);(1)
		
		pt.change(pt);
		System.out.println("change pt.int "+pt.intNum);(2)
		
		pt.add(pt.intNum);
		System.out.println("add pt "+pt.intNum);(3)
		
		pt.add(pt);
		System.out.println("add pt "+pt.intNum);(4)
		
	}

	public void change(int i) {栈B
		i = 5;//	(5)
	}

	public void change(ParaTest t) {
             ParaTest tmp = new ParaTest();//对像B
	    tmp.intNum = 9;
	    t = tmp;
             System.out.println("change pt.int inner"+t.intNum);(6)
	}

	public void add(int i) {栈C
		i += 10;//(7)

	}
	
	public void add(ParaTest pt){
	    pt.intNum+=20;
             System.out.println("change pt.int inner"+t.intNum);(8) 
	}

}

呵呵...今晚看这个例子时,朋友说你要理解原理的话,不管题目怎么变,你依然能看出是传了值还是传了引用...
先看看参数为ParaTest的两个方法
public void change(ParaTest t) {
		ParaTest tmp = new ParaTest();//对像B
		tmp.intNum = 9;
		t = tmp;

}
public void add(ParaTest pt){
		pt.intNum+=20;
}


    调用change(ParaTest t)方法后,方法外部传入的引用变量 pt 中的intNum的值还是没变的.因为执行main这个方法时,main方法所有的东西都存在一个栈中.这个栈中有一格是存放 pt 这个变量的指针的..pt 的指针指内堆中的new ParaTest()对像.即main方法中第一行代码里新建的 ParaTest()对像.

    当在main 中调用change(ParaTest t)时,又会出现一个栈是存放这个方法体中的所有东西,在change(ParaTest t)方法中的栈有一格是存放了传入参数t的指针,也有一格是存放了tmp变量的指针,tmp的指针指向的是change(ParaTest t)中新建的ParaTest对像,跟传入参数t的指针所指的不是同一个对像.

    当执行t=tmp;这条语句时,tmp的指针会复盖掉t的指针,此时 t 的指针将指向change(ParaTest t)方法中第一行代码所新建的那个B对像.由于对像B的intNum的值已经被赋值成9.所以代码中(6)这句打印时,出来的t.intNum的结果是9.因为(6)的打印语句中的 t 指的是对像B.在(2)这句打印语句中 pt 指的对像是对像A.因为A的intNum值没变改变,所以打印出来结果是0.而在add(ParaTest pt)由于pt的指针是一直指向对像A的.即在add(ParaTest pt)中, pt 这个变量没被重新赋值,所以pt.intNum值改变时,对像A的intNum值也跟着改变.打印语句(4)的打印结果是20.

	public void change(int i) {//栈B
		i = 5;	//(5)
	}

	public void add(int i) {//栈C
		i += 10;  //(6)

	}

    change(int i)与add(int i)这两个方法由于传的都是基本类型,JAVA中基本类型参都是传值的.基本类型在堆中有并没有相应的对像.在执行change(int i)与add(int i)方法时,都会各自产生一个栈,栈里都有一格是用来存放参数变量,即栈B,与栈C.所以,无论是类的全局变量栈A,或方法中的局部变量栈B,栈C,它们都在自已所属的栈中占有一个独立的位置,所以代码(5)跟(6)的操作,并不会改变栈A的值,所以(1)跟(3)处打印出来pt.intNum的值还是0.如果在change(int i)与add(int i)这两个方法中打印出i的值的话,则会是5跟10.

    到这里终于对传值还是传引用明白多了.呵呵,不知道别人能看明白我这篇东西不?文彩不好,请见谅了... 睡觉
0
0
分享到:
评论

相关推荐

    深入理解JavaScript中的传值与传引用

    主要是对JavaScript中的传值与传引用进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助

    java及C++中传值传递、引用传递和指针方式的理解.docx

    java及C++中传值传递、引用传递和指针方式的理解.docx

    struts2传值

    传值问题 在其中取值的方法有两种: #+映射名, 直接写映射名。 1.不加#的方式获取(所有对象放置在栈顶): a.XXaction中有该字段的成员变量. b.XXaction中该对象返回个给实现对象ModelDriven的泛型, 即action中下面...

    深入理解python中函数传递参数是值传递还是引用传递

    Python不允许程序员选择采用传值还是传 引用。Python参数传递采用的肯定是“传对象引用”的方式。实际上,这种方式相当于传值和传引用的一种综合。如果函数收到的是一个可变对象(比如字典 或者列表)的引用,就能...

    java及C++中传值传递、引用传递和指针方式的理解

    为什么 Java 只有值传递,但 C++ 既有值传递,又有引用传递呢?今天我们就来探讨下这个问题,有需要的朋友可以参考下

    浅谈js中的引用和复制(传值和传址)

    好像一般很少人讲到js中的引用和复制,不过弄清楚这个概念可以帮助理解很多东西 先讲一下很基础的东西,看看js中几种数据类型分别传的什么 引用:对象、数组、函数 复制:数字、布尔 字符串单独说明,因为它的特殊性...

    深入理解JavaScript的值传递和引用传递

    JavaScript有5种基本的数据类型,分别是:布尔、null、undefined、String和Number。这篇文章主要介绍了JavaScript的值传递和引用传递,需要的朋友可以参考下

    c#基础系列之ref和out的深入理解

    C#有两种参数传递方式:传值和引用,传值就是变量的值,而引用则是传递的变量的地址; 本文中说的Ref和Out都是引用传递,Ref的重点是把值传给调用方法,Out则是得到调用方法的值,类似于有返回类型的方法返回的值; ...

    Nuxt pages下不同的页面对应layout下的页面布局操作

    layouts 根目录下的所有文件都属于个性化布局文件,可以在页面组件中利用 layout 属性来引用。 pages文件下组件的layout属性值为layout文件下的所对应的布局组件的名称 请确保在布局文件里面增加 <nuxt> 组件用于...

    JavaScript中引用vs复制示例详析

    字符串单独说明,因为它的特殊性,无法确定是传递引用还是复制数值(因为字符串的值是没法改变的,所以纠结这个问题也是没意义的)但是用于比较的时候显然是属于传值比较 下面来一起看看详细的介绍吧 首先我们看下面...

    javascript的变量、传值、传址、参数之间关系

    引用类型包括:Array,Object,Function(可以这么理解,非基本类型的都是引用类型);5种基本类型包括:undefined,null,string,boolean,number 2.函数的参数的传递的机制是复制变量值。 书上说:”把函数外部的值复制...

    函数调用的信息传递

    传值调用,传址调用,引用调用。让你深刻理解函数调用的信息传递

    javascript中的变量是传值还是传址的?

    传址和传引用是一回事。 一门编程语言的核心是数据结构,粗略来讲,可以把数据结构分成不可变类型(immutable)和可变类型(mutable)。为什么这么分呢?这涉及到内存分配问题。对于不可变类型,只要分配有限的内存...

    摩托罗拉C++面试题

    传值,传指针或者引用 6.结合一个项目说明你怎样应用设计模式的理念。 设计模式更多考虑是扩展和重用,而这两方面很多情况下,往往会被忽略。 不过,我不建议滥用设计模式,以为它有可能使得简单问题复杂化. 7....

    Effective C++

    条款22:尽量用传引用而不用传值 条款23:必须返回一个对象时不要试图返回一个引用 条款24:在函数重载与设定参数默认值间慎重选择 条款25:避免对指针与数字类型的重载 条款26:当心潜在的二义性 条款27:如果不想使用...

    C语言进阶-牟海军.pdf

     堆和栈、全局变量和局部变量、生存期和作用域、内部函数和外部函数、指针变量、指针数组和数组指针、指针函数和函数指针、传址和传值、递归和嵌套、结构体和共用体、枚举、位域等较难理解的核心概念的阐述和对比...

    C语言进阶 作者 Wrestle.Wu

     堆和栈、全局变量和局部变量、生存期和作用域、内部函数和外部函数、指针变量、指针数组和数组指针、指针函数和函数指针、传址和传值、递归和嵌套、结构体和共用体、枚举、位域等较难理解的核心概念的阐述和对比...

    java深入理解浅拷贝和深拷贝

    java的赋值都是传值的,对于基础类型来说,会拷贝具体的内容,但是对于引用对象来说,存储的这个值只是指向实际对象的地址,拷贝也只会拷贝引用地址。 因为引用对象的存在,所以经常会出现和预期不一样的情况。 本文...

    Hibernate教程

    20.5. 理解集合性能(Understanding Collection performance) 20.5.1. 分类(Taxonomy) 20.5.2. Lists, maps 和sets用于更新效率最高 20.5.3. Bag和list是反向集合类中效率最高的 20.5.4. 一次性删除(One ...

Global site tag (gtag.js) - Google Analytics