【问题标题】:Java is Pass by Value right? [duplicate]Java 是按值传递对吗? [复制]
【发布时间】:2011-11-21 13:34:42
【问题描述】:

可能重复:
Is Java pass by reference?

我的这段代码怎么不起作用?我将一个对象传递给一个方法,但它不会修改我在 main 中创建的原始对象,这是为什么呢?

public class TestRun{

        public static void main(String[] args){
            Test t1 = new Test();
            Test t2 = new Test();
            t2.x = 555;
            t2.y = 333;

            System.out.println("The original valuess of X and Y are");
            System.out.println("X =  "+t1.x+"Y = "+t1.y);
            modifyObject(t1,t2);
            System.out.println("After the modification ");
            System.out.println("X =  "+t1.x+"Y = "+t1.y);


        }

        public static void modifyObject(Test arg1,Test arg2){
            arg1 = arg2;
        }
}

public class Test{

        int x = 9999;
        int y = 1;
}

【问题讨论】:

  • C++ 中的非原始类型是对象,但在 Java 中它是隐式引用。引用按值传递。

标签: java oop object pass-by-reference pass-by-value


【解决方案1】:

呃?!!

您的期望是什么?因此,您创建并打印对象t1,其x,y 值分别为999,1。如果你打印它,那就是你会得到的

$ java TestRun
The original valuess of X and Y are
X =  9999, Y = 1
After the modification 
X =  9999, Y = 1

那么……你还有什么问题?

  • Java 是按值传递的吗? A:是的
  • Q 不会修改原来的对象吗? A:没错,不会被修改。
  • 这是为什么呢? A:因为 Java 是按值传递的

【讨论】:

  • 修改后的值为x = 555 and y = 333;
【解决方案2】:

在函数 modifyObject 中:

arg1 接收到一个 Test 类型的对象的地址,比如说 x1000 arg2 接收对象的另一个地址,比如 x2000

arg1 包含对一个对象的引用,但如果你执行 arg1 = arg2,你只是告诉 arg1 指向另一个地址。

这样,您就不会触及 arg1 指向的对象的内容

arg1 和 arg2 是函数中的局部变量。要对对象进行更改,您需要寻址到存储它的内存,但是 arg1.x 或 arg1.y

注意对象在内存中的某个地方,而 arg1/arg2/t1/t2 只是说它们所在的位置,它们不是“实际”对象

【讨论】:

  • soo 为了让我改变他们的价值观,我要做的就是这个? arg1.x = arg2.x 我说的对吗?
  • 是的。这会将内存中的值从 arg2 指向的实例复制到 arg1 指向的实例。 arg1.x = arg2.x; arg1.y = arg2.y;会做的工作。
  • 所以原始对象的值会改变吗?
  • 是的,它会改变原始对象的值
【解决方案3】:

它的传值是。

但是您需要认识到 Test 是引用类型。在 C 中,它们是指针。

所以你在调用 modifyObject(arg1,arg2) 时实际上所做的是复制指针的值(即复制指针的内存地址,或者复制变量的值是引用)。

【讨论】:

    【解决方案4】:

    你在标题中回答了它。 Java 是“按值传递”。

    这意味着该方法仅接收对象引用arg1arg2副本

    但是,您可以通过以下方式更改对象的内容

    arg1.x=arg2.x
    ary1.y=arg2.y
    

    【讨论】:

    • 那么如果我这样做,原来的对象会被修改?
    • 是的,你明白了。并向桑杰 +1。
    猜你喜欢
    • 2011-12-15
    • 2013-01-21
    • 1970-01-01
    • 2017-02-22
    • 2013-02-09
    • 2013-05-03
    • 2011-05-16
    • 2021-11-04
    • 2013-03-06
    相关资源
    最近更新 更多