我读了许多文章,都说Java是通过价值传递的。 但是我仍然不能解释按值传递和引用之间的区别。 我写了一个示例程序,它像这样执行。
public class PassByValue {
private int a;
private int b;
public PassByValue(int a, int b) {
this.a = a;
this.b = b;
}
public static int mul(int a, int b) {
int z = a * b;
System.out.println("The Value of Z inside mul:" + z);
return z;
}
public static void main(String args[]) {
int z = 100;
int x = 40;
int y = 20;
mul(x,y);
PassByValue pass = new PassByValue(x,y);
mul(pass.a,pass.b);
System.out.println("The Value of Z" + z);
}
}
执行
800
800 and
100
谁能向我解释这些问题...
价值传递是什么意思?
答:它只是将存储在变量中的数字或值传递给函数。 我是对还是错。
How do you say Java是通过价值传递?
为什么Java是按值传递而不是按引用传递?
上面的程序Tries是否显示了"按值传递"和"引用"的示例...但是仍然仅通过"按值传递"来做事情...我编写了该程序。
我们需要多少次这个问题? 查看任何"相关"链接,有很大的机会阅读其中两个已被实际回答但并未关闭的链接,因为重复可以清除所有内容。
stackoverflow.com/a/7034719/489364
Java是"按引用传递"还是"按值传递"的可能重复项?
造成混淆的原因可能是变量首先不能包含对象。变量只能包含对对象的引用。 (换句话说,根本不传递对象,不传递引用,也不传递值。)
一旦意识到这一点,很明显,Java中没有任何东西是按引用传递的。引用对象的变量存储引用,并且该引用按值传递。
1. What is Pass By Value means...
Answer: Its just passing the numbers or value stored in the variable to a function. Am i right or wrong.
那就对了。传递包含在变量中的值,而不传递变量本身。
1. How do you say Java is Pass By Value?
Java是按值传递的,因为基元是按值传递的,而引用是按值传递的。 (永远不会传递对象。)
例如,您不能在Java中实现swap方法。也就是说,你不能做
String str1 ="hello";
String str2 ="world";
swap(str1, str2);
// str1 can't refer to anything but"hello"
// str2 can't refer to anything but"world"
2. Why is Java is Pass By Value and not by reference?
如上所述,即使引用也按值传递。
简明扼要的答案!
您的回答正确,但缺乏细节。如果你这样做
Dog d = new Dog()
d是对Dog实例的引用,即按值传递的意思是您将d传递给方法时
walkDog(d);
将给Dog的引用副本(即引用的值,而不是引用本身)传递到方法中。因此,您有2个对Dog实例的引用,一个在调用范围内,一个在被调用范围内。可以说在walkDog方法中有一行
d = new Dog();
方法中的d引用仅指向新的Dog。最初调用该方法的原始引用仍然指向original Dog。如果Java通过引用传递,则在该方法中将使用相同的引用,而不是引用的副本,因此更改引用的值将影响调用范围和被调用范围的引用。
编辑-根据您的评论,我想澄清一下。由于原始范围和方法范围中的引用都指向同一个对象,因此您仍然可以在两个范围中对该对象进行更改。所以如果你这样做
d.drinkWater();
在walkDog方法中,并且drinkWater更改了dog对象上的某些变量,然后由于两个引用都指向了已更改的同一对象。
这只是每个范围中引用实际之间的区别。但是确实很多。
hvgotcodes:谢谢...完美的解释...如果我错了,请纠正我,我没有发送原始变量或对我函数的引用...而是一个副本...因此,值的确仅在该范围内更改,而不是到处都有....
@theJava,查看我的编辑,只是想澄清一件事
因此复制参考和原始参考指向相同的地址位置。。。但是指向不同的DOG实例。
@theJava,没有2个引用指向同一只狗。更改一个引用不会更改另一个引用,但是使用任何一个引用来更改对象都会更改同一对象。
对于C语言人:在功能上等同于在C语言中传递一个指针,然后在进入该函数以在该函数内使用时立即复制该指针。指针所指向的数据是相同的,除非您在函数中更改了指针的值。
@hvgotcodes为什么在将字符串传递给方法时不更改字符串?它们是对象,而不是原始数据类型。
您可以将按值传递视为仅传递变量中包含的值,而不传递变量本身。因此,将值复制到另一个临时变量中。相反,您可以将按引用传递视为传递实际变量,并且不进行任何临时拷贝,因此变量中的任何更改都将被"保存"。尽管还有更多,但考虑它可能是更简单的方法
我认为,如果Java支持按引用传递或传递值,那么应该四处寻找,应该清楚地了解在其实现中使用Java类的实例的方式。碰巧都是实例的类型-可变/不可变的,这将决定我们将事物传递给函数的方式!这取决于您探索这种差异!
让我澄清一下我的论点,为什么没有必要追回通过什么?!考虑一下...
第一个代码:
void foobar(int *a){
printf("%d", *a);
}
int main(){
int a = 5;
foobar(&a);
return 0;
}
在此C代码中,您要传递的是...变量'a'的地址。这恰好是通过引用! :)
让我们考虑另一个...
第二码:
void foobar(int* a){
printf("%d", *a);
}
int main(){
int a = 5;
int *p = &a;
foobar(p);
return 0;
}
在此C代码中,我要传递的是什么...?变量'p'的值,无论是指针还是:P都无关紧要
那么,您将其称为按值传递/按引用传递吗?我把这个留给你!但是我们需要看看的是如何实现... :)
因此,在Java中...通过我们可以说的-它支持"按值传递"或"按实例引用传递",而不是"按引用传递"
***我唯一可以明确得出的结论是Java中的原始数据类型。由于没有指针可以在没有实际变量的情况下编辑字节的内容,因此在Java中我们无法通过引用传递它们(我指的是原始数据类型)。