繁体   English   中英

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

[英]Pass by value or Pass by reference in 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

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

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

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

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

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

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


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

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

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

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

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.为什么Java是按值传递而不是通过引用?

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

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

Dog d = new Dog()

d是对Dog实例的引用,即值传递意味着您将d传递给方法时

walkDog(d);

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

d = new Dog();

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

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

d.drinkWater();

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

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

您可以将pass-by-value视为仅传递变量中包含的值而不传递变量本身。 然后将值复制到另一个临时变量中。 相反,您可以将传递引用视为传递实际变量而不进行临时复制,以便变量中的任何更改都“保存”。 虽然还有更多内容,但考虑它可能更容易

我认为如果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引用它们(我的意思是原始数据类型)。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM