Java中按值传递问题

来源:互联网 发布:无尽的传说2 mac 破解 编辑:程序博客网 时间:2024/06/10 23:59

一直对Java中到底是值传递还是引用传递有疑惑,今天下午花时间学习了一下,写一个总结。由于作者水平有限,文章中有错误或不当的地方请读者指出。


1. 概述

首先要明确的是Java中方法参数传递只有值传递,不存在引用传递。虽然我们平时调用一个方法时,把对象(数组,类或接口)当作参数传入,在方法中可以改变对象中某个属性的值,这个假象使我们认为对于对象(数组,类或接口)的传递似乎有点像引用传递,但是实际上这个传入方法的值是对象引用的拷贝,即传递的是引用的地址值,所以Java中只存在按值传递

  • 若参数是基本类型,传递的是基本类型的字面量值的拷贝。
  • 若参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。

2. 案例

下面通过几个小案例来说明

2.1 参数为基本数据类型

public class Demo1 {    public static void main(String[] args) {        int num1=10;        change(num1);        System.out.println(num1);    }    static void change(int num2){        num2=20;    }}//结果://num1=10

分析:
案例分析1

2.2 参数为引用数据类型

2.2.1 没有提供改变自身方法的引用数据类型

public class Demo2 {    public static void main(String[] args) {        String str=new String("Java");        change(str);        System.out.println("str:"+str);    }    static void change(String arg){        arg="PHP";    }}//结果://str:Java

分析:
1

2.2.2 提供了改变自身方法的引用数据类型

public class Demo3 {    public static void main(String[] args) {        StringBuilder sb=new StringBuilder("Java");        change(sb);        System.out.println("sb:"+sb);    }    static void change(StringBuilder arg){        arg.append("语言");    }}//结果://sb:Java语言

分析:
2

2.2.3 提供了改变自身方法的引用数据类型,但未使用,而是用赋值运算符

public class Demo4 {    public static void main(String[] args) {        StringBuilder sb=new StringBuilder("Java");        change(sb);        System.out.println("sb:"+sb);    }    static void change(StringBuilder arg){        arg=new StringBuilder("PHP");    }}//结果://sb:Java

分析:
3

2.3 其他例子

下面这个案例也可以说明

public class Demo5 {    public static void main(String[] args) {        //创建user1对象        User user1=new User(1,"Jack");        //创建user2对象        User user2=new User(2,"Tom");        //调用swap方法前        System.out.println("调用swap()方法前:");        System.out.println(user1);        System.out.println(user2);        System.out.println("-------------------------");        //调用swap方法        swap(user1,user2);        System.out.println("用swap()方法后:");        System.out.println(user1);        System.out.println(user2);    }    //swap方法用于交换    public static void swap(User user1,User user2){        User user3=user1;        user1=user2;        user2=user3;    }}class User{    private int id;    private String username;    public int getId() {        return id;    }    public void setId(int id) {        this.id = id;    }    public String getUsername() {        return username;    }    public void setUsername(String username) {        this.username = username;    }    public User(int id, String username) {        this.id = id;        this.username = username;    }    @Override    public String toString() {        return "User{" +                "id=" + id +                ", username='" + username + '\'' +                '}';    }}//结果://调用swap()方法前://User{id=1, username='Jack'}//User{id=2, username='Tom'}//-------------------------//用swap()方法后://User{id=1, username='Jack'}//User{id=2, username='Tom'}

3. 总结

通过上面几个案例可以明白 ,java中方法参数传递方式是按值传递。
- 若参数是基本类型,传递的是基本类型的字面量值的拷贝。
- 若参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。

0 0
原创粉丝点击