Java只有一种参数传递机制------按值传递

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中就将它说成了传引用。(引用是什么?不就是地址吗?地址是什么,不过就是一个整数值)


  再看看下面的例子,这是华为当年的一道面试题,也很简单,也是一个很明显的按值传递参数的例子:

public class Test1 {
    public static void changeStr(String str){
       str="welcome";
   }
    public static void main(String[] args) {
        String str="1234";
         changeStr(str);
        System.out.println(str);
   }
}
//输出结果:1234
//这里虽然是一个静态方法,但是里面的变量是一个局部变量,
//所以这里不因为是静态方法,就误认为里面的变量也是静态变量了

按值传递和俺引用传递,总结一下其实就如下这么几点:

  1、对象是按引用传递的
  2、Java 应用程序有且仅有的一种参数传递机制,即按值传递
  3、按值传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的一个副本
  4、按引用传递意味着当将一个参数传递给一个函数时,函数接收的是原始值的内存地址,而不是值的副本

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值