通过Java传递值或通过引用传递?

the*_*ava 6 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);

   }

}
Run Code Online (Sandbox Code Playgroud)

执行

800
800 and 
100
Run Code Online (Sandbox Code Playgroud)

谁能解释我这些问题......

  1. 什么是通过价值意味着......

答:它只是将存储在变量中的数字或值传递给函数.我是对还是错.

  1. How do you sayJava是通过价值?
  2. 为什么Java是Pass By Value而不是引用?
  3. 上面的程序Tries是否显示了Pass by value和Reference ...的例子,但仍然只通过Pass by Value来做...我写了那个程序.

aio*_*obe 18

混淆可能是因为变量首先不能包含对象.变量只能包含对象的引用.(换句话说,根本不传递对象,不是通过引用传递,而不是通过值传递.)

一旦你意识到这一点,很明显Java中没有任何传递引用.引用对象的变量存储引用,此引用按值传递.


1.什么是通过价值意味着......

答:它只是将存储在变量中的数字或值传递给函数.我是对还是错.

那就对了.传递变量中包含的,而不是变量本身.

1. How do you say Java是通过价值?

Java是按值传递的,因为原语是按值传递的,引用是按值传递的.(对象永远不会传递.)

例如,您无法swap在Java中实现方法.即,你做不到

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"
Run Code Online (Sandbox Code Playgroud)

2.为什么Java是按值传递而不是通过引用?

如上所述,甚至引用都是按值传递的.

  • 简洁明了的答案! (3认同)

hvg*_*des 13

你的答案是正确的,但你缺乏细节.如果你这样做

Dog d = new Dog()

d是对Dog实例的引用,即值传递的意思是您在传入d方法时

walkDog(d);

将引用的副本(即引用的值,而不是引用本身)传递给方法.因此,您有两个对Dog的实例的引用,一个在调用范围中,一个在被调用范围内.让我们说在walkDog方法中有一条线

d = new Dog();

方法中d参考指向新狗.首次调用该方法的原始引用仍然指向originalDog.如果Java通过引用传递,则在方法中将使用相同的引用而不是引用的副本,因此更改引用的值将影响调用和调用范围中的引用.

编辑 - 根据你的评论,我想明确的事情.由于原始范围中的引用和方法范围都指向同一个对象,因此您仍然可以在两个范围内更改该对象上的内容.所以,如果你这样做

d.drinkWater();

在该walkDog方法中,并drinkWater更改了dog对象上的一些变量,然后由于两个引用都指向同一个对象,该对象已被更改.

它只是区分每个范围内的引用实际内容.但它确实出现了很多.

  • @theJava,没有2个引用指向同一只狗.更改其中一个引用不会更改另一个引用,但使用任一引用更改对象都会更改同一对象. (2认同)