2. java中方法参数传递(值传递)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/yz_cfm/article/details/89674752

1. 原生数据类型参数 --- 值传递

eg:

public class ParamTest {
    public void changeInt(int ym){
        ym = 3;
    }

    public static void main(String[] args) {
        int ym = 1;
        ParamTest paramTest = new ParamTest();
        paramTest.changeInt(ym);
        System.out.println(ym);
    }
}

// output
1

结果分析:因为 ym 为原生数据类型(int),当原生数据类型作为方法的参数进行传递时,实际上传递的是它的值,也就是此时 changeInt() 方法中的形参 ym 为 1,但是注意,这个形参 ym 和 main() 方法中定义的 ym 变量没有任何关系,此时只是值相等,名字一样,仅此而已,接着 changeInt() 方法将形参 ym 的值从 1 改为 3,但是改变的只是形参 ym 的值,所以至始至终 main() 方法中的 ym 变量始终没有变,故最终结果打印为 1。

2. 引用类型参数 --- 也是值传递

eg:

class Point{
    int x;
    int y;

    public Point(int x, int y) {
        this.x = x;
        this.y = y;
    }
}

public class ParamTest {
    public void changePoint(Point point){
        point.x = 5;
        point.y = 6;
    }

    public static void main(String[] args) {
        Point point = new Point(1, 2);
        ParamTest paramTest = new ParamTest();
        paramTest.changePoint(point);
        System.out.println(point.x);
        System.out.println(point.y);
    }
}

// output
5
6

结果分析:首先创建一个坐标为 (1, 2) 的 Point 对象,并将该对象的地址赋值给引用类型 point(其实就是一个 int 类型的内存地址)。 paramTest.changePoint(point) 这里传递的就是 point 的值,也就是指向坐标为 (1, 2) 的 Point 对象的地址,所以 changePoint() 改变的就是开始创建的那个 Point 对象本身。故结果返回为(5, 6)。

综上,在 java 里面,对于方法的参数传递,不管是原生数据类型还是应用类型,都是传值(pass by value)。

下面再看一个例子:

public class ParamTest {

    public void changeString(String str){
        str = "cfm";
    }

    public static void main(String[] args) {
        String str = "ym";
        ParamTest paramTest = new ParamTest();
        paramTest.changeString(str);
        System.out.println(str);
    }
}

// output
ym

结果分析:其实这个就是引用类型参数的传递, String str = "ym" 这时在 String Pool 中创建一个 "ym" 对象并将地址赋值给 str,paramTest.changeString(str) 这里是将 str 的地址传递给 changeString() 方法,所以此时 changeString() 方法形参(只是名称和 main() 方法中的 str 一样,但是它们实际上并没有什么必然联系)指向的对象也是开始创建的 "ym",然后 changeString() 方法里又在 String Pool 中创建一个 "cfm" 对象并将地址赋值给 changeString() 方法的形参,注意这里改变的只是形参 str,main() 方法中的 str 引用类型变量指向的依然是 "ym" 对象,故结果打印为 "ym"。

猜你喜欢

转载自blog.csdn.net/yz_cfm/article/details/89674752