java方法参数

1 Java 程序设计语言总是采用按值调用。

按值传递:表示方法接收的是调用者提供的值。
按引用调动:表示方法接收是调用者提供的变量地址。

Java 程序设计语言总是采用按值调用。 也就是说, 方法得到的是所有参数值的一个拷 贝, 特别是, 方法不能修改传递给它的任何参数变量的内容。

java方法参数有两种类型。
1:基础数据类型:int,boolean,double,byte,long,char,float,short。
2:引用数据类型:String,类,接口,数组。

2 基础数据类型参数传递

public class Person {

    public static void main(String[] args) {
        int i = 3;
        System.out.println(i);

        doubleData(i);

        System.out.println(i);
    }

    public static void doubleData(int x){
        x = 2 * x;
    }
}

输出

3
3

在这里插入图片描述

i属于main的栈帧中,x属于doubleData栈帧中。

参数过程:
1,x 被初始化为i值得一个拷贝(也就是3)
2,x 被乘以 2 后等于6。但是i任然是3。
3,doubleData方法结束后,x不再使用。

其它7种基础数据类型和int一样,都是拷贝了值,按照值传递。

2. 引用数据类型作为参数

2.1 数组

public class Person {

    public static void main(String[] args) {
        int[] a = new int[2];
        a[0] = 5;
        a[1] = 7;
        System.out.println(a[0] + "," + a[1]);
        change(a);
        System.out.println(a[0] + "," + a[1]);
    }

    public static void change(int[] b){
        int tmp = b[0];
        b[0] = b[1];
        b[1] = tmp;
    }
}

输出

5,7
7,5

在这里插入图片描述

过程:
1、a指向的引用地址是:0X00000S11。
2、函数调用传递的时候,b会拷贝a的引用地址,指向0X00000S11。
3、change函数调用完毕后,b地址释放。但是a指向的地址还存在。

2.2 对象

2.2.1 对象引用传递

public class Person {

    private int id;

    Person(int id){
        this.id = id;
    }

    public void setId(int id){
        this.id = id;
    }

    public int getId(){
        return this.id;
    }

    public static void change(Person person){
        person.setId(7);
    }

    public static void main(String[] args) {
        Person cleverCode = new Person(5);
        System.out.println(cleverCode.getId());
        change(cleverCode);
        System.out.println(cleverCode.getId());
    }
}

输出

5
7

在这里插入图片描述

过程:
1、cleverCode指向了堆区new Person()引用,引用地址为的0X00000S13。
2、change方法,参数传递的时候,person拷贝了cleverCode指向的堆引用地址。
3、当调用change方法的时候,里面setId(7)。实际上是调用了new Person().setId(7)。

2.2.2 重新赋值

public class Person {

    private int id;

    Person(int id){
        this.id = id;
    }

    public void setId(int id){
        this.id = id;
    }

    public int getId(){
        return this.id;
    }

    public static void change(Person person){
        Person tom = new Person(9);
        person = tom;
        person.setId(7);
    }

    public static void main(String[] args) {
        Person cleverCode = new Person(5);
        System.out.println(cleverCode.getId());
        change(cleverCode);
        System.out.println(cleverCode.getId());
    }
}
5
5

刚开始person确实拷贝了cleverCode的引用地址。指向了0X00000S13。
在这里插入图片描述
但是person = tom进行了重新赋值。person的引用和tom的地址一样了,变成了:0X00000S19。
在这里插入图片描述
调用:person.setId(7);实际上是改变的0X00000S19地址的New Person()对象的值。

接口和对象一样。

2.3 String

String 也是一个对象。

public class Person {
    
    public static void change(String b){
        //b = new String("wan");
        b = "wan";
    }

    public static void main(String[] args) {
        String a = "zao";
        System.out.println(a);
        System.out.println(a);
    }
}

输出

zao
zao

没有变化的原因是b的指向的地址发生了变化。
在这里插入图片描述

参考资料

《你真的理解Java的按引用传递吗?》:https://blog.csdn.net/cauchyweierstrass/article/details/49047217
《Java 基础之方法中的参数》:https://blog.csdn.net/qq_38182125/article/details/88094475
《JAVA中的栈和堆》:https://www.cnblogs.com/ibelieve618/p/6380328.html

技术交流

欢迎关注我的微信公众号:程序员大宝。一个乐于分享的程序员!

  • 3
    点赞
  • 30
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值