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

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"。

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值