为什么? 关于Java只有按值传递

yqj2065 2008-11-10 11:00:38
Java只有按值传递,但是看见一些人反复讨论这个问题,不禁要问一下为什么?

1、说“按引用传递”的人也是经过思考的,是不是他们使用了不同的术语,或者他们的术语不同于我们的术语?
2、说“按引用传递”的人,有哪些典型人物?
我知道的有TIJ,忘记第几版了,最新版改了没有,知道的说一下。
还有CSDN上的一篇《java按值传递还是按引用传递详细解说》
有没有正规教材上说“按引用传递”的?
3、C语言也讨论“按引用传递”这个问题吗?
4、为什么“按引用传递”是错误的?[不要讨论它错误之处,而是问一问他们的思路为什么错误】?
...全文
1053 59 打赏 收藏 转发到动态 举报
写回复
用AI写文章
59 条回复
切换为时间正序
请发表友善的回复…
发表回复
SIMONJZF 2011-03-30
  • 打赏
  • 举报
回复
老帖,顶顶...
yqj2065 2008-11-11
  • 打赏
  • 举报
回复
21楼:
谢谢。
《java编程思想》(第27页),在它的第一版我就看见这个错误,还没有改过来,真硬气。
《java2入门经典》,记住了。

我看到的所有Java书,除TIJ,没有这样的说法。
我看的都是国外的教材类或SUN相关的书,

是不是教育机构的书只有按值传递,而普及类的书会出现“按引用传递”?
这到有趣,,,
yqj2065 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 19 楼 ZangXT 的回复:]
引用 15 楼 yqj2065 的回复:
Object obj;obj是引用吗?不是。

如果你认为不是,我只能说这叫Reference Type(引用类型)Object类的value(变量)了。
刚学的时候曾经纠缠于这样的概念,也讨论过,其实很多人就是因为这个引用而“自然”地“传引用”了。
不谈这个了。
[/Quote]

哈,“Reference Type(引用类型)Object类的variable(变量)了”(你敲快了)
没有这样夸张,obj一个变量麻,和i一样;不过是Reference Type。引用变量。
int 类型的变量i也绕口。
jhr924 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 yqj2065 的回复:]
6楼,谢谢
我要的是反例。
有没有正规教材上说“按引用传递”的?
[/Quote]

我说了,《java编程思想》(第27页),
我刚上面说的《java2入门经典》也说的是基本类型传的是值得副本,对象传的引用的副本。在那一页,我忘了,反正着本书讲的挺好的,用了3页讲这个知识点,还带图着呢,

楼主这几天我也在琢磨这个的问题,昨天也发帖了, 还专门去书店查了下书。
sincor 2008-11-11
  • 打赏
  • 举报
回复
没有指针那里来址传递
getter 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 42 楼 aspirerME 的回复:]
其实可以这样理解,虽然不正确:
对于基本数据类型是值传递,对于对象则是按引用传递。

其实“对于对象则是按引用传递”归根结底还是值传递只不过传递的是引用而已。
[/Quote]
可能誤解,就由這種高深見解而來的
引用也是一個值,只是對引用的操作即是對引用所對應的實際對象進行操作而己
從來java中就不能直接對對象進行操,只能以引用進行
你何時傳遞過對象了?
aspirerME 2008-11-11
  • 打赏
  • 举报
回复
其实可以这样理解,虽然不正确:
对于基本数据类型是值传递,对于对象则是按引用传递。

其实“对于对象则是按引用传递”归根结底还是值传递只不过传递的是引用而已。

getter 2008-11-11
  • 打赏
  • 举报
回复
哦,看了38樓知道了
嗯,傳值,我也不知道疑或哪里來
yqj2065 2008-11-11
  • 打赏
  • 举报
回复
本楼不讨论pass by reference和pass by value本身.
讨论为什么有人会说“按引用传递”,他们的错误是那里来的,

yqj2065 2008-11-11
  • 打赏
  • 举报
