对参数传递感到困惑

时间:2015-05-14 16:46:31

标签: java

我对传递给Java中的方法的信息感到有点困惑。我目前正在Oracle网站上学习Java基础知识,虽然我理解的大多数事情没有问题,但有些事情对我来说还不够清楚。

https://docs.oracle.com/javase/tutorial/java/javaOO/arguments.html

这是我怀疑的地方。当他们写下面的代码......

public void moveCircle(Circle circle, int deltaX, int deltaY) {
    // code to move origin of circle to x+deltaX, y+deltaY
    circle.setX(circle.getX() + deltaX);
    circle.setY(circle.getY() + deltaY);

    // code to assign a new reference to circle
    circle = new Circle(0, 0);
}

circle = new Circle(0, 0);是什么意思?它是在创建一个新的Cicle对象还是什么?我认为让我感到困惑的是如何在方法声明中使用object参数。

有人可以清楚地向我解释传递参考数据的类型是什么吗?

3 个答案:

答案 0 :(得分:1)

从一个更简单的例子开始:

public class Main  {

    public static void main(String... args) {
        int x = 7;
        add(x);
        System.out.println(x);
    }

    public static void add(int y){
        y = 10;
    }
}

您希望此代码打印出来的内容是什么?

打印出 7 ,因为即使我们重新分配add()函数收到的参数,也不会影响传入的原始值功能main()方法中的x变量仍为7。

示例代码只是向您展示使用Objects而不是基元的更复杂的示例。您应该学习的教训是,重新分配函数中的参数不会影响其原始值

答案 1 :(得分:1)

  

方法返回时,这些更改将保持不变。然后为circle指定一个对x = y = 0的新Circle对象的引用。但是,这个重新分配没有持久性,因为引用是按值传递的,不能更改。

仔细阅读最后一段。 您可以修改引用圆的属性,但如果为变量分配新引用,则不会对原始对象进行任何更改。它只告诉myCircle引用新创建的对象。在方法超出范围后,此对象立即被垃圾收集。

答案 2 :(得分:0)

您提出的两个问题的解释: -

  1. circle = new Circle(0, 0)表示我们正在为Circle对象的构造函数赋值。

  2. 是的,这是通过将值传递给引用变量circle来创建新的圆形对象。

  3. 希望它有所帮助!