您的位置:首页 > 其它

一个基本类型在方法中修改引起的思考

2017-02-13 10:44 260 查看

一个基本类型在方法中修改引起的思考?

今天同事在RTX群中问了一个问题:

如何能写一个方法,输出a=100, b=100

public static void main(String[] args) {
int a = 10;
int b = 10;
method(a, b);// 静态方法
System.out.println("a=" + a + ", " + "b=" + b);
}


本来想着直接在method中对a, b赋值不就好了,这么简单。再想了一下应该不会这么简单,然后开始回忆primitive type的存储是怎么样的。

primitive type是存在栈中的,并且有值的。object type是将引用存在栈中,但是对应的栈中的值是引用,真正的值放在heap中。

那么应该可以啊。然后动手一试,结果不行。但记得list修改是可以的,于是再测试list,发现List是可以的。

上SO去查查吧。

于是得到以下结论:

java在给method传参的时候,都是传值的。即pass-value-only.

对于基本类型,传进去的是 标识符 对应的值,然后再使用一个新的 标识符 指向它。对于对象类型的话, 传进去的是 引用 指向的值,然后再使用一个新的 引用 指向它。这两句话总结来说,就是传进去的是对应的内存地址, 然后fork一个标识符或者引用。

那么对于不可变的变量来说,每次变更都会分配一个不同的内存地址给fork出来的引用。这样就不会对原来的变量有影响。 对于可变的变量来说,内存地址没有变化,但是内存地址中的东西发生了变化,那么对应于原来的引用和fork出来的变量就会不同。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