如何理解java的值传递?

1、基本数据类型(值传递

java中的基本数据类型可以在栈(stack)中直接分配内存,它有以下八种:

booleanbytecharshortintlongfloatdouble

2、引用数据类型(址传递引用传递

除了基本数据类型外,他们的对象的引用在栈(stack)中,对象实际存放在堆(heap)中,实际上是将对象的地址赋值了过去。

3、特殊类型(效果等同于值传递

String类型、Integer类型等,这些类型保存数据的变量是final类型,只要牵涉到数据变更,都需要返回一个新建的对象,但原来的对象的数据并不会变更,效果等同于值传递。

测试代码

package org.goodStudy.test;

import lombok.Data;
import lombok.NoArgsConstructor;

import java.util.HashMap;

/**
 * @Author dingws
 * @PackageName JavaStudy
 * @Package org.goodStudy.test
 * @Date 2023/1/5 16:35
 * @Version 1.0
 */
public class testPassParam {

    @Data
    static class MyClass {
        private Integer aa = 00;
    }

    static void changIntegerValue(Integer param){
        param = 1;
    }

    static void changStringValue(String param){
        param = "xyz";
    }

    static void changClassValue(MyClass param){
        param.setAa(11);
    }

    static void changMapValue(HashMap param){
        param.put("0", "xyz");
    }

    static void changArrayValue(char[] param){
        param[0] = 'x';
        param[1] = 'y';
        param[2] = 'z';
    }

    static void changCharValue(char param) {
        param = 'x';
    }

    public static void main(String[] args) {
        Integer a = new Integer(0);
        System.out.println("a = " + a);
        changIntegerValue(a);
        System.out.println("after chang value --- a = " + a);

        String b = "abc";
        System.out.println("b = " + b);
        changStringValue(b);
        System.out.println("after chang value --- b = " + b);

        String c = new String("abc");
        System.out.println("c = " + c);
        changStringValue(b);
        System.out.println("after chang value --- c = " + c);

        HashMap d = new HashMap();
        d.put("0", "abc");
        System.out.println("d = " + d);
        changMapValue(d);
        System.out.println("after chang value --- d = " + d);

        char[] e = new char[]{'a', 'b', 'c'};
        System.out.println("e = " + e[0] + e[1] + e[2]);
        changArrayValue(e);
        System.out.println("after chang value --- e = " + e[0] + e[1] + e[2]);

        char f = 'a';
        System.out.println("f = " + f);
        changCharValue(f);
        System.out.println("after chang value --- f = " + f);

        MyClass myClass = new MyClass();
        System.out.println("myClass = " + myClass);
        changClassValue(myClass);
        System.out.println("after chang value --- myClass = " + myClass);
    }
}

上面代码输出结果:

a = 0
after chang value --- a = 0
b = abc
after chang value --- b = abc
c = abc
after chang value --- c = abc
d = {0=abc}
after chang value --- d = {0=xyz}
e = abc
after chang value --- e = xyz
f = a
after chang value --- f = a
myClass = testPassParam.MyClass(aa=0)
after chang value --- myClass = testPassParam.MyClass(aa=11)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值