con*_*ons -2 java language-features java-5
我在网上读到的东西错误地说int []Java中的标准等数组作为副本传递,而不是传递对数组的引用,类似于基本的数字类型,当我以为我在修改副本时最终覆盖了数组.我是否可以将其作为一种设计选择,以便在大约90年代中期为Java目标受众提供更简单的东西?(使对象在语法上看起来与C数组相同,或者Java中的数组实际上不是"Object"类型?)
也就是说,他们为什么不这样做:
Array array = new Array(<size>);
Run Code Online (Sandbox Code Playgroud)
另外,为什么他们不让所有内容(文字除外)通过引用来确保一致性?(int然后将s作为引用传递给int,而不是作为其值int,因此修改一个变量,该变量是该方法中方法的参数将修改原始变量的值,等等)
Jon*_*eet 12
Java中没有通过引用传递任何内容 - 但您需要知道变量的值是什么.
类型的变量的值int[]是不数组.它是对数组的引用.所有数组都是引用类型,即使它是一个基元数组.
当你写:
int[] x = { 1, 2, 3, 4, 5 };
someMethod(x);
Run Code Online (Sandbox Code Playgroud)
然后x 的值通过值传递给someMethod.它是对数组的引用 - 该方法可以更改数组的内容,但它无法更改x自身的值,如果Java使用pass-by-reference,它可以执行此操作.
一旦你理解了任何表达式的值是引用值或原始值,很多事情就会变得更加清晰.例如,请使用以下代码:
int[] x = { 1, 2, 3, 4, 5 };
int[] y = x;
y[0] = 10;
System.out.println(x[0]);
Run Code Online (Sandbox Code Playgroud)
你期望结果是什么?赋值运算符将值从RHS复制到LHS - 因此x并且y是对同一数组的引用.因此,最后一行打印出10.这个"复制值"与用于参数传递的原理完全相同.
这里没有任何矛盾 - 您只需要了解正在发生的事情,以及传递值和传递参考的真正含义.
编辑:我真的很惊讶,对此仍有任何疑问.
从Java语言规范,第8.4.1节(形式参数):
当调用方法或构造函数(第15.12节)时,实际参数表达式的值在执行方法体或构造函数之前初始化新创建的参数变量,每个声明的Type都是
这实际上是按值语义传递的定义:参数的值用作参数的初始值.
这些值可能是引用,也可能是原始值 - 它不会改变它传递的值这一事实.
编辑:您使用的定义,虽然在我看来很难表达,但当然并不意味着声称Java按值传递所有内容是误导性的.
它说,为价值传递:
这会生成变量的副本,如果变量像数组一样大,则可能非常慢且效率低.
请注意,它讨论的是C和C++(尽管C++ 确实也通过引用传递).它谈到制作变量的副本.这正是Java所做的.不同之处在于,在Java中,变量的值始终是原始值或引用.它永远不是一个对象.
一旦你理解了关键点(并且它不仅仅是参数传递的重要性),那么正确地说Java通过值传递所有东西是完全直截了当的.调用方法或构造函数时,将计算参数,并将值用作参数的初始值.这是值传递,这就是Java为所有参数所做的事情.
至于您链接到的PDF - 这是对该主题的可耻的讨论,IMO.它使得通过引用传递的内容变得一团糟,它的特殊情况String没有充分理由(String恰好是不可变的,但其他类也可以)并且它通常是错误的.如果我提供一些支持我观点的链接会有帮助吗?
还有数百个.你并不是第一个被这个混淆的人,但Java确实通过价值甚至引用来传递一切.
| 归档时间: |
|
| 查看次数: |
442 次 |
| 最近记录: |