Java中对象作为参数传到方法中属于值传递还是引用传递?

画重点:

Java 中所有的参数传递都是按值传递。

 

值传递:内存会开辟一个新的空间存储传入参数的拷贝值,方法中得到的就是这个拷贝值,修改方法中这个拷贝值,并不能改变原来的值。

(1)首先来看看基础数据类型

    public static void main(String[] args) {
        int age = 25;
        System.out.println( age );
        changeValue( age );
        System.out.println( age );
    }

    private static void changeValue(int age) {
        age = age + 5;
        System.out.println( age );
    }

/* 输出结果是:
age = 25
age = 30
age = 25
*/

根据输出结果可知,基础数据类型只是将age值的一份拷贝传入到方法中,在方法中的任何修改不会影响到方法外原来的age值。

(2)对象引用

下面将用两个例子来说明一下,对象作为参数传递到方法中也是按值传递的,只不过传递的值是对象的引用。

class Person {
    private String name;

    Person(String name) {
        this.name = name;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

Example 1:

    public static void main(String[] args) {
        Person person = new Person( "dz" );
        System.out.println( "name = " + person.getName() );
        changeName( person );
        System.out.println( "name = " + person.getName() );
    }

    private static void changeName(Person person) {
        person.setName( "newDz" );
        System.out.println( "name = " + person.getName() );
    }

/*输出结果是:
name = dz
name = newDz
name = newDz
 */

Example 2:

    public static void main(String[] args) {
        Person person = new Person( "wdz" );
        Person person1 = new Person( "sym" );
        System.out.println( "Before swap: person name = " + person.getName() );
        System.out.println( "Before swap: person1 name = " + person1.getName() );

        swap( person, person1 );

        System.out.println( "After swap: person name = " + person.getName() );
        System.out.println( "After swap: person1 name = " + person1.getName() );
    }

    private static void swap(Person x, Person y) {
        Person temp = x;
        x = y;
        y = temp;
        System.out.println( "Processing: person name = " + x.getName() );
        System.out.println( "Processing: person1 name = " + y.getName() );
    }

/*输出结果是:
Before swap: person name = wdz
Before swap: person1 name = sym
Processing: person name = sym
Processing: person1 name = wdz
After swap: person name = wdz
After swap: person1 name = sym
 */

其实从第二个例子中就可以看出,对象作为参数传入方法其实也是按值传入,不然的话,交换之后,person 与 person1 指向的对象也应该跟着交互,但是事实是原值并没有发送改变,下面的图可以让你对此有个更清晰的认识。

                    

(3)特殊的 String 类

    public static void main(String[] args) {
        String str = "test";
        System.out.println( "String Value= " + str );
        changeValue( str );
        System.out.println( "String Value= " + str );
    }

    private static void changeValue(String temp) {
        temp = "changed";
        System.out.println( "String Value= " + temp );
    }

/*输出结果是:
String Value= test
String Value= changed
String Value= test
 */

String不是基础类型,但是例子中的结果也不是像一般对象一样,这是因为String 类具有不可变性,一旦创建了 String 对象,那么它的值就不可改变了,任何修改都会产生一个新的 String 对象,changeValue 方法中 temp 已经指向了一个新的对象。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值