Java只有一种参数传递机制------按值传递
2016-03-15 17:42
351 查看
Java中并没有传递引用这一说,只有一种参数传递机制,就是按值传递
首先,最主要要强调的一点就是,Java 应用程序有且仅有的一种参数传递机制,并没有传递引用这一说。造成这一误解,主要是因为有这么一概念------对象是按引用传递的。引用是什么?不就是地址吗?地址是什么,不过就是一个整数值。我先来定义一下按值传递和按引用传递这两个概念吧。按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本。因此,如果函数修改了该参数,仅改变副本,而原始值保持不变。按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本。因此,如果函数修改了该参数,调用代码中的原始值也随之改变。
所以,最终结论就是一下三点:
1、对象是按引用传递的
2、Java 应用程序有且仅有的一种参数传递机制,即按值传递
3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本
4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本
这儿有举两个例子应该能明显点儿:
例如:
class Example1
{
public static void main(String[] args)
{
StringBuilder s1= new StringBuilder ("Hello");
StringBuffer s2=s1;
s2.append(" world!");
System.out.println(s1);
}
}
对象s1和s2指向的是内存中的同一个地址(这里请注意一下堆和栈的概念)因此指向的也是同一个对象。
如何解释“对象是按引用传递的”的呢?
这里的意思是进行对象赋值操作是传递的是对象的引用,因此对象是按引用传递的,有问题吗?
程序运行的输出是:
Hello world!.
这说明s2和s1是同一个对象。
这里有一点要澄清的是,这里的传对象其实也是传值,因为对象就是一个指针,这个赋值是指针之间的赋值,因此在java中就将它说成了传引用。(引用是什么?不就是地址吗?地址是什么,不过就是一个整数值)
再看看下面的例子,这是华为当年的一道面试题,也很简单,也是一个很明显的按值传递参数的例子:
[align=left]public class Test1 {[/align]
[align=left] public static void changeStr(String str){[/align]
[align=left] str="welcome";[/align]
[align=left] }[/align]
[align=left] public static void main(String[] args) {[/align]
String str="1234";
changeStr(str);
System.out.println(str);
[align=left] }[/align]
[align=left]}[/align]
[align=left]//输出结果:1234[/align]
[align=left]//这里虽然是一个静态方法,但是里面的变量是一个局部变量,[/align]
//所以这里不因为是静态方法,就误认为里面的变量也是静态变量了
按值传递和俺引用传递,总结一下其实就如下这么几点:
1、对象是按引用传递的
2、Java 应用程序有且仅有的一种参数传递机制,即按值传递
3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本
4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本
相关文章推荐
- java对世界各个时区(TimeZone)的通用转换处理方法(转载)
- java-注解annotation
- java-模拟tomcat服务器
- java-用HttpURLConnection发送Http请求.
- java-WEB中的监听器Lisener
- Android IPC进程间通讯机制
- Android Native 绘图方法
- Android java 与 javascript互访(相互调用)的方法例子
- Python动态类型的学习---引用的理解
- 介绍一款信息管理系统的开源框架---jeecg
- 聚类算法之kmeans算法java版本
- java实现 PageRank算法
- PropertyChangeListener简单理解
- c++11 + SDL2 + ffmpeg +OpenAL + java = Android播放器
- 插入排序
- 冒泡排序
- 堆排序
- 快速排序