我读了许多文章,都说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中我们无法通过引用传递它们(我指的是原始数据类型)。