当前位置:首页 > java技术文章 > 解析java基本数据类型传递与引用传递区别

详解java基本数据类型传递与引用传递区别

  • 发布时间:
  • 作者:码农之家原创
  • 点击:122

这篇文章主要知识点是关于java、基本数据类型、的内容,如果大家想对相关知识点有系统深入的学习,可以参阅以下电子书

Java高并发编程详解:多线程与架构设计
  • 类型:Java大小:120.77 MB格式:PDF作者:汪文君
立即下载

解析java基本数据类型传递与引用传递区别

java中方法参数传递方式是按值传递。
如果参数是基本类型,传递的是基本类型的字面量值的拷贝。
如果参数是引用类型,传递的是该参量所引用的对象在堆中地址值的拷贝。

java的值传递和引用传递在面试中一般都会都被涉及到,今天我们就来聊聊这个问题,首先我们必须认识到这个问题一般是相对函数而言的,也就是java中的方法参数,那么我们先来回顾一下在程序设计语言中有关参数传递给方法(或函数)的两个专业术语:

按值调用(call by value)

按引用调用(call by reference)

所谓的按值调用表示方法接收的是调用着提供的值,而按引用调用则表示方法接收的是调用者提供的变量地址(如果是C语言的话来说就是指针啦,当然java并没有指针的概念)。这里我们需要注意的是一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值,这句话相当重要,这是按值调用与引用调用的根本区别,当然如果还不理解,没关系,下面就要图文并茂的彻底分析啦。

前面我们说过java中并不存在引用调用,这点是没错的,因为java程序设计语言确实是采用了按值调用,即call by value。也就是说方法得到的是所有参数值的一个拷贝,方法并不能修改传递给它的任何参数变量的内容。下面我们来看一个例子:

package com.zejian.test;
/**
 * java中的按值调用
 * @author zejian
 */
public class CallByValue {
	
	private static int x=10;
	
	public static void updateValue(int value){
		value = 3 * value;
	}
	
	public static void main(String[] args) {
		System.out.println("调用前x的值:"+x);
		updateValue(x);
		System.out.println("调用后x的值:"+x);
	}

运行程序,结果如下:

调用前x的值:10
调用后x的值:10

 可以看到x的值并没有变化,接下来我们一起来看一下具体的执行过程:

解析java基本数据类型传递与引用传递区别

分析:

1)value被初始化为x值的一个拷贝(也就是10)

2)value被乘以3后等于30,但注意此时x的值仍为10!

3)这个方法结束后,参数变量value不再使用,被回收。

结论:当传递方法参数类型为基本数据类型(数字以及布尔值)时,一个方法是不可能修改一个基本数据类型的参数。

当然java中除了基本数据类型还有引用数据类型,也就是对象引用,那么对于这种数据类型又是怎么样的情况呢?我们还是一样先来看一个例子:

声明一个User对象类型:

执行类如下:

package com.zejian.test;
public class User {
	private String name;
	private int age;
	public User(String name, int age) {
		this.name=name;
		this.age=age;
	}
	public String getName() {
		return name;
	}
	public void setName(String name) {
		this.name = name;
	}
	public int getAge() {
		return age;
	}
	public void setAge(int age) {
		this.age = age;
	}

执行类如下:

package com.zejian.test;
/**
 * java中的按值调用
 * @author zejian
 */
public class CallByValue {
	private static User user=null;
	public static void updateUser(User student){
		student.setName("Lishen");
		student.setAge(18);
	}
	
	
	public static void main(String[] args) {
		user = new User("zhangsan",26);
		System.out.println("调用前user的值:"+user.toString());
		updateUser(user);
		System.out.println("调用后user的值:"+user.toString());
	}

运行结果如下:

调用前user的值:User [name=zhangsan, age=26]
调用后user的值:User [name=Lishen, age=18]

很显然,User的值被改变了,也就是说方法参数类型如果是引用类型的话,引用类型对应的值将会被修改,下面我们来分析一下这个过程:

解析java基本数据类型传递与引用传递区别

过程分析:

1)student变量被初始化为user值的拷贝,这里是一个对象的引用。

2)调用student变量的set方法作用在这个引用对象上,user和student同时引用的User对象内部值被修改。

