【Java学习】java方法参数的值传递和引用传递

来源:互联网 发布:联想电脑怎么卸载软件 编辑:程序博客网 时间:2024/06/01 10:42

通俗的理解,传递值-传递值的副本;引用传递-传递引用的副本,对于值传递(传递的对象时基本数据类型),方法如果对该对象进行修改,那么原对象不变(原对象的地址与副本独立),对于引用传递(传递的对象是引用数据类型),传递的是引用的副本,就相当于复制了一个对象,仍然指向原来的内存地址,这时候对这个副本进行修改就会影响到原对象了!但是,如果在方法中给这个副本又创建了一个新的地址,那么就和原对象没有关系了。总结来说:要看方法中的操作是否改变了对象,就看原对象所指向的内存内容有没有改变!
下面给出值引用得例子:

public class Test {    public static void main(String[] args) {        // TODO Auto-generated method stub        int x=1;        alter(x);        System.out.println(x);    }    public static void alter(int x){        x=10;    }}

结果为:1
方法并没有改变变量x

下面是引用传递的例子(没有改变内存地址)

public class PrimaitivesTest {    public static void main(String[] args) {        // TODO Auto-generated method stub        Person p=new Person();        p.setName("Liukang");        setName(p);        System.out.println(p.getName());    }    public static void setName(Person p){        p.setName("candid");    }}class Person{    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

结果:candid
对象p的name属性改变

下面是引用传递的例子(改变内存地址)

public class PrimaitivesTest {    public static void main(String[] args) {        // TODO Auto-generated method stub        Person p=new Person();        p.setName("Liukang");        setName(p);        System.out.println(p.getName());    }    public static void setName(Person p){        //改变对象p的副本指向的内存地址        p=new Person();        p.setName("newName");    }}class Person{    private String name;    public String getName() {        return name;    }    public void setName(String name) {        this.name = name;    }}

结果:liukang
对象p的属性name没有改变

补充:String是引用类型,所以String传递的也是引用类型,但是使用String需要注意,如果将String作为方法参数

public static void main(String[] args){    String s="String";    alterString(s);    System.out.println(s);}public void alterString(String s){    s="new String";}

像这样原来的String是不会改变,仍然是String,引用String是final类型的,所以不可以改变,s=”new String”就相当于新分配了内存,将改String对象指向了新的地址!所以想要通过调用方法对字符串进行修改的时候,一般使用StringBuffer类。

0 0