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