回复
传递、传递
参数传递为什么重要?因为模块化。


因此,按值传递和按引用传递语义的区别,不是看它们是否有副作用
它们的区别在于形式参数与实际参数是否是在同一个数据存放位置,
换言之,形式参数与实际参数是不是“同一”的。
对于引用参数,形式参数与实际参数的指向是同一的(一个对象),
而形式参数与实际参数本身是独立的、也是“相等”的。

引用作为参数时候,如果想避免副作用,需要一点技巧:
1. 让引用指向的对象属于不变类;
2. 克隆一个对象,再传递给方法。



如果参数传递是什么都不懂,后面的避免副作用,你们考虑过嘛。


getter 2008-11-11
  • 打赏
  • 举报
回复
一早起來看到這貼不太理解在討論什麼
怎麼現在看上去好像在咬文爵字啊,樓主,到底在討論什麼啊
yqj2065 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 35 楼 cangyue87 的回复:]
1.java没有"正规教材".
2.大多数java书籍对于参数传递的具体特征都描述的清楚而且一致.
3.他们有争议的,是这种传递方式的抽象命名而已.

嘛~`嘛~`所以,无视这个问题就行了喵~~~``
[/Quote]
你说得很对.其实我开始就说了,Java只有按值传递,但是看见一些人反复讨论这个问题,不禁要问一下为什么?
假设你是一个Java教师,和Thinking in Java的作者一样,你总要讲解Java只有按值传递,你不能够"无视这个问题"时,你总要说出自己的理由,怎么办?所以我想知道为什么?

我一点都不想讨论pass by reference和pass by value本身.这一点在清楚不过了,
我就是困惑:说“按引用传递”的人为什么这样想,如何避免你教的学生也出现类似的错误.

1/java没有"正规教材". 我的意思是不讨论国内的一些垃圾教材,所以用了"正规"来形容.或者咱们说"能够上台面的教材"

3.他们有争议的,是这种传递方式的抽象命名而已. //这是一句话就能够解决的问题,“按引用传递”是各种各样不错语言的传值方式之一,意思是方法操作实参本身.Java的引用和C语言的指针,它们都是copy后传递的.
CoderPlusPlus 2008-11-11
  • 打赏
  • 举报
回复
同楼上
pass by reference里的reference和java里的reference不是一个意思
core java里是正解
yqj2065 2008-11-11
  • 打赏
  • 举报
回复
34楼:
你引用的第四版中说明和对这句话的注释,在第2版中就有,他真的是没有改.

我们都会混用一些术语,没有人喜欢罗罗嗦嗦.
如The Java Programming Language,混用了objects and references(to objects),
Thinking in Java混用了什么?identifier (you manipulate) is (actually a) “reference” (to an object.)

关于Thinking in Java,假设世界上没有C++,只有C和fortran语言,我不知道他说的那些东西那里准确.

Pass an object reference to the method.和pass by reference还有多大区别呢?
如果你把所有的接口都认为是Java的接口,你就知道"接口和实现分离"是多么难以解释/理解.pass by reference是计算机语言中的一般术语,不是Java的.

[最后,没有必要强迫别人接受你的思想和概念.用java设计好程序比什么都强.]
常常听人说基础很重要,假设pass by reference这是一个基础问题,不存在强迫别人接受谁的思想和概念,它不包含新的概念,不过是在"when it makes a difference." We are careful about this distinction .
yami251139 2008-11-11
  • 打赏
  • 举报
回复
看完有点头晕*#(……(@……%(……@#%……@
为什么说按引用传递?
我觉得他的意思可能是说按前次指向的对象的引用吧。
这里简写为引用。。。。。。
cangyue87 2008-11-11
  • 打赏
  • 举报
回复
1.java没有"正规教材".
2.大多数java书籍对于参数传递的具体特征都描述的清楚而且一致.
3.他们有争议的,是这种传递方式的抽象命名而已.

