Java成员方法传参机制理解

一、基本数据类型
  1. 基本数据类型采用值传递的模式,形参的改变不影响实参。
public class MethodParameter01 {
         public static void main(String[] args){
              int a = 10;
              int b = 20;
              AA t = new AA();
              t.swap(a, b); //基本数据类型,传递的是值(值拷贝),形参的改变不影响实参
              System.out.println("在main中,swap(int a, int b)后, a=" + a + " b=" + b); //打印main空间里面的局部变量
      }
 }

class AA {
       public void swap(int a, int b){
              System.out.println("在swap中,交换前的值,a=" + a + ", b=" + b);
              //交换的是swap栈空间里面的局部变量
              int tmp = a;
              a = b;
              b = tmp;
              System.out.println("在swap中,交换后的值,a=" + a + ", b=" + b);
        }
}

代码运行结果:

在swap中,交换前的值,a=10, b=20
在swap中,交换后的值,a=20, b=10
在main中,swap(int a, int b), a=10 b=20

一图胜千言
在这里插入图片描述

分析:在swap()里面修改的是swap栈里面的局部变量,不会改变main栈里面的局部变量。

二、引用数据类型
  1. 引用数据类型,采用引用传递,传递的是地址,形参可以通过实参传递的地址来修改该内存地址里面存储的数据。
  2. 地址值本身是值传递,当形参变量指向的内存地址值发生改变时(指向一块新的内存空间),不会影响实参的值,实参的指向不变。类比C/C++,修改一个变量的值,需要传递该变量的内存地址。
public class MethodParameter03 {
        public static void main(String[] args){
                Person p = new Person();
                p.age = 10;
                p.name = "jack";

                ChangeInfo x = new ChangeInfo();
                x.changeAge(p);
                System.out.println("p.age=" + p.age);

                x.changeName(p);
                System.out.println("p.name=" + p.name);
        }
}

class Person {
        int age;
        String name;
 }

class ChangeInfo {
       public void changeAge(Person p){
                //p接受地址,地址值本身是值传递,通过地址访问对象所在的内存空间,进而修改数据
               p = null; //将changAge栈空间里面的变量p置为null,不影响main空间里面的变量p
       }

       public void changeName(Person p){
                p.name = "pony"; //通过地址访问到内存,并修改内存数据
        }
 }   

代码运行结果:

p.age=10
p.name=pony

画图分析

  1. 执行x.changeAge(p);changeAge栈里面的变量p接受main栈传递来的地址值,之后changeAge栈里的变量p被修改,但是不会修改main栈里的p即指向不变,因为main栈和changeAge栈是互相独立的。简单来说,main函数给changeAge函数传递的是p变量的值,而不是p变量的地址,所以在changeAge里面修改p变量的值不会影响main里面p的值。

在这里插入图片描述
2. 执行x.changeName(p);changeName栈的变量p接受main栈传来的地址,并通过该地址访问到对应的内存空间,修改该地址空间存储的name变量的值。然后main栈里面的变量p访问该地址空间存储的数据时,读取到的数据就是修改后的。同理,传递的是age变量和name变量所在的内存地址,通过地址修改变量的值。
在这里插入图片描述

三、Java数据类型

在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值