这个很基础很基础的问题今天才搞明白。
今天和同学讨论C++的一个函数的参数是指针的时候我无意说了一句,要是java的话就不用这么复杂了,一律传引用,于是就引起了java到底是传值还是传引用的讨论。
我之前的认识是这样的:在处理简单数据类型的时候毫无疑问是传值的,而当对象作为函数的参数的时候则是传的是引用。
但是事实证明我的认识还是错的,现在我当然明白了java的传参究竟是传什么,下面简单说一下:
可以说java不存在传递引用的情况,java只有一种传递方法就是传值,但是这个传值还是有一点小小的不同,例如在函数
java 代码
- public void testRef(SomeClass sc) {
-
- sc.someMethod();
-
-
- }
中,其中当调用此函数时
java 代码
- SomeClass someClass = new SomeClass();
- testRef(someClass);
作为形参的sc会生成实参someClass的一个拷贝,但是这个拷贝是someClass在栈空间指向堆空间的地址的拷贝,我们知道,当使用诸如A a = new A();的时候,实际上A a是在栈空间中获得了一个A对象的“引用”,当使用new A();初始化这个对象是,则是在堆空间中申请了空间同时将a指向堆空间中的地址。有了这些知识就不难理解,在方法testRef中通过
.的
操作其实就是对传进来的实参someClass进行操作,因为此时sc是someClass地址,而若执行了sc = new SomeClass();sc的
.的
操作变不会再对someClass产生影响,究其原因,是因为此时sc已经指向了堆空间中另一块SomeClass类大小的地址。
简单一点就是说,java在传递参数过程中若参数是对象传递的是对象地址的拷贝,也就是说传递的是地址的值。
这个故事告诉我:凡事不可想当然
补充,今天看sun出的SCJP指南,上面的解释比较科学
可能会问你是否理解传递值到方法中时会发生什么结果。如果方法中的代码改变了变量,对外部的方法是否可见?直接引用 Peter van der Lindens 的 Java 程序员解答的一段话(在 http://www.afu.com)
//引用
所有的变量(基本类型值和对象的引用值)都是值传递。但是这不是全部情况,对象是经常通过 Java 的引用变量来操作的。所以也可以说对象是通过引用传递的(
引用变量通过值传递) 。这是变量不使用对象的值而是像前一个问题那样描述的使用对象引用的值的结果。最后一行:调用者对基本类型参数(int,char 等)的拷贝在相应参数变化时不会改变。但是,在被调用方法改变相应作为参数传递的对象(引用)字段时,调用者的对象也改变其字段。
//引用结束
如果你来自 C++背景,你可能对值传递参数和用&符号传递引用参数熟悉。在 Java 中没有这样的选择,所有的都是值传递。但是看起来并不总是这样。如果你传递的对象是对象的引用,你不能直接对对象的引用进行操作。 所以如果你操作一个传递到方法的对象的字段, 结果就好像你按引用传递(任何改变结果都会返回到调用函数) 将对象引用作为方法变量
请看下面的例子
java 代码
- class ValHold{
- public int i = 10;
- }
- public class ObParm{
- public static void main(String argv[]){
- ObParm o = new ObParm();
- o.amethod();
- }
- public void amethod(){
- ValHold v = new ValHold();
- v.i=10;
- System.out.println("Before another = "+ v.i);
- another(v);
- System.out.println("After another = "+ v.i);
- }
- public void another(ValHold v){
- v.i = 20;
- System.out.println("In another = "+ v.i);
- }
- }
程序的输出结果是
Before another = 10
In another = 20
After another = 20
看变量 i 是怎么被修改的。如果 Java 总是值传递(也就是对变量的拷贝) ,它是怎么被修改的呢?过程是这样的方法收到了句柄的拷贝或者对象的引用, 但是这个引用的作用类似于指向真实的指针。对这个字段的改变会反映到它所指的值。这有些像是在 C/C++中指针的自动间接应用的的作用。
分享到:
相关推荐
java中传值与传引用,详细讲解java中的传值与传引用
Java是传值还是传址引用
java中传值还是传引用的的认识? 当一个对象被当作参数传递到一个方法后,此方法可改变这个对象的属性,并可返回变化后的结果,那么这里到底是值传递还是引用传递?
结果,就像光到底是波还是粒子的问题一样,Java 方法的参数是按什么传递的问题,其答案就只能是:即是按值传递也是按引用传递,只是参照物不同,结果也就不同。 4. 正确看待传值还是传引用的问题 要正确的...
Java到底是传引用还是传值Java开发Java经验技巧共3页.pdf.zip
JAVA传值与传引用[整理].pdf
java传值所用的基本方法与java传值时是传引用还是传值
前言在Java中,当对象作为参数传递时,究竟传递的是对象的值,还是对象的引用,这是一个饱受争议的话题。若传的是值,那么函数接收的只是实参本,函数对形参的操作并不
主要介绍了java中的传值与传引用实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
引用类型不像值类型传值那样直接,那么引用类型是怎么样传值的呢?答案就在此文档中。
传值和传引用的问题一直是Java里争论的话题。与C++不同的,Java里面没有指针的概念,Java的设 计者巧妙的对指针的操作进行了管理。事实上,在懂C++的Java程序员眼中,Java到处都是精美绝伦的指 针。
java及C++中传值传递、引用传递和指针方式的理解.docx
很多初学者比较疑惑的地方,看看绝对有帮助的。帮你打好Java的基础知识
主要是对Java方法传值和传引用问题进行了详细的介绍,需要的朋友可以过来参考下,希望对大家有所帮助
Java中引用类型传值的代码清单.pdf 学习资料 复习资料 教学资源
java 传值还是传引用?代码一目了然,代码中可以测试研究 到底传得什么
传值还是传引用 详细讲解JAVA参数传递机制 一目了然
第一次使用int实验: public class TTEST { private static List<UserEntity> mList = new LinkedList(); public static void main(String[] args) { int a = 0; changeA(a); System.out.println("a = "+a);...
通过对典型程序的研究与分析可以看出JAVA语言的参数传递总是传值调用的,但是对于基本类型的参数和对象类型的参数来说,参数传递的情况不完全相同.Java语言不能直接使用传引用调用,但是可以通过数组的方式模拟传引用...