Java中值传递和地址传递

Java中值传递和地址传递

为了更好的理解Java中的值传递和地址传递,首先需明确Java中的数据类型有哪些:

Java中的数据类型:

  • 基本数据类型:八大基本数据类型包括:字节(byte)、短整形(short)、整形(int)、长整形(long)、单精度浮点型(float)、双精度浮点型(double)、单字符型(char)、布尔值(boolean);
  • 引用数据类型:类、接口、数组;

值传递和地址传递概念:

  • 值传递:传入变量的数值,函数不能改变变量的数值;即在函数中形参发生变化不影响实参;
  • 地址传递:传入变量的地址,函数可以根据变量地址,访问变量,自然就能改变变量的值;又名引用传递,传递引用对象,在函数变化中形参的变化会影响实参;

Java中的值传递和地址传递:

  • 对于基本数据类型,在方法调用时,传递的参数按值的拷贝传递,传递的是值的拷贝,也就是说传递后就互不相关了。示例如下:

    public class PassValue {
        public static void main(String[] args) {
            int a = 10;
            short b = 20;
            double c = 30.4;
            change(a);
            System.out.println("main中的a = " + a);
            change(b);
            System.out.println("main中的b = " + b);
            change(c);
            System.out.println("main中的c = " + c);
    
        }
        public static void change(int a){
             a = 50;
            System.out.println("change中的 a = " + a);
        }
        public static void change(short b){
            b = 50;
            System.out.println("change中的 b = " + b);
        }
        public static void change(double c){
            c = 50.0;
            System.out.println("change中的 c = " + c);
        }
    }
    

    结果展示:

    change中的 a = 50
    main中的a = 10
    change中的 b = 50
    main中的b = 20
    change中的 c = 50.0
    main中的c = 30.4
    
  • 对于引用数据类型:在方法调用时,传递的参数是按引用进行传递,其实传递的引用的地址,也就是变量所对应的内存空间的地址。栈中的变量存储的即为内存空间的地址,即对于引用数据类型,Java在进行方法调用时,也是将变量中保存的地址作为拷贝值进行传递;示例如下:

    public class PassValue {
        public static void main(String[] args) {
            String name = "ahtoh";
            change(name);
            System.out.println("main中的 name = "+ name);
        }
        public static void change(String a){
             a = "ahtohlove";
            System.out.println("change中的 a = " + a);
        }
    }
    

    结果展示:

    change中的 a = ahtohlove
    main中的 name = ahtoh
    

    分析如下:

    1. name = “ahtoh”;
    2. 调用change()方法时,拷贝“ahtoh”的地址,即拷贝了name中的值;
    3. a重新赋值并指向了"ahtohlove";
    4. name指向不变,还是指向"ahtoh";
  • 示例代码:

    public class PassValue {
        public static void main(String[] args) {
            StringBuilder name = new StringBuilder("ahtoh");
            change(name);
            System.out.println("main中的 name = "+ name);
        }
        public static void change(StringBuilder a){
             a.append("love");
            System.out.println("change中的 a = " + a);
        }
    }
    

    结果展示:

    change中的 a = ahtohlove
    main中的 name = ahtohlove
    

    分析如下:

    1. name = “ahtoh”;
    2. 调用change()方法时,拷贝“ahtoh”的地址,即拷贝了name中的值;
    3. change()方法直接改变了指向对象的值"ahtoh"+“love”;
    4. 引用没有改变,引用指向的值发生了改变,因此结果变成了ahtohlove;

总结:Java只有值传递!

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值