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

原创 2016年08月29日 21:59:52

        前段日子在一个视频上看到了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;
	}
     
}


   
    
版权声明:本文为博主原创文章,未经博主允许不得转载。

相关文章推荐

Java方法的参数是按值传递的

在Java中,所有的方法参数,都是"按值传递". 有那么一种说法,Java中基本类型是按值传递,对象是按引用传递.这个说法其实是不确切的,确切的说法是 Java中基本类型将值作为参数,按值传递.对...

Java方法的参数是按值传递的

在Java中,所有的方法参数,都是"按值传递". 有那么一种说法,Java中基本类型是按值传递,对象是按引用传递.这个说法其实是不确切的,确切的说法是 Java中基本类型将值作为参数,按值...
  • wuha0
  • wuha0
  • 2011-12-22 17:47
  • 366

Java 方法参数 值传递

A method cannot modify a parameter of primitive type (that is, numbers or boolean values)   A metho...

JAVA 方法的参数是按值传递还是引用传递?

JAVA 方法的参数是按值传递还是引用传递?

java中的方法参数传递机制---值传递

一直以来,都被java中的参数传递方式都是 — 值传递。被这个说法搞的很糊涂。有时候传过去的值会发生变化,有的又不会,相信初学者会遇到这样的坑。今天就来说为啥会这样?先来一段代码?/** * 值传...

Java 方法参数的值传递和引用传递

Java 方法参数的值传递和引用传递在Java中,实际上都是值传递,并不存在引用传递。人们所说的引用传递,实则为指针间地址的传递。要理解此,我们必须明白一个概念,形如Object o;这样的定义,实际...

java 学习 方法参数按值传递和按引用传递:

[list] 按值传递:所谓按值传递就是在方法内部改变参数的值并不会影响传递进来的外部对象,例如: Java代码  int i = 1;   public void increment(int i){...

Java方法参数的传递机制,值传递?引用传递?

Java方法参数的传递机制,值传递还是引用传递?

Java方法的参数是按值传递的.

困扰多年的“值传递,引用传递”问题,今晚茅塞顿开! 转载来自:http://nileader.blog.51cto.com/1381108/303501 在Java中,所有的方...

对Java方法参数按值传递的理解

今天看到(Java核心计数)Java方法对参数按值传递的时候,居然怎么都想不通,故而自己写代码尝试了理解了一下: 定义一个Person类: class Person { private dou...
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

(最多只允许输入30个字)