【java基础】值传递,址传递,引用传递
2023-09-14 09:14:18 时间
前言
想必很多人在学习java之前就已经学习过c语言了吧,里面就值传递和址传递,在java中是否也存在类似的特性呢?下面通过几个例子来进行说明
基本数据类型的传递
public void changeValue(int num) {
num = 0;
}
@Test
public void t1() {
int num = 1;
System.out.println("调用方法前:" + num);
changeValue(num);
System.out.println("调用方法后:" + num);
}
大家看上面的代码,结果会输出上面?输出结果如下
调用方法前:1
调用方法后:1
通过输出结果就可以发现changeValue里面改变num的值其实并没有作用,也就可以说明对于基本数据类型来说,方法参数传递采用的是值传递
引用类型传递
class Cat {
public String name;
public Cat(String name) {
this.name = name;
}
}
public void changeCatName(Cat cat) {
cat.name = "汤姆";
}
@Test
public void t2() {
Cat cat = new Cat("tom");
System.out.println("修改前的名称:" + cat.name);
changeCatName(cat);
System.out.println("修改后的名称:" + cat.name);
}
大家看一下上面代码会输出什么,Cat的name会发生变化吗?输出结果如下
修改前的名称:tom
修改后的名称:汤姆
可以发现,changeCatName成功修改了Cat的name,这也就可以说明在java中,引用类型的参数传递是址传递
引入传递 OR 值传递
上面我们发现了参数传递可以修改对象的值,但是传递的是地址还是引用想必大家还是有疑问,下面我们先来看一段代码
public void swapCat(Cat cat1, Cat cat2) {
Cat temp = cat1;
cat1 = cat2;
cat2 = temp;
}
@Test
public void t3() {
Cat cat1 = new Cat("小花");
Cat cat2 = new Cat("小黑");
System.out.println("交换前的cat1的名称:"+cat1.name+" hashcode:"+cat1.hashCode());
System.out.println("交换前的cat2的名称:"+cat2.name+" hashcode:"+cat2.hashCode());
swapCat(cat1, cat2);
System.out.println("\n交换后的cat1的名称:"+cat1.name+" hashcode:"+cat1.hashCode());
System.out.println("交换后的cat2的名称:"+cat2.name+" hashcode:"+cat2.hashCode());
}
大家可以思考一下,swapCat是不是真的会交换cat1和cat2呢?输出结果如下
交换前的cat1的名称:小花 hashcode:1291113768
交换前的cat2的名称:小黑 hashcode:2005167404
交换后的cat1的名称:小花 hashcode:1291113768
交换后的cat2的名称:小黑 hashcode:2005167404
可以发现,我们在swapCat中明明交换了2个Cat的地址,但是却并没有对cat1和cat2造成影响,这也就说明了引用类型进行参数传递,传递的是地址的值,相当于是一个副本,并不是该对象的引用。
总结
- 方法不能修改基本数据类型的参数
- 方法可以改变对象的参数
- 方法不能让一个对象参数引用到一个新的对象
大家需要记住的是java不存在指针,不能够进行引用传递,参数传递都是值传递,基本类型参数就是传递当前值,对象就是传递地址
相关文章
- Java常量池(静态常量池与运行时常量池)[通俗易懂]
- Contest1620 – 2020-2021-2学期《Java Web 系统开发》:java基础:字符串
- 基础java知识复习
- Java零基础快速入门的方法
- java怎么输出保留两位小数_剖析Java输出怎么保留两位小数「建议收藏」
- 常用的Java工具,16个
- Java基础:volatile详解
- java基本数据类型 think in java_Think in Java(一):Java基础[通俗易懂]
- Java判断闰年
- Java基础入门笔记03——用户交互Scanner类,程序三大结构,反编译,增强for,Java中没有goto
- java怎么创建文件夹文本文件_java删除文件夹下指定文件
- 用递归实现数组求和的函数_JAVA数组递归排序
- docker部署java程序获取的时间与系统时间不一致详解程序员
- Java基础学习笔记十七 集合框架(三)之Map详解编程语言
- java图片格式转化(例如jpg格式转化png)详解编程语言
- java基础学习总结——哈希编码详解编程语言
- java基础之反射详解编程语言
- Java监控MySQL性能:实现数据库运行优化(java监控mysql)
- 使用Redis Java实现更高效的过期操作(redisjava过期)
- Linux Java时区调整:让处理日期更加方便(linux java时区)
- Novice:学习Java 7 在Linux上的简单入门(java 7 linux)
- Java之oracle知多少(java的oracle)
- java使用dom4j解析xml配置文件实现抽象工厂反射示例
- Java基础之java处理ip的工具类