Java中参数传递问题

接触java有一段时间了,但是一直对于Java的参数传递很困惑,今天整理一下:

java中参数传递分为两种:值传递、引用传递(又称为地址传递)

JAVA里除了8种基本类型传参数是值传递,其他的类对象传参数都是引用传递

值传递:比较好理解,就是传递的是参数的值的拷贝。所以在函数内部无论怎么操作,外部的变量都不会改变。

public class test{
    public void add(int i){
        i=10;
    }
    @Test
    public void test(){
        int a=5;
        add(a);
        System.out.println(a);
    }
}

输出结果:5

 

引用传递:传递的是对象的地址拷贝,就像钥匙一样,新配的一样可以开原来的门。

public class test{
    public void addD(StringBuilder sb){
        sb.append("d");
    }
    @Test
    public void test(){
        StringBuilder sb=new StringBuilder("abc");
        addD(sb);
        System.out.println(sb);
    }
}

上面的例子,因为传入的是引用的拷贝,所以值会改变。

在了解这个知识点的基础上,有两个需要注意的地方:

(1)Integer对象,为引用传递,但是值不会改变。具体可以参考:Integer参数传递问题

(2)String对象:可以参考:Java 基本数据类型 及 == 与 equals 方法的区别(关于String的讲解摘抄如下)

  • String str1 = "abcd"的实现过程:首先栈区创建str引用,然后在String池(独立于栈和堆而存在,存储不可变量)中寻找其指向的内容为"abcd"的对象,如果String池中没有,则创建一个,然后str指向String池中的对象,如果有,则直接将str1指向"abcd"";如果后来又定义了字符串变量 str2 = "abcd",则直接将str2引用指向String池中已经存在的“abcd”,不再重新创建对象;当str1进行了赋值(str1=“abc”),则str1将不再指向"abcd",而是重新指String池中的"abc",此时如果定义String str3 = "abc",进行str1 == str3操作,返回值为true,因为他们的值一样,地址一样,但是如果内容为"abc"的str1进行了字符串的+连接str1 = str1+"d";此时str1指向的是在堆中新建的内容为"abcd"的对象,即此时进行str1==str2,返回值false,因为地址不一样。
  • String str3 = new String("abcd")的实现过程直接在堆中创建对象。如果后来又有String str4 = new String("abcd"),str4不会指向之前的对象,而是重新创建一个对象并指向它,所以如果此时进行str3==str4返回值是false,因为两个对象的地址不一样,如果是str3.equals(str4),返回true,因为内容相同。
上一篇:python二级考试题详解


下一篇:java中的常量池