Java按值传递还是按引用?函数可修改传入变量吗?

1“Java中参数传递都是按值传递”按值传递是产地的值的拷贝,按引用传递传递的是引用的地址值,所以统称为按值传递。
2 基本类型,String = “hello” 是按值传递的,其余都按引用传递。

函数可修改传入变量吗?
基本类型不可以,引用类型可以

import java.util.LinkedList;  
import java.util.List;  

public class Api {  
    public static final void main(String[] args) {  
        int tmp = 10;  
        change(tmp);  
        //可以看到,传入的temp没有被修改掉  
        System.out.println(tmp);  

        List<Integer> list = new LinkedList<Integer>();  
        change(list);  
        //可以看出,传入的List被修改了,之前大小是0,现在打印结果是1  
        System.out.println("size=" + list.size());  
    }  

    public static void change(int tmp) {  
        tmp = tmp * 2;  
    }  

    public static void change(final List<Integer> list) {  
        list.add(1);  
    }  

}  

实际上,上面这个问题和这个问题是一个问题”JAVA函数传递的是值,还是引用”
JAVA传递的是值,只不过这个值的Value是变量的引用.

change(int tmp)之所以没有修改传入的值,是因为Integer是不可变对象,不能直接修改Integer的值,只能生成一个新的对象然后指向它.这样函数里面的临时变量和传入的变量值(引用)已经不一样了

change(final List list) 里面的值之所以被修改了,是因为参数出入的值是引用,引用没有变,但是引用的对象变了.由于引用的对象变了,所有指向这个对象的变量当然也就变了.

细心的你可能已经发现,change(int tmp)这个参数不能添加final.
如果添加就是代表tmp不能修改为别的对象,而change(final List list)却可以. 原因也是一样的:
change(int tmp):在函数的内容中,我们会对tmp进行修改,导致tmp指向不同对象,如果声明为final则修改处会出现语法错误.

change(final List list):虽然final修饰后不能修改为别的对象,但是对象里面的内容是可以修改的.

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值