韩顺平Java方法传参机制笔记感悟

大家对java方法的传参机制了解有多少,现在我给大家用代码和画图来讲解一下吧,请耐心看下去,会有不少的收获

基本数据类型的传参机制

<!--more-->

public class Method {
    public static void main(String[] args) {
​
        int a = 10;
        int b = 20;
​
        A obj = new A();
        obj.swap(a, b);
​
        System.out.println("\nmain方法\na=" + a + "\nb=" + b);
    }
​
​
​
    }
    class A {
        public void swap(int a, int b){
            System.out.println("\na和b交换前的值\na=" + a + "\nb=" + b);
​
            int tmp = a;
            a = b;
            b = tmp;
            System.out.println("\na和b交换后的值\na=" + a + "\nb=" + b);
​
        }
}
​

运行结果

a和b交换前的值
a=10
b=20
​
a和b交换后的值
a=20
b=10
​
main方法
a=10
b=20
​

同学们想一想为什么a与b在进行交换以后在main方法中依旧是原来的顺序。

这里给大家画个图

 

在调用swap时就会开启swap栈,在swap使用结束后swap栈也会被销毁,而此时main方法中的a 和 b还是原先的ab,也就是说swap方法并没有影响到主方法的值。这也是很重要的一个知识点。

基本数据类型,传递的时值拷贝,形参的任何改变不影响实参!!!

引用数据类型的传参机制

public class Method2 {
    public static void main(String[] args) {
​
   B b = new B();
   int[] arr = {1, 2, 3};
   b.test(arr);
   System.out.println("main的 arr数组");
   for(int i = 0; i < arr.length; i++) {
       System.out.print(arr[i] + "\t");
   }
        System.out.println();
    }
​
​
​
    }
    class B {
        public void test(int[] arr){
            arr[0] = 200;
​
            System.out.println("test的arr数组");
​
            for(int i = 0; i < arr.length; i++) {
                System.out.print(arr[i] + "\t");
            }
            System.out.println();
        }
        }
​
​

运行结果

test的arr数组
200 2   3   
main的 arr数组
200 2   3   

此时为什么在B方法中修改了数组,而main方法中也被修改呢

 

因为此时使用的是数组引用类型传递,main方法和test方法中的arr都指向了同一个地址,也就是同一个值,所以test的修改也会影响导main方法中的arr数组值。

引用类型传递的是地址(传递也是值,值是地址),可以通过形参影响到实参!

继续思考

想来大家现在已经理解了基础数据类型和引用类型的区别,那么再出一道题大家是否能答出来,或者知道为什么吗?代码如下

public class Method3 {
    public static void main(String[] args) {
​
        C c = new C();
​
        Person p = new Person();
        p.age = 10;
        p.name = "白都";
​
        c.test(p);
        System.out.println("main 的 p.age= " + p.age);
​
    }
​
}
    class Person {
        String name;
        int age;
    }
    class C {
        public void test(Person p) {
            p = null;
        }
    }
​

大家想想此时main输出的age应为多少?

运行结果

main 的 p.age= 10

大家有的人写错了这道题,很好奇为什么不是为null, C中不是执行了 p = null 吗,这里我给大家简单的画一下这张图。.

 

和大家想象的不一样,p = null 不是将对象的值改为null,而是将连向对象的线给断掉,所以此时不会改变main方法中的值。

在出一道类似的题,加强以下大家的对引用的认知,代码如下。

大家先思考在看答案。

public class Method3 {
    public static void main(String[] args) {
​
        C c = new C();
​
        Person p = new Person();
        p.age = 10;
        p.name = "白都";
​
        c.test(p);
        System.out.println("main 的 p.age= " + p.age);
​
    }
​
}
    class Person {
        String name;
        int age;
    }
    class C {
        public void test(Person p) {
            p = new Person();
            p.name = "tom";
            p.age = 99;
        }
    }
​
​

 

 

运行结果

main 的 p.age= 10

为何值还是没有改变,并没有指向null,而是改变了值啊。其实此时是因为 在C中创建了一个新的p对象,C修改的p的值也指向了堆中新的对象,而原来main的对象没有受到改变,所以输出的值自然不会改变。

到现在想来大家对基础和引用类型区别已经分清,如果还有问题,可以关注并私信我的公众号,我会一一解答。

如果有帮助到你的话,请关注我的公众号叭

公众号: 白都每天学java

个人博客 白都 (baidu2001.top)

CSDN 白.都

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

白.都

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

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

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

打赏作者

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

抵扣说明:

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

余额充值