您的位置:首页 > 编程语言 > Java开发

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 应用 对象