Java是值传递还是引用传递?
来源:互联网 发布:sm玩法 知乎 编辑:程序博客网 时间:2024/05/21 09:05
这个问题我相信不少老鸟都解释的模棱两可,我自己也“时悟时误”我觉得大家不要纠结这个问题。
首先解释下两个名词:
1、值传递:传递的是值的拷贝,也就是说传递后就互不相关了。
2、引用传递:传递的引用的地址,也就是变量所对应的内存空间的地址。
先记住这两句话:
1、Java基本类型是按值传递。
2、Java引用类型是按“引用传递”
变量分为基本类型(八种数据类型)和引用类型。
一、基本类型值传递
例子:
public static void change(int value) { value = 100; } public static void main(String[] args) { int a = 10; System.out.println(a); //毫无疑问 输出10 change(a);//传的是a的值的copy System.out.println(a); //所以原来的a不改变 输出10 } 结果是:10 (回车) 10
二、引用类型引用传递
1)例子:
public static void change(StringBuffer s1, StringBuffer s2) { s2 = s1;//注意哦,这是把对象s1的内存地址赋值给s2,也就是现在s2指向的是s1的数据(所以现在s1,s2指向同一内存位置) System.out.println(s1);//毫无疑问 输出 good System.out.println(s2);//同样 输出 good s2.append("luck");//数据改变了哦 System.out.println(s1);//所以输出 goodluck System.out.println(s2);//同上哦 s1=new StringBuffer("haha"); //新建个对象 System.out.println(s1);//输出 haha } public static void main(String[] args) { StringBuffer s1 = new StringBuffer("good"); StringBuffer s2 = new StringBuffer("bad"); change(s1, s2); System.out.println(s1); //s1对象内容已经改变了,所以输出goodluck System.out.println(s2); //s2一直没有改变 所以输出 bad } 输出结果:good good goodluck goodluck haha goodluck bad (间隔回车)
如果没搞明白可能是形参名字搞怪(好多人都这么写,难道故意迷惑人吗? -- --)
修改成下面这样:
public static void change(StringBuffer a, StringBuffer b) { b = a;//b此时不代表s2了,因为它被赋值给a了并且和a指向同一对象s1(所以接下来没有对s2的修改,也就解释主函数输出s2为bad) System.out.println(a); System.out.println(a); b.append("luck"); System.out.println(a); System.out.println(b); a = new StringBuffer("haha");//a指向了新的内存地址哦 System.out.println(a);//所以输出 haha } public static void main(String[] args) { StringBuffer s1 = new StringBuffer("good"); StringBuffer s2 = new StringBuffer("bad"); change(s1, s2); System.out.println(s1); System.out.println(s2); }是不是好理解点了,主函数中调用change(s1, s2)方法把对象s1和s2按照引用传递的方式,把两个对象的地址传个引用方法,也就是此时a b分别指向s1,s2在内存中的位置,也就是只要改变a或者b,s1和s2的内容就会改变。
2)、string 类型引用,string也算是引用类型中的子类,但是由于String类不可变,所以像下面例子中
public static void change(String b) { System.out.println(b);//按引用传递,传递a的地址。b指向a的位置,所以输出 hi b = b + " hello";//重新创建了一个对象,b指向了一个新的地址 System.out.println(b);//所以输出 hi hello } public static void main(String[] args) { String a = new String("hi"); System.out.println(a);//输出 a change(a); System.out.println(a);//a并未改变 输出 hi }结果:hi hi hello hi
其实大家不用纠结Java是按照什么传递的,理解本质就好了。
阅读全文
0 0
- java是值传递,还是引用传递?
- java是值传递还是引用传递?
- java是值传递还是引用传递
- java 是值传递还是引用传递
- java是值传递还是引用传递。
- java是值传递还是引用传递
- JAVA是值传递还是引用传递
- java是值传递还是引用传递?
- Java 是值传递还是 引用传递?
- JAVA是引用传递还是值传递
- Java是值传递还是引用传递?
- java是值传递还是引用传递
- Java中参数传递是值传递,还是引用传递
- Java参数传递到底是值传递还是引用传递?
- 到底是值传递还是引用,Java
- Java中到底是值传递还是引用传递?
- java 方法中参数是值传递还是引用传递
- Java-String 到底是值传递还是引用传递
- JAVA8 十大新特性详解
- 实现购物车结算功能:批量和全部删除,全选和反选,单价和总价,数量增减,页面隐藏和显示
- React的生命周期
- 分享一些做界面设计的原材料
- c# 如何将下载完的dll文件加载到vs2012中
- Java是值传递还是引用传递?
- 【JZOJ 5418】【NOIP2017提高A组集训10.24】合影
- fiddler-bpu 拦截多个请求
- HashMap的工作原理
- HTTP协议(一)
- JSP2 Taglib 自定义标签学习
- Android_数据库操作
- 蓝桥杯--前缀判断
- jQuery UI 实例