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;
	}
     
}


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

方法的参数传递机制——值传递机制

package pers.songhongkang.chaper3.day6; /*方法的参数传递(重点,难点) *1.形参:方法声明时,方法小括号内的参数; * 实参:调用方法时,实际传入的参数的...
  • mayanyun2013
  • mayanyun2013
  • 2016年05月27日 22:30
  • 343

记录一个Java值传递和对象传递之间的例子展示

/** * Project Name:hstd * File Name:TestSetValuesOK.java * Package Name:com.forlink.exchange.admi...
  • lxlhu
  • lxlhu
  • 2015年07月31日 09:27
  • 785

java值传递彻底明白~

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

Java只有一种参数传递机制------按值传递

Java中并没有传递引用这一说,只有一种参数传递机制,就是按值传递 首先,最主要要强调的一点就是,Java 应用程序有且仅有的一种参数传递机制,并没有传递引用这一说。造成这一误解,主要是因为有这么...
  • zlf4896
  • zlf4896
  • 2016年03月15日 17:42
  • 472

JAVA中值传递和引用传递的三种情况

前言我们都知道,java中数据类型分为基本数据类型和引用数据类型。 基本数据类型 - 整型:byte,short,int,long - 浮点型:float,double ...
  • zhzhao999
  • zhzhao999
  • 2016年12月04日 00:14
  • 2693

深入理解Java方法调用的参数传递

分析了Java的基本数据类型和引用数据类型在作为方法参数被传递时,在内存中的堆(Heap)和栈(Stack)的变化过程,通过这个变化过程来理解Java方法调用的参数传递的实质。对于基本数据类型和引用数...
  • dawning7670
  • dawning7670
  • 2015年10月21日 23:54
  • 2300

Java的参数传递到底是引用传递还是值传递

首先看一段代码:public static void main(String[] args) { Person a = new Person(23, "a"); Person b = ...
  • panyongcsd
  • panyongcsd
  • 2016年08月30日 17:14
  • 2075

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

JAVA 方法的参数是按值传递还是引用传递?
  • xinnian468153
  • xinnian468153
  • 2016年08月21日 09:33
  • 504

Java到底是值传递?还是引用传递?

前言 最近和同事讨论算法效率问题无意中涉及到一个问题,java中调用方法的时候是值传递呢?还是引用传递?网上搜索一下相关问题,众说纷纭,有人说值传递,有人说引用传递,还有人说”基础类型是值传递,对象...
  • xiaosha009
  • xiaosha009
  • 2016年02月17日 14:23
  • 1701

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

Java 方法参数的值传递和引用传递在Java中,实际上都是值传递,并不存在引用传递。人们所说的引用传递,实则为指针间地址的传递。要理解此,我们必须明白一个概念,形如Object o;这样的定义,实际...
  • FIRE_TRAY
  • FIRE_TRAY
  • 2016年02月10日 10:58
  • 977
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:Java的方法传参数永远是值传递
举报原因:
原因补充:

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