java;值传递与引用传递

一、了解几个概念

——形参
方法被调用时需要传递进来的参数,如:func(int a)中的a,它只有在func被调用期间a才有意义,也就是会被分配内存空间,在方法func执行完成后,a就会被销毁释放空间,也就是不存在了
——实参
方法被调用时是传入的实际值,它在方法被调用前就已经被初始化并且在方法被调用时传入。
——值传递
在方法被调用时,实参通过形参把它的内容副本传入方法内部,此时形参接收到的内容是实参值的一个拷贝,因此在方法内对形参的任何操作,都仅仅是对这个副本的操作,不影响原始值的内容。
——引用传递
”引用”也就是指向真实内容的地址值,在方法调用时,实参的地址通过方法调用被传递给相应的形参,在方法体内,形参和实参指向同一个内存地址,对形参的操作会影响的真实内容。

二、Java中的参数传递

2.1java中数据类型

数据类型:基本和引用
基本数据类型不用多讲,传参是值传递,对局部变量的操作不能影响到成员变量的值。也可以从基本数据类型的存储方式去理解。当string类作为引用传递时,与基本类型数据一样,传递的是字符串的值。
引用,传参是将对象的引用拷贝下来,即将对象的地址的值拷贝下来使用,所有你会发现有是将引用对象传递给方法会改变该对象的值,而有时不会。
等下细讲原因。引用也是值传递,传递的是地址的值,方法并不是通过调用实参的地址进行操作的,而是通过调用实参的拷贝进行操作的。

2.2何时会改变实参在类中的值

public class Demo01 {
   public static void link(StringBuffer a){
        a.append("World");
   }
   public static void main(String args[]){
        StringBuffer a=new StringBuffer("Hello");
        link(a);
        System.out.println(a);
   }

}

//运行结果:HelloWorld

说明:a是一个字符串对象的引用,把a传递到方法link()中,会出现实参在类中的值发生变化的情况,这是因为引用a的内容存储的是字符串的地址,而方法将a的内容拷贝下来设为a1,拷贝的内容a1存储的也是字符串的地址,对a1进行操作也改变了字符串的值,所有在类中打印字符串时会出现字符串改变的情况。当拷贝的地址没变时,而改变地址中的内容就会改变类中实参的值。注意与“引用传递”区别。

2.3何时不会改变实参在类中的值

class AbstractDemo {
    public static void main(String[] args) {
        Employee a = new Employee("Alice");
        Employee b = new Employee("Bob");
        Employee.swap(a, b);
        System.out.println("在main方法中:");
        System.out.println("a's name is " + a.getName());
        System.out.println("b's name is " + b.getName());
    }
}

class Employee{		//定义一个员工类
   private String name;
   public Employee(){   //无参构造方法
       this("");
   }
   public Employee(String name){	//一个参数构造方法
       this.name = name;
   }
    String getName(){
        return name;
    }
 static void swap(Employee x, Employee y) {		//静态方法,交换两个员工对象的名字
            Employee temp = x;
            x = y;
            y = temp;
            System.out.println("在swap方法中:");
            System.out.println("x's name is " + x.getName());
            System.out.println("y's name is " + y.getName());
        }
}

运行结果:
在swap方法中:
x’s name is Bob
y’s name is Alice
在main方法中:
a’s name is Alice
b’s name is Bob
说明:这一例子充分说明了java的引用类型数据也是值传递。在swap()中将a的地址值拷贝给了x(x->Alice),b的地址值拷贝给了y(y->Bob),对x,y的内容进行交换也就是交换了x,y所指向的对象(x->Bob,y->Alice)。但是引用变量a和b指向的地址并没有改变,而且a和b指向地址的内容也没有改变,所有a,b还是分别指向Alice和Bob。当只改变拷贝的地址时是不会影响到原类中实参的地址的以及实参地址的内容。

综上:

在java中,引用传递不存在,Java 总是采用按值调用,方法得到的是所有参数值的一个拷贝。Java对对象采用也不是引用调用,实际上,对象引用进行的是对像地址值的拷贝传递。

三、一些操作引起的误区

3.1搞清楚赋值运算符(=)的作用

num = 20;
str = "java";

对于基本类型 num ,赋值运算符会直接改变变量的值,原来的值被覆盖掉。
对于引用类型 str,赋值运算符会改变引用中所保存的地址,原来的地址被覆盖掉。但是原来的对象不会被改变

3.2 使用new创建新对象

 class Demo01 {
   public static void link(StringBuffer a){
 	    a = new StringBuffer();
        a.append("World");
   }
   public static void main(String args[]){
        StringBuffer a=new StringBuffer("Hello");
        link(a);
        System.out.println(a);
   }

}

运行结果:
Hello
说明:将a的地址拷贝给了link()中的形参,但是a又新建了一个对象,a指向了新对象,所以改变了新对象的内容并没有影响到a指向地址的内容。

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值