潇鹞枫语

一直在路上

Java的方法传参数永远是值传递

        前段日子在一个视频上看到了java中只有值传递没有引用传递,说实话这种说话我有模糊印象,在面试的时候被问到过这个问题,我估计我当时也肯定是乱答的,在网上搜了一些答案,感觉说的不是太明白,甚至更加模糊,更有甚者,直接说两种说法都是对的,只是理解不一样,当时我也以为是这样的,不过后来为了确定这个答案,特地去翻阅了《java核心技术》的中文翻译版,基本得出一个答案。

        java程序设计语言总是采用按值调用也是值传递没有引用传递,方法中永远得到的是传递参数的值得拷贝,不能修改这个传递值变量本身的内容。始终记住是拷贝不是变量的地址。

       谈论到值调用,对于java的基本类型,应该大家都没有问题,都能理解。关键是引用数据类型(包括数组、对象、接口),当是引用数据类型时候传递的是变量中存放的引用,可以看成是一个地址,存放真正东西的地址。当一个引用型数据变量在方法中调用的时候,其实是变量中存放地址的一个拷贝给了局部变量,很自然局部变量利用这个地址和方法外的变量指向了相同的一个位置,这个时候对数据进行操作,就会影响内存的情况,同时方法外的变量指向的内存的位置也改变。但是通过交换引用型数据变量知道,方法体类局部变量的地址虽然改变了,但是方法外的变量的存放的引用地址并没有改变,仍然指向原来内存位置。这和我们在C语言中学到了就有差别,哪里是把这个变量的地址传了进来,在java中是把这个变量中存放的地址拷贝过来,从而能够指向同一个对象或者数组。

        综上java中的方法中的参数传递都是通过拷贝来完成的,很自然在java中只有值传递没有引用传递。一个反例就是,两个引用型的数据在方法中来交换,结果方法外的变量所指向的内容并不改变,附上代码,可以通过相应的软件调试,我这里用了tomcate的容器,从而模拟运行环境,查看实际的内存情况。

public class test {
	public void testValue() {
		Job job1=new Job();
		Job job2=new Job();
		job2.setMoney(500);
		job2.setName("C");
		get(job1);
		System.out.println(job1.getName());
		swap(job1,job2);
		System.out.println(job1.getName());
		System.out.println(job2.getName());
	}
	public void get(Job c){//赋值,这个c与job1的内存是指向同一个区域
		c.setMoney(1000);
		c.setName("Java");
	}
	public void swap(Job a,Job b){//交换引用,a,b分别指向了对应传来值得内存区域,a和b对应的内存区域已经交换
		Job d=a;
		a=b;
		b=d;
	}
}

public class Job {
     private int money;
     private String name;
	public Job() {
		super();
	}
	public int getMoney() {
		return money;
	}
	public void setMoney(int money) {
		this.money = money;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
     
}


   
    
阅读更多
版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/duxiao1256063327/article/details/52356953
个人分类: 学习笔记
上一篇为什么新下载的eclipse居然启动抛锚了
下一篇get和post的区别
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