Java 对过去的争论感到困惑

Java 对过去的争论感到困惑,java,Java,我对Java中传递给方法的信息有点困惑。我目前正在Oracle网站上学习Java基础知识,虽然我理解的大部分内容都没有问题,但有些内容对我来说还不够清楚 这就是我怀疑的地方。当他们编写以下代码时 public void moveCircle(Circle circle, int deltaX, int deltaY) { // code to move origin of circle to x+deltaX, y+deltaY circle.setX(circle.getX(

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

这就是我怀疑的地方。当他们编写以下代码时

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);
}
他们所说的
圈=新圈(0,0)是什么意思?它是在创建一个新的Cicle对象还是什么?我想让我困惑的是对象参数是如何在方法声明中使用的


有人能给我解释清楚传递引用数据类型是什么吗

从一个简单的例子开始:

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

示例代码只是向您展示了一个使用对象而不是原语的更复杂示例。您应该学到的教训是,在函数中重新指定参数不会影响其原始值

当方法返回时,这些更改将保持不变。然后,圆被指定为一个x=y=0的新圆对象的参照。但是,此重新分配没有永久性,因为引用是按值传入的,无法更改

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

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

  • circle=newcircle(0,0)
    表示我们正在为circle对象的构造函数赋值

  • 是,这是通过将值传递给参考变量
    circle
    来创建新的圆对象


  • 希望有帮助

    那个电话毫无意义。该新实例将立即超出范围,因此它不会执行任何操作。在提供的文档中:但是,此重新分配没有永久性,因为引用是按值传入的,无法更改。在该方法中,circle指向的对象已更改,但是,当该方法返回时,myCircle仍然引用与调用该方法之前相同的circle对象。”这个示例解释了在Java中,对象引用也是按值传递的。因此,新的圆(0,0)是真的没用吗?哦,我明白了。谢谢Sasha!这对于基本类型是很清楚的,但是对于对象可能会导致误解。人们经常混淆“对象值”(即对象成员的值)和“对象引用值”“如果有帮助,请记住Java总是按值传递。但对于对象,传递的值是引用。因此,对引用对象所做的任何更改都将在方法调用后保持不变,例如在原始示例中对圆调用setX()。但对传递的引用值本身所做的任何更改都将丢失,例如将其设置为null或完全指向另一个对象。