3)方法结束后,student变量不再使用,被释放,而user还是没有变,依然指向User对象。

结论:当传递方法参数类型为引用数据类型时,一个方法将修改一个引用数据类型的参数所指向对象的值。

虽然到这里两个数据类型的传递都分析完了,也明白的基本数据类型的传递和引用数据类型的传递区别,前者将不会修改原数据的值,而后者将会修改引用所指向对象的值。可通过上面的实例我们可能就会觉得java同时拥有按值调用和按引用调用啊,可惜的是这样的理解是有误导性的,虽然上面引用传递表面上体现了按引用调用现象,但是java中确实只有按值调用而没有按引用调用。到这里估计不少人都蒙逼了,下面我们通过一个反例来说明(回忆一下开头我们所说明的按值调用与按引用调用的根本区别)。

package com.zejian.test;
/**
 * java中的按值调用
 * @author zejian
 */
public class CallByValue {
	private static User user=null;
	private static User stu=null;
	
	/**
	 * 交换两个对象
	 * @param x
	 * @param y
	 */
	public static void swap(User x,User y){
		User temp =x;
		x=y;
		y=temp;
	}
	
	
	public static void main(String[] args) {
		user = new User("user",26);
		stu = new User("stu",18);
		System.out.println("调用前user的值:"+user.toString());
		System.out.println("调用前stu的值:"+stu.toString());
		swap(user,stu);
		System.out.println("调用后user的值:"+user.toString());
		System.out.println("调用后stu的值:"+stu.toString());
	}
}

我们通过一个swap函数来交换两个变量user和stu的值,在前面我们说过,如果是按引用调用那么一个方法可以修改传递引用所对应的变量值,也就是说如果java是按引用调用的话,那么swap方法将能够实现数据的交换,而实际运行结果是:

调用前user的值:User [name=user, age=26]
调用前stu的值:  User [name=stu, age=18]
调用后user的值:User [name=user, age=26]
调用后stu的值:  User [name=stu, age=18]

我们发现user和stu的值并没有发生变化,也就是方法并没有改变存储在变量user和stu中的对象引用。swap方法的参数x和y被初始化为两个对象引用的拷贝,这个方法交换的是这两个拷贝的值而已,最终,所做的事都是白费力气罢了。在方法结束后x,y将被丢弃,而原来的变量user和stu仍然引用这个方法调用之前所引用的对象。

解析java基本数据类型传递与引用传递区别

这个过程也充分说明了java程序设计语言对对象采用的不是引用调用,实际上是对象引用进行的是值传递,当然在这里我们可以简单理解为这就是按值调用和引用调用的区别,而且必须明白即使java函数在传递引用数据类型时,也只是拷贝了引用的值罢了,之所以能修改引用数据是因为它们同时指向了一个对象,但这仍然是按值调用而不是引用调用。

总结:

一个方法不能修改一个基本数据类型的参数(数值型和布尔型)。

一个方法可以修改一个引用所指向的对象状态,但这仍然是按值调用而非引用调用。

上面两种传递都进行了值拷贝的过程。

以上所述是小编给大家介绍的java基本数据类型传递与引用传递区别详解整合,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对码农之家网站的支持!

以上就是本次给大家分享的关于java的全部知识点内容总结,大家还可以在下方相关文章里找到相关文章进一步学习,感谢大家的阅读和支持。

推荐内容

实例讲解webpack进阶之插件篇

CCF之门禁系统java解题代码

Vue中使用Compass的方法小结

详细介绍jquery使用slideDown实现模块缓慢拉出效果的方法技巧

mysql遇到load data导入文件数据出现1290错误如何解决

展开 +

收起 -

Java 相关电子书
学习笔记
网友NO.150665

Java基本数据类型不需要进行创建对象的原因

