java中是值传递还是引用传递?

结论:java中是值传递

 

1、java内存模型

int n = 20;
String string = new String("Happy!");
String str = "Happy!";

  在赋值操作中,基本类型的20及其引用n都被存在了栈空间中;

         引用类型的引用的地址被存储在栈空间,新建的对象则被存储在堆空间。(String字面量赋值方式除外,字面量会存储在常量池里)

2、方法调用过程

  方法的调用就是给形参赋值的过程

   static void foo(int num)
    {
        num = 100;
    }
    
    static void foo(String str)
    {
        str = "Hello World!";
    }
    
    static void foo(StringBuilder builder)
    {
        builder.append("bich");
    }
    
    public static void main(String[] args)
    {
        //测试基本数据类型
        int n = 20;
        foo(n);
        System.out.println("n=" + n);//n=20
        
        //测试字符串类型
        String string = "Happy!";
        foo(string);
        System.out.println("string=" + string);//string=Happy!
        
        //测试类型可变的引用类型
        StringBuilder bui = new StringBuilder("Happy!");
        foo(bui);
        System.out.println("bui=" + bui);//bui=Happy!bich
    }

  对于基本类型来说:int n=20,调用foo(int num),先对形参赋值,使得num=20,在foo方法中的操作对于n=20来说是没有任何影响的;

  对于引用类型来说:StringBuilder bui = new StringBuilder("Happy!"),先对形参赋值使得builder=bui所引用的对象,即此时有bui和builder这两个引用同时指向了同一个StringBuilder对象,StringBuilder对象是可变的,所以foo方法对其进行append()操作之后,这个共同的StringBuilder对象也会发生变化,从而输出bui引用时,输出的是变化的StringBuilder对象。

  对于String来说:String string = "Happy!",虽然调用foo(String str)也会对str赋值,但是对str的操作是不会影响原来的传入对象的,即string永远引用的事"Happy!"这个对象。

 =============================================================================================================================

                  最怕一生碌碌无为,还说平凡难能可贵

=============================================================================================================================

转载于:https://www.cnblogs.com/wuxiexiaoren/p/8695765.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值