社区
Java SE
帖子详情
JAVA中只有按值传递,这句话对么?
ssnec
2010-06-02 11:28:50
经常被绕昏。
比如如果没有NEW。
那么 Object o1= o2;
仅仅是o1和o2都指向一个内存空间。好像是引用传递么。
...全文
1154
55
打赏
收藏
JAVA中只有按值传递,这句话对么?
经常被绕昏。 比如如果没有NEW。 那么 Object o1= o2; 仅仅是o1和o2都指向一个内存空间。好像是引用传递么。
复制链接
扫一扫
分享
转发到动态
举报
写回复
配置赞助广告
用AI写文章
55 条
回复
切换为时间正序
请发表友善的回复…
发表回复
打赏红包
mwzhj
2011-08-22
打赏
举报
回复
分为按值传递和按引用传递,如果是属于八种基本数据类型就是按值传递,如果不属于就是按引用传递
微风飘过
2011-08-22
打赏
举报
回复
还能传递引用啊
daxiang253
2011-08-21
打赏
举报
回复
按什么传递
要值的类型
还要看赋值语句
只有按值传递肯定是错误的啊
gsy999
2011-08-21
打赏
举报
回复
方法参数(取自《Java2核心技术卷Ⅰ:基础知识》p114)
先来回顾一下程序设计语言中有关参数传递的计算机科学术语。“传值调用”(call by value)表示方法得到的是调用者提供的值。与之相对,“传引用调用”(call by reference)表示方法得到的是调用者提供的变量地址。这样,方法可以修改引用调用所传递变量的值,但不能修改传值调用送来的变量。不论是在Java中还是在其他各种程序设计语言中,术语“...调用”(call by ...)都是用来描述方法参数行为的标准计算机科学术语。
Java语言总是使用传值调用
。这也意味着方法得到的只是所有参数值的拷贝。因此,方法不能修改传递给它的任何参数变量的内容。
例如:下面的调用:
double percent = 10;
harry.raiseSalay(percent);
不管这个方法如何实现,方法调用后,percent的值仍然会是10。
主我们稍微仔细地研究一下这种情况。假设一个方法要使方法参数的值增至3倍:
public static void tripleValue(double x);//不能工作
{
x = 3 * x;
}
然后,我们调用此方法:
double percent = 10;
tripleValue(percent);
然而,这样做无法达到目的。方法调用后,percent的值仍旧是10。下面是有关的执行过程:
1)x被初始化为percent值的一个拷贝(即10)。
2)x被增至3倍,变成30。但percent仍旧是10(参见下图)。
3)方法结束后,参数变量x不再使用。
┌────┐
┌───│值的拷贝│
↓ └────┘
percent= 10
▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂▂
x= 30
↑ ┌─────┐
└───│值增至3倍│
└─────┘
方法参数共有两种:
●基本类型(数字、布尔值);
●对象引用。
方法不能改变基本类型的参数。但对于对象参数来说,情况则有所不同。我们可以很容易地实现一个方法,把员工的薪金增至3倍。
public static void tripleSalary(Employee x)//能够工作
{
x.raiseSalary(200);
}
执行调用:
harry = new Employee(...);
tripleSalayr(harry);
的具体工作过程如下:
1)x被初始化为harry值的一个拷贝,即一个对象引用。
2)向此对象引用应用raiseSalary方法。x和harry都指向的那个Employee对象的薪金被提高了200%.
3)方法结束后,参数变量x不再使用。但对象变量harry继续指向薪金被增至3倍的那个对象。
可以看到,实现改变对象参数状态的方法很容易。实际上,这种方式也很普遍。后面的原因很简单。方法得到对对象引用的一个拷贝,原来的对象变量和这个拷贝所指向的是同一个对象。
很多程序设计语言(尤其是C++和Pascal)有两种参数调用的方法:传值调用和传引用调用。所以,有一些程序员(
不幸的是,其中有些甚至是某些书的作者
)声称Java程序设计语言对对象使用的是传引用调用。这种理解是错误的。由于,这种误解的普遍性,我们在下面举出一个反例来进行详细阐述。
下面的方法用来交换两个员工对象:
public static void swap(Employee x, Employee y)//无法工作
{
Employee temp = x;
x = y;
y = temp;
}
如果Java程序设计语言对对象使用的是传引用调用,那么这个方法将会达成目标:
Employee a = new Employee("Alice"..);
Employee b = new Employee("Bom"..);
swap(a,b);
//
可是,这个方法事实上并没有改变存储在变量a和变量b中的对象引用。swap方法中的x和y参数被初始化为这两个引用的拷贝。然后,这个方法交换两个拷贝。
//
Employee temp = x;
x = y;
y = temp;
但最终这么做是徒劳无功的。当方法结束后,参数变量x和y就被丢弃了。原来的变量a和b仍旧指向方法调用前各自所指向的对象。
上面的讨论说明Java程序设计语言中并不向对象使用引用调用。实际上,对象引用是通过值来传递的。
下面归纳了Java程序设计语言中利用方法参数可以做到和不能做到的几种情况:
●方法不能修改基本类型(即数字或布尔型)的参数。
●方法可以修改对象参数的状态。
●方法不能让对象参数指向新的对象。
-----------------------
C++既有传值调用,也有传引用调用。传引用调用只需在引用参数前标上&。例如,可以容易实现修改其引用参数的方法void tripleValue(double& x)或者void swap(Employee& x, Employee& y)。
----------------------
cuiyanlei2010
2011-08-21
打赏
举报
回复
[Quote=引用 51 楼 menggudaoke 的回复:]
值传递,传递地址也是值传递
[/Quote]
非常同意,java中只有值传递,没有引用传递,如果你学过C++你就会知道,C++中的引用传递才是真正意义上的引用传递。java中所谓的引用传递只是便于理解非基本数据类型传递的方式是传递地址值。
menggudaoke
2011-08-21
打赏
举报
回复
值传递,传递地址也是值传递
大佬
2011-08-21
打赏
举报
回复
基本类型按值传递
对象按引用传递
myl915
2011-08-21
打赏
举报
回复
动手试就知道了
daijope
2011-08-20
打赏
举报
回复
不要纠结与这种概念,理解原理就行了,不管是基本类型,还是引用类型,传递的都是一份拷贝。
Studious_Li
2011-08-20
打赏
举报
回复
完全正确啊.只有值传递,老师说这是SUN公司说的,除了基本类型的变量,其他变量的值都是其引用的地址值,所以在变量之间赋值的时候传递的是引用的地址值
xzxw1115
2011-08-19
打赏
举报
回复
一个是基本数值,一个是引用的地址
qybao
2011-08-19
打赏
举报
回复
看你怎么理解值传递的
值
的意思
比如 String s = "abc";
要知道 s 是个栈内的变量,有自己的内存空间,它的内存空间保存着 "abc"字符串对象的地址
如果 值 理解为变量的内存空间保存的内容,那么都是按 值 传递的
如果 值 理解为"abc"字符串对象的内容,那么就是按 引用 传递的
skyWalker_ONLY
2011-08-19
打赏
举报
回复
无论是基本类型还是类类型都是按值传递,这是毋庸置疑的
mingzhongzhuding8812
2011-08-19
打赏
举报
回复
[Quote=引用 24 楼 dejinzhao 的回复:]
都是值传递
public class TestPassByValue {
private String value;
public TestPassByValue(String value) {
this.value=value;
}
public void print(){
System.out.println(value);
}
public ……
[/Quote]
不太同意你观点。
b=a;这句不是b指向a的地址,而是说a,b指向同一个地址。当a=new TestPassByValue("second")时,a指向的地址发生变化,跟b没有一点关系,个人见解
pywepe
2011-08-18
打赏
举报
回复
对啊 回复内容太短了! 回复内容太短了!
fondOfJava
2011-08-18
打赏
举报
回复
对的..基本上都是按值传递,关键这个值你是怎么理解而已。
HelloJuese
2011-08-18
打赏
举报
回复
只有值传递吧。。。
meran
2011-08-18
打赏
举报
回复
这句话是对的。 但是你要仔细研究下分别传的是什么
小景
2011-08-18
打赏
举报
回复
java传值的形式有且只有一种,那就是值传递,基本数据类型就说了,如果是引用类型的传递的是引用地址的值,所以某种角度讲引用传递这种说法在java里都是错误的
hui1102
2011-08-18
打赏
举报
回复
java传值的形式有且只有一种,那就是值传递,基本数据类型就说了,如果是引用类型的传递的是引用地址的值,所以某种角度讲引用传递这种说法在java里都是错误的
加载更多回复(35)
Java
到底是
值传递
还是引用传递?
先说下答案:
Java
中
其实还是
值传递
的,只不过对于对象参数,值的内容是对象的引用。 如果参数是基本类型,传递的是基本类型的字面量值的拷贝。 如果参数是引用类型,传递的是该参量所引用的对象在内存
中
地址值的拷贝。 一句
话
概括
值传递
和引用传递的区别:
值传递
是传递实参副本,函数修改不会影响实参;引用传递是传递实参地址,函数修改会影响实参。 下面一个简单的面试题解释下: 面试官:你好,你能说出下面个程序的执行结果吗? public class Test { public static
Java
到底是
值传递
?还是引用传递?
前言 最近和同事讨论算法效率问题无意
中
涉及到一个问题,
java
中
调用方法的时候是
值传递
呢?还是引用传递?网上搜索一下相关问题,众说纷纭,有人说
值传递
,有人说引用传递,还有人说”基础类型是
值传递
,对象类型是引用传递“。那么我们就用简单客观的代码分析一下。
值传递
值传递
是指将该值复制一份出来使用,比如a复制一份a1出来,a1做的操作不会影响到a。例子如下: public sta
面试官:兄弟,说说
Java
到底是
值传递
还是引用传递
二哥,好久没更新面试官系列的文章了啊,真的是把我等着急了,所以特意过来催催。我最近一段时间在找工作,能从二哥的文章
中
学到一点就多一点信心啊! 说句实在
话
,离读者 trust you 发给我这段信息已经过去 1 周时间了。不是我怠慢,确实是可更新的内容实在是太多了。这不,又有两个读者不约而同地要求我更新一下
Java
到底是
值传递
还是引用传递方面的文章——其实这个问题我之前是写过的,但现在看起来...
C++,
Java
值传递
,引用传递
1.除内置类型、STL迭代器和函数对象采用“pass-by-value”(
值传递
),其他尽量采用pass-by-reference-const 替换 pass-by-value,实现形式“const A&”; 2.
Java
中
的
值传递
,引用传递问题: (1):“在
Java
里面参数传递都是按
值传递
”
这句
话
的意思是:按
值传递
是传递的值的拷贝,按引用传递其实传递的是引用的地址值,所以统称按值
Java
:按
值传递
还是按引用传递详细解说
前天在做系统的时候被
Java
中
参数传递问题卡了一下,回头查阅了相关的资料,对参数传递问题有了新的了解和掌握,但是有个问题感觉还是很模糊,就是
Java
中
到底是否只存在
值传递
,因为在查阅资料时,经常看到有人说
Java
只有
值传递
,但有人说既有
值传递
,也有引用传递,对于两个观点个人觉得应该是站的角度不同而得出两个不同的说法,其实两个说法其
中
的原理是一样的,只要咱们懂得其
中
的原理,那么至于叫什么也就无所谓了
Java SE
62,614
社区成员
307,326
社区内容
发帖
与我相关
我的任务
Java SE
Java 2 Standard Edition
复制链接
扫一扫
分享
社区描述
Java 2 Standard Edition
社区管理员
加入社区
获取链接或二维码
近7日
近30日
至今
加载中
查看更多榜单
社区公告
暂无公告
试试用AI创作助手写篇文章吧
+ 用AI写文章