令人困惑的值传递和引用传递

对于学习java的同学来说,有一个比较容易让人困惑的问题,就是java中的参数的传递,可能大家都听到过各种的说法,比如有一种比较经典的说法就是基本数据类型是值传递的,引用数据类型是引用传递的。听起来好像很有道理,但是大家要牢记一点,就是java中只有值传递。

下面通过几个简单的代码例子来说明。
首先是简单的基本数据类型。


public class Main {
    public static void main(String[] args) {
        int a1 = 20;
        change(a1);
        System.out.println(a1);

    }

    private static void change(int a1) {
        // TODO Auto-generated method stub
        a1 = 200;
    }
}

输出结果是20
这个好像比较好理解,就是基本数据类型作为方法的参数,传递的是基本数据类型的一个副本,方法中对于这个副本的改变不会影响到原来的变量的值。

下面是你引用数据类型
成员变量只有一个age


public class Person {
    int age =10;
}

public class Main {
    public static void main(String[] args) {
        Person person = new Person();
        change(person);
        System.out.println(person.age);
    }

    private static void change(Person person) {
        // TODO Auto-generated method stub
        person.age = 300;
//      person   = new Person();

    }

    private static void change(int a1) {
        // TODO Auto-generated method stub
        a1 = 200;
    }
}

输出是300


public class Main {
    public static void main(String[] args) {
//      int a1 = 20;
//      change(a1);
//      System.out.println(a1);

        Person person = new Person();
        change(person);
        System.out.println(person.age);
    }

    private static void change(Person person) {
        // TODO Auto-generated method stub
    //  person.age = 300;
        person   = new Person();

    }

    private static void change(int a1) {
        // TODO Auto-generated method stub
        a1 = 200;
    }
}

输出的是10

这是为什么呢?因为在将引用数据类型作为参数传递时候,同样传递是这个引用的副本。
当第一种方式进行修改引用指向的值的时候,将值从10改为300,这个时候,引用指向的值确实已经发生变化了。
当第二种方式,只是这个副本的引用指向的是另外一个变量的地址,原来的本尊却仍然指向原来的10,这样,输出的结果确实没有变化。

对于字符串来说,也是一个引用数据类型,同时它是一个final型的变量,这就导致他的值是不可变的,因此当把他作为参数传递的时候,总是将引用指向了另一个变量的内存地址,因此是输出的值是不会改变的。

public class Main {
    public static void main(String[] args) {
        String str  = "abf";
        change(str);
        System.out.println(str);
        }
    private static void change(String str) {
        // TODO Auto-generated method stub
        str = "glc";

    }

输出结果是abf

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值