Java是一门面向对象的语言,即一切皆是对象!那么为何数据类型中还分为:基本类型和对象? Java中有8种基本数据类型 boolean 、 byte 、 short 、 char 、 int 、 flaot 、 long 、 double ,基本数据类型作为Java语言的一部分,但基本数据类型不是对象,基本数据类型放在堆栈中,对象放在堆中。堆的读写速度远不及栈,如果使用基本数据类型相当于在栈上进行操作,对变量的创建和销毁速度非常快。相反,如果用类进行定义变量,需要在堆中进行操作,创建和销毁速度都比较慢。 出于性能方面的考量,为了提高性能这样做是合理的。但有些地方必须用到对象,基本数据类型不是对象,怎么办呢?Java针对每种基本数据类型提供了包装类,即 Boolean 、 Byte 等。这样就解决了基本数据类型面向对象用的问题。 同时,也正是包装类的使用,说明Java是一种纯OO的语言。……

网友NO.583975

浅谈java基本数据类型的范围(分享)

如下所示: System.out.println("BYTE MAX_VALUE = " + Byte.MAX_VALUE); System.out.println("BYTE MIN_VALUE = " + Byte.MIN_VALUE); System.out.println("SHORT MAX_VALUE = " + Short.MAX_VALUE);//3万多,5位 System.out.println("SHORT MIN_VALUR = " + Short.MIN_VALUE); System.out.println("Int MAX_VALUE = " + Integer.MAX_VALUE);//21亿,10位 System.out.println("Int MIN_VALUE = " + Integer.MIN_VALUE); System.out.println("LONG MAX_VALUE = " + Long.MAX_VALUE);//9.。。,19位 System.out.println("LONG MIN_VALUR = " + Long.MIN_VALUE); System.out.println("FLOAT MAX_VALUE = " + Float.MAX_VALUE); System.out.println("FLOAT MIN_VALUE = " + Float.MIN_VALUE); System.out.println("DOUBLE MAX_VALUE = " + Double.MAX_VALUE); System.out.println("DOUBLE MIN_VALUR = " + Double.MIN_VALUE); 基本类型类型 boolean byte char short Int long float double void 二进制位数 1 8 16 16 32 64 32 64 -- 封装器类 Boolean Byte Character Short Integer Long Float Double Void java中的float与double符合IEEE7……

网友NO.550874

Java中int与integer的区别(基本数据类型与引用数据类型)

一、先说说int与integer的区别 int 是基本数据类型,默认值为0,不需要进行实例化 integer 是引用数据类型,是int的封装类型,默认值为null,创建该类型需要进行实例化。 基本数据类型是可以用“==”进行比较,而引用数据类型则不可以,一般是通过equals方法来实现比较。 二 、再说说基本数据类型与引用数据类型的区别? 特点: 1、从概念方面来说 基本数据类型:变量名指向具体的数值引用数据类型:变量名指向存数据对象的内存地址,即变量名指向hash值 2、从内存构建方面来说 基本数据类型:变量在声明之后java就会立刻分配给他内存空间 引用数据类型:它以特殊的方式(类似C指针)指向对象实体(具体的值),这类变量声明时不会分配内存,只是存储了一个内存地址。 3、从使用方面来说 基本数据类型:使用时需要赋具体值,判断时使用“==”号 引用数据类……

网友NO.607771

javascript基本数据类型和转换

ECMAScript中有5种基本数据类型:Undefined、Null、Boolean、Number、String。还有1种复杂数据类型—Object,Object实质上是由一组无序的名值对(键值对)组成的。ECMAScript不支持任何创建自定义类型的机制。 由于ECMAScript是松散型的,所以需要一种手段来检测变量的数据类型,typeof就是具有这种功能的操作符。用typeof检测变量可能返回以下某个字符串: "undefined" 变量未定义 "boolean" 变量是布尔值 "string" 变量是字符串 "number" 变量是数值 "object" 变量是对象或者null "function" 变量是函数 从技术的角度讲,函数在ECMAScript中是对象,不是一种数据类型。然而,函数有一些特殊的属性,因此通过typeof来区分函数和其它对象是有必要的。 Undefined类型只有一个值,就是特殊的undefined。在使用var声明变量但未初始化时,这个变量的值就是undefined,如: var a;alert(a == undefined); //true 不……

<
1
>

电子书 编程教程 文档 软件 源码 视频

Copyright 2018-2020 xz577.com 码农之家

本站所有电子书资源不再提供下载地址,只分享来路

免责声明:网站所有作品均由会员网上搜集共同更新,仅供读者预览及学习交流使用,下载后请24小时内删除

版权投诉 / 书籍推广 / 赞助:QQ:520161757