【Java学习笔记】传参机制

传参机制(极其重要!!!

一、基本数据类型传参机制

结论:基本数据类型,传递的是(值拷贝),形参的任何改变不影响实参

代码实例

public class practise {
    public static void main(String[] args){
        int a = 10;
        int b = 20;
        exchange method = new exchange();
        method.exchangemethod(a,b);
        System.out.println("main方法中的值:" + "a=" + a + "  " + "b=" + b);

    }
}

class exchange{
    public void exchangemethod(int a,int b){
        int temp = a;
        a = b;
        b = temp;
        System.out.println("类方法中交换后的值:" + "a=" + a + "  " + "b=" + b);
    }
}

//输出结果
类方法中交换后的值:a=20  b=10
main方法中的值:a=10  b=20

分析

  • (1)方法调用完成后,栈空间释放,主栈中的值并未受到影响

  • (2)换个角度看,输出的是 main 方法中的ab的值(即在主栈中执行的输出语句

二、引用数据类型传参机制

结论:引用数据类型传的是地址,形参影响实参

案例一

public class practise {
    public static void main(String[] args){
        person p = new person();
        p.age = 10;
        p.name = "jackson";
        b methodb =new b();
        methodb.test(p);
        System.out.println("main方法中的年龄为:" + p.age);

    }
}

class person{
    int age;
    String name;
}

class b{
    public void test(person p){
        p.age = 1000;
    }
}

//输出结果
main方法中的年龄为:1000

代码分析

  • (1)通过new创建了一个person类的一个对象p,堆空间中申请一段空间,返回地址给p,于是主栈中的p指向堆空间中对象p申请的一段空间

  • (2)通过new创建了一个b类的一个对象methodb,调用b类中的方法,此时会在申请一段栈空间用于方法的调用,由于传递的参数引用类型p传的是地址),此时方法中的p会指向主栈中p指向的堆空间,即主栈中的p和方法的栈空间中的p指向统一堆空间

  • (3)这个时候方法对p.age进行了修改,方法的栈空间释放,返回到主栈中,主栈中的p找到堆空间中的age,输出p.age的值,即是方法中的p.age的值

    请添加图片描述

案例二(把案例一中的 b 方法修改为p == null

public class practise {
    public static void main(String[] args){
        person p = new person();
        p.age = 10;
        p.name = "jackson";
        b methodb =new b();
        methodb.test(p);
        System.out.println("main方法中的年龄为:" + p.age);

    }
}

class person{
    int age;
    String name;
}

class b{
    public void test(person p){
        p = null
    }
}

//输出结果
main方法中的年龄为:10

分析:p = null这句话是对方法的栈空间有影响,对主栈并不会有影响(核心关键点

请添加图片描述

案例三

public class practise {
    public static void main(String[] args){
        person p = new person();
        p.age = 10;
        p.name = "jackson";
        b methodb =new b();
        methodb.test(p);
        System.out.println("main方法中的年龄为:" + p.age);

    }
}

class person{
    int age;
    String name;
}

class b{
    public void test(person p){
        p = new person();
        p.age = 99;
    }
}

//输出结果
main方法中的年龄为:10

分析:虽然p传进来了,但是方法中p又指向了一个新的堆空间,并不指向主栈中的p指向的堆空间,这个时候对主栈中的p并不会有影响

注意:方法中p指向创建的堆空间,方法执行后返回,这个堆空间并没有被引用会被当作垃圾进行回收

请添加图片描述

总结引用数据类型传递传的是地址,是否对主栈产生影响要看方法是否指向主栈中的堆空间并对主栈中堆空间的属性做出了修改

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

jackson凌

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值