搞懂java方法传递基本数据类型和引用数据类型

传递基本数据类型参数

基本参数,如整型或双精度,通过值传递到方法。这意味着对参数值的任何更改都只存在于方法的范围内。当方法返回时,参数将消失,对它们的任何更改也将丢失。这里有个例子

public class PassPrimitiveByValue {

    public static void main(String[] args) {
           
        int x = 3;
           
        // invoke passMethod() with 
        // x as argument
        passMethod(x);
           
        // print x to see if its 
        // value has changed
        System.out.println("After invoking passMethod, x = " + x);
           
    }
        
    // change parameter in passMethod()
    public static void passMethod(int p) {
        p = 10;
    }
}

当您运行这个程序时,输出是

After invoking passMethod, x = 3

传递引用数据类型参数

引用数据类型参数(如对象)也按值传递到方法中。这意味着当该方法返回时,传入的引用仍然引用与之前相同的对象。但是,如果对象的字段具有适当的访问级别,则可以在方法中更改它们的值。

例如,考虑任意类中移动圆形对象的方法:

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);
}

让方法通过以下

参数调用:

moveCircle(myCircle, 23, 56)

搞懂java方法传递基本数据类型和引用数据类型

在这个方法中,circle最初指的是myCircle。该方法将circle引用的对象(即myCircle)的x和y坐标分别更改23和56。当方法返回时,这些更改将持续存在。然后给circle分配一个x = y = 0的新Circle对象的引用。但是,这种重新分配没有持久性,因为引用是按值传入的,不能更改。在该方法中,circle指向的对象发生了变化,但是,当该方法返回时,myCircle仍然引用与调用该方法之前相同的Circle对象。