美文网首页
再谈谈Java中的传值

再谈谈Java中的传值

作者: 小愚笨 | 来源:发表于2017-06-21 15:59 被阅读45次
首先看一下面试中遇到的一道题
public class StringBufferTest {

    public static void main(String[] args){
        StringBuffer A = new StringBuffer("A");
        StringBuffer B = new StringBuffer("B");
        operator(A,B);
        System.out.println(A);
        System.out.println(B);
    }

    public static void operator(StringBuffer x, StringBuffer y){
        x = x.append(y);
        y = x;
    }
}

对于这道题的输出是什么呢?

(A) AB AB
(B) AB A
(C) A A
(D) AB B

看看Java中的方法参数传值方式

Java总是采用按值调用。也就是说,方法得到的是所有参数值得一个拷贝,特别是,方法不能修改传递给它的任何参数变量的内容。

方法参数共有两种类型:

  • 基本数据类型(数字,布尔值),这种方式是直接拷贝参数,传递副本。
  • 对象引用,这种方式是拷贝引用的地址,传递对象的引用。

有些程序员认为Java对对象采用的是引用调用,实际上,这种理解是不对的。由于这种误解具有一定的普遍性,所以下面给出一个反例来详细地阐述一下这个问题。
首先,编写一个交换两个雇员对象的方法:

public class Employee {
    private String name;
    private Integer age;

    public Employee(String name, Integer age) {
        this.name = name;
        this.age = age;
    }

    public static void main(String[] args) {
        Employee a = new Employee("Alice",20);
        Employee b = new Employee("Bob",32);
        swap(a,b);
        System.out.println(a.name);
        System.out.println(b.name);
    }

    public static void swap(Employee x, Employee y) {
        Employee temp = x;
        x = y;
        y = temp;
    }
}

如果Java对对象采用的是引用调用,那么执行上面的main方法,将能够实现交换数据的效果。
但是,方法并没有改变存储在 a 和 b 中的对象引用。swap 方法的参数 x 和 y 初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝。
最终,白费力气。在方法结束时参数变量 x 和 y 被丢弃了。原来的变量 a 和 b 仍然引用这个方法调用之前所引用的对象,如下图:

image.png
这个过程说明:Java对对象采用的不是引用调用,实际上,对象引用进行的是值传递
下面总结一下Java程序设计语言方法参数的使用情况:
  • 一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)
  • 一个方法可以改变一个对象参数的状态。
  • 一个方法不能让对象参数引用一个新的对象。

相关文章

网友评论

      本文标题:再谈谈Java中的传值

      本文链接:https://www.haomeiwen.com/subject/anftcxtx.html