JAVA方法值传递OR引用传递
2015-06-04 21:58
501 查看
转自:http://www.blogjava.net/yongboy/archive/2010/11/25/346214.html
对于JAVA方法是值传递,还是引用传递,有人一直以来争论不休。不如忘记这些提法,反而会容易理解一些。
参数的传递分为两类:
1。基本数据,变量是直接赋值。
输出结果为:0
可以这么认为,在栈区 value 的值赋给了一个生命周期很短的变量 num,下面的事情就是变量num的自家事情了。
2。对象参数,传递的是永远是对象的引用。
这个例子最后输出结果为:name :china
在栈区(stack),存在两个Person对象引用:|
p把对象的引用地址赋值给了per,p也就完成了使命;
per.setName("China"); 这一句话意味着per操纵目标对象的setName方法。此时p和per都指向了同一个存放在堆区(heap)Person对象;
per所引用的对象地址被重新赋值:per = new Person("english"); 自此per就和p就一点关系都没有了:p所指向的对象和per所指向的对象是两个不同的对象了。
常见的基本数据数组也是一种对象。
小结:无论是基本数据还是对象,都是赋值操作,基本数据赋值直接在栈区进行,对象只是把对象的引用地址赋值,但对应同一个对象。
对于JAVA方法是值传递,还是引用传递,有人一直以来争论不休。不如忘记这些提法,反而会容易理解一些。
参数的传递分为两类:
1。基本数据,变量是直接赋值。
public static void main(String[] args) { int value = 0; change(value); System.out.println(value); } private static void change(int num) { num = 99; }
输出结果为:0
可以这么认为,在栈区 value 的值赋给了一个生命周期很短的变量 num,下面的事情就是变量num的自家事情了。
2。对象参数,传递的是永远是对象的引用。
public class ObjectTest { public static void main(String[] args) { Person p = new Person("Hi"); change(p); System.out.println(p); } private static void change(Person per) { per.setName("China"); per = new Person("english"); } } class Person { public Person(String name) { this.name = name; } private String name; public String getName() { return name; } public void setName(String name) { this.name = name; } @Override public String toString() { return "name : " + getName(); } }
这个例子最后输出结果为:name :china
在栈区(stack),存在两个Person对象引用:|
p把对象的引用地址赋值给了per,p也就完成了使命;
per.setName("China"); 这一句话意味着per操纵目标对象的setName方法。此时p和per都指向了同一个存放在堆区(heap)Person对象;
per所引用的对象地址被重新赋值:per = new Person("english"); 自此per就和p就一点关系都没有了:p所指向的对象和per所指向的对象是两个不同的对象了。
常见的基本数据数组也是一种对象。
小结:无论是基本数据还是对象,都是赋值操作,基本数据赋值直接在栈区进行,对象只是把对象的引用地址赋值,但对应同一个对象。
相关文章推荐
- java 基础 接口
- JAVA基础——IO操作规律
- Java for LeetCode 146 LRU Cache 【HARD】
- Java SWT事件
- Eclipse配置PyDev插件
- Java程序设计 实验三
- java基础整理——集合
- gradle学习系列之eclipse中简单构建android项目
- Win7下用命令行方式收发邮件的方法
- Java开发中的23种设计模式详解(转)
- Netty之java序列化
- 部署java程序
- Java反射(一)
- Java for LeetCode 145 Binary Tree Postorder Traversal
- JAVA_连接池、DataSource、JNDI
- Java学习笔记(十):Java中的JNDI
- Struts2入门实例
- Java for LeetCode 144 Binary Tree Preorder Traversal
- Java I/O : Bit Operation 位运算
- Java I/O : Bit Operation 位运算