嘛~`嘛~`所以,无视这个问题就行了喵~~~``
yqj2065 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 55 楼 java2000_net 的回复:]
JAVA中当然有搬房子啊! 比如数字1, 作为参数传递时,绝对是新建一个房子,然后传过去的。

这个参数是实参,而不是什么纸条。
[/Quote]

1、参数传递为什么重要?因为模块化。所以,obj.doSth(1)不在考虑访问之内。
2、参数传递考虑:

int i =5;
A a = new A();
obj.doSth(i);//doSth把纸条加10
obj.doOtherSth(a);//doOtherSth把a指向我自己买的房子,
print(i);//5 VS 15?
a.装修();// 我自己 Vs 你写的


传递的doOtherSth(a)不是房子,传递的是纸条。虽然被称为ref,但是传递的是其copy,按值传递。

BTW:
"1 我把房子搬着,然后把房子给你,这就是传值 " 不对
foo(int i){}
obj.foo(jjjj)我送你一个盒子jjjj如果我把jjjj这个盒子搬着,然后把盒子给你,典型的传引用!

盒子让你看一眼里面的东西,我带走盒子,按值传递。
ZangXT 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 23 楼 yqj2065 的回复:]
21楼:
谢谢。
《java编程思想》(第27页),在它的第一版我就看见这个错误,还没有改过来,真硬气。
[/Quote]
我想这也是错怪了Thinking in Java了,我看的是第四版,里面有说明:
Although you treat everything as an object, the identifier you manipulate is actually a “reference”
to an object.
对这句话有注释:
1 This can be a flashpoint. There are those who say, “Clearly, it’s a pointer,” but this presumes an underlying
implementation. Also, Java references are much more akin to C++ references than to pointers in their syntax. In
the 1st edition of this book, I chose to invent a new term, “handle,” because C++ references and Java references
have some important differences. I was coming out of C++ and did not want to confuse the C++ programmers
whom I assumed would be the largest audience for Java. In the 2nd edition, I decided that “reference” was the
more commonly used term, and that anyone changing from C++ would have a lot more to cope with than the
terminology of references, so they might as well jump in with both feet. However, there are people who disagree
even with the term “reference.” I read in one book where it was “completely wrong to say that Java supports pass
by reference,” because Java object identifiers (according to that author) are actually “object references.” And (he
goes on) everything is actually pass by value. So you’re not passing by reference, you’re “passing an object
reference by value.” One could argue for the precision of such convoluted explanations, but I think my approach
simplifies the understanding of the concept without hurting anything (well, the language lawyers may claim that
I’m lying to you, but I’ll say that I’m providing an appropriate abstraction
).

The Java Programming Language虽然强调pass by value,但是也支持不精确的表达,要不你每说一句话都强调,岂不是太累了.
1.7.1. Creating Objects
Most of the time, you can be imprecise in the distinction between actual objects and references to objects. You can say, "Pass the object to the method" when you really mean "Pass an object reference to the method." We are careful about this distinction only when it makes a difference. Most of the time, you can use "object" and "object reference" interchangeably.
其实翻译成中文,Pass an object reference to the method.和pass by reference还有多大区别呢?

最后,没有必要强迫别人接受你的思想和概念.用java设计好程序比什么都强.

老紫竹 2008-11-11
  • 打赏
  • 举报
回复
JAVA中当然有搬房子啊! 比如数字1, 作为参数传递时,绝对是新建一个房子,然后传过去的。

这个参数是实参,而不是什么纸条。
king_spf 2008-11-11
  • 打赏
  • 举报
回复
个人觉得这只是说法不一样。
实际上,引用里存的是对象的地址。
说是传址是因为实参确实是把地址传给形参了。
说是传值是把对象的地址当作是引用的值了(实际上也是)。
加载更多回复(39)

62,615

社区成员

发帖
与我相关
我的任务
社区描述
Java 2 Standard Edition
社区管理员
  • Java SE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