【第22期】观点:IT 行业加班,到底有没有价值?

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中函数参数的传递形式是值传递 还是引用传递

突然想到这个问题,不是很确定,然后查了一下资料,做一下总结.  1.什么是值传递,什么是引用传递 值传递是将需要传递的值作为一个副本传递出去,例如: int i = 5; in...

程序员升职加薪指南!还缺一个“证”!

CSDN出品,立即查看!

Java 值传递和对象传递详解

1、需要明白的概念: 堆和栈:Java中基本数据类型的值和对象的引用保存在栈中,具体对象值保存在堆中。传递原理: 一个方法传递的参数如果是基本数据类型,则是对具体值的拷贝;如果是对象数据类型,则是...

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

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

Java的方法的参数传递,值传递和引用传递还有String字符串传递

方法的参数传递 1、值传递  a) 方法调用时,实际参数把它的值传递给对应的形式参数,方法执行中形式参数值的改变不影响实际参数的值。传到方法里的参数类型是基本数据类型的都叫值传递 2、引用传递 ...

关于Java的值传递和引用传递

结论: 1. 对于值传递,如int, long等基本类型,不管传入方法后怎么修改,都改变不了方法外面的值。 2. 对于引用传递,如果传入方法后指向了一个新的对象,那么无论怎么修改也改变不了方法外面...

Java 方法参数 值传递

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

JAVA中方法参数的引用传递

JAVA中方法参数的引用传递 java中参数的传递有两种,分别是按值传递和按引用传递。按值传递不必多说,下面就说一下按引用传递。 当一个对象被当作参数传递到一个方法”,这就是所谓的按引用传递。...

java值传递彻底明白~

时间: 2004-4-06 13:18:27    标题: 一个绝对害了不少人的Java技术问题! 我不记得自己是怎么学到的,但是我相信绝大部分从事java学习Java的人都一直这么以为一个小的技术问...

SpringMvc如何传递获取Date类型数据

在控制器中加入如下代码:@InitBinder public void initBinder(ServletRequestDataBinder bin){ SimpleDateFor...
收藏助手
不良信息举报
您举报文章:深度学习:神经网络中的前向传播和反向传播算法推导
举报原因:
原因补充:

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