对于JAVA中只有值传递的疑惑答疑

很多朋友都听过你的老师说JAVA只有值传递,但是根本没有理解为啥只有值传递,基本数据类型还可以理解,但是引用类型的时候就产生了疑惑,为什么我将某某对象传递给方法,但是他的值改变了,这不就违背了JAVA只有值传递的说法了么。

首先我们来理解值传递和引用传递。

简单来说:值传递,传递的是对象的复制的值,是对象的副本,方法内部无论怎么改变不会影响到方法外的对象本身。

引用传递:传递的是对象的地址,方法中对对象的改变会导致方法外的对象发生变化。

这里很多人有个理解误区,值传递很好理解,也很好证明,值传递是对对象的值说的,而引用传递是对对象的地址说的。你用值的改变来证明是引用传递这是不对的。

记住一点:是否存在引用传递的关键,就是是否能通过方法来改变实参对象的地址。

在这里我要解释下, 传递一个对象给了方法,在对象中对对象的属性做了修改,然后方法外的对象的属性也跟着做了改变

首先引用对象引用的是对象的地址。

我对声明对象做一个拆开解释

String str=new String("123");

以上代码做了2个关键步骤

1.声明引用

2.将对象的地址指向引用对象

所以拆解后的代码就是

String str;

str=new String("123");

引用对象,引用的是对象的地址。你传递参数给方法的时候,传递的是引用的拷贝。这个和基本数据类型有区别,基本数据类型拷贝的是他的值,而这里拷贝的是引用。正是因为拷贝的是引用所以在方法中2个引用指向了同一个地址,给你的错觉是传递的地址。而在方法中改变了方法中对象的引用地址的时候,方法外的引用地址不会跟随改变。这就是值传递。

 

下面开始贴代码,每一行我都贴了注释。

/***
 * 值传递:传递的是对象的拷贝,方法内部无论怎么修改不会导致参数的本身发生变化
 * 
 * 引用传递:传递的是地址,方法内部改变地址后,会导致原参数的地址跟随改变
 * 
 * 理解盲区:很多人会因为看到引用对象的数值改变了以为是引用传递。
 * 
 * 谨记一点,区分值传递还是引用传递的关键是地址是否发生改变
 * 
 * 因此通过地址的变化来证明JAVA中不存在引用传递来帮助理解,Java中只存在值传递。
 */
public class Test {

	public static String getTest(String param) {
		param = new String("345"); // 改变引用对象的地址 如果是引用传递会改变原参数的地址,值传递会创建新的地址
		return param;
	}

	public static void main(String[] args) {
		String param1 = "123";// 引用对象,原地址上的对象
		String result = getTest(param1);// 获得新地址返回后的对象
		System.out.println("原对象的地址上的数值为" + param1 + "\n新地址上的数值为" + result);
		// 通过实验证明传递的并不是对象的地址,因为对引用的地址改变之后并没有导致原参数的地址跟随一起改变
	}
}

《C++编程实例100篇》是一本深入实践、极具价值的编程教程,它针对C++编程语言提供了丰富的实例,旨在帮助读者更好地理解和掌握C++的各项特性与编程技巧。这本书的经典之处在于它将理论与实践相结合,通过100个精心设计的编程实例,覆盖了C++的各个核心领域,包括基础语法、面向对象编程、模板、异常处理、STL(标准模板库)等。 我们来探讨C++的基础语法。C++是C语言的增强版,它保留了C语言的高效性和灵活性,并引入了类、对象和继承等面向对象编程概念。基础语法包括变量声明、数据类型、运算符、控制结构(如if语句、for循环、while循环)、函数的定义和调用等。在实例中,你可能会遇到如何编写简单的程序,如计算两个数的和,或者实现一个简单的猜数字游戏。 C++的面向对象编程是其一大特色。通过类和对象,你可以构建复杂的软件系统。类是对象的蓝图,它定义了对象的属性和行为。实例化一个类,就是创建一个具体的对象。继承允许你创建新的类,这些类从现有的类派生,共享其属性和方法,同时可以添加新的功能。多态性是面向对象的另一个关键特性,它使得不同类型的对象可以对同一消息作出不同的响应。这些概念在实例中会以各种形式展现,例如设计一个图形界面的类层次,或实现一个简单的模拟游戏。 接下来是模板,C++的模板功能让代码更加通用,可以处理不同类型的数据。模板分为函数模板和类模板,前者可以创建泛型函数,后者可以创建泛型类。通过模板,你可以编写出高效且灵活的代码,比如实现一个通用的排序算法。 异常处理是C++中用于处理程序运行时错误的机制。当程序出现异常情况时,可以抛出一个异常,然后在适当的点捕获并处理这个异常。这使得代码能够优雅地处理错误,而不是让程序崩溃。实例中可能会有涉及文件操作或网络通信时可能出现的异常处理示例。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值