java中按值传递_在Java中按值传递还是按引用传递?

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值