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

来源:互联网 发布:淘宝农村市场调研报告 编辑:程序博客网 时间:2024/06/03 09:02

对于学习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

0 0
原创粉丝点击