java 值和引用_Java值传递还是引用传递?
回顾:
在程序设计语言中,将参数传递分为按值调用和按引用调用。按值调用:表示方法接收的是调用者提供的值。而按引用调用表示方法接收的是调用者提供的变量地址。
一个方法可以修改传递引用所对应的变量值,而不能修改传递值调用所对应的变量值。
Java总是采用按值调用。方法得到的是所有参数值的一个拷贝,特别的,方法不能修改传递给它的任何参数变量的内容。
方法参数共有两种类型:
基本数据类型
对象引用
1. 基本数据类型为参数
查看一下的代码:
public class ParamTest {
public static void main(String[] args) {
int price = 5;
doubleValue(price);
System.out.print(price);
}
public static void doubleValue(int x) {
x = 2 * x;
}
}
【输出结果】: 5
可以看到,这个方法执行之后,price的值并没有变化。接下来,看一下doubleValue具体的执行过程为:
x被初始化为price值的一个拷贝,即5
x乘以2后等于10。但是price没有变化,依然是5
doubleValue执行完后,参数变量不再使用
2. 对象引用为参数
从上面的例子我们已经知道一个方法不能修改一个基本数据类型的参数。而对象引用作为参数就不同了。看下面的例子:
class Student {
private float score;
public Student(float score) {
this.score = score;
}
public void setScore(float score) {
this.score = score;
}
public float getScore() {
return score;
}
}
public class ParamTest {
public static void main(String[] args) {
Student stu = new Student(80);
raiseScore(stu);
System.out.print(stu.getScore());
}
public static void raiseScore(Student s) {
s.setScore(s.getScore() + 10);
}
}
【运行结果】:
90.0
可以看出,Student实例s的内容改变了。
具体执行过程为:
s被赋予stu值的拷贝,这里是一个对象的引用
raiseScore方法应用于这个应用。s和stu指向同一对象,该对象的分数增加了10
raiseScore方法结束后,s不再使用,stu指向的那个对象分数增加了10
3. 对对象是值调用还是引用传递?
首先编写一个交换两个学生的方法:
public static void swap(Student x, Student y) {
Student temp = x;
x = y;
y = temp;
}
如果java对对象是采用的是引用传递,那个这个方法是可以的。那么x,y对象的分数是交换的。看下面的例子:
class Student {
private float score;
public Student(float score) {
this.score = score;
}
public void setScore(float score) {
this.score = score;
}
public float getScore() {
return score;
}
}
public class ParamTest {
public static void main(String[] args) {
Student a = new Student(0);
Student b = new Student(100);
System.out.println("交换前:");
System.out.println("a的分数:" + a.getScore() + "--- b的分数:" + b.getScore());
swap(a, b);
System.out.println("交换后:");
System.out.println("a的分数:" + a.getScore() + "--- b的分数:" + b.getScore());
}
public static void swap(Student x, Student y) {
Student temp = x;
x = y;
y = temp;
}
}
【运行结果】:
交换前:
a的分数:0.0--- b的分数:100.0
交换后:
a的分数:0.0--- b的分数:100.0
可以看出,两者并没有实现交换。说明引用传递的说法是不正确的。接下来一步一步看看swap调用的过程:
将对象a,b的拷贝分别赋值给x,y,此时a和x指向同一对象,b和y指向同一对象
swap方法体完成x,y的的交换,此时a,b并没有变化
方法执行完成,x和y不再使用,a依旧指向new Student(0),b指向new Student(100)
首先,创建两个对象:
然后,进入方法体,将对象a,b的拷贝分别赋值给x,y:
接着,交换x,y的值:
swap执行完成,x,y不再使用,回到创建时状态。
从这个过程中可以看出,Java对对象采用的不是引用调用,实际上,对象引用进行的是值传递。
总结一下java中方法参数的使用情况:
一个方法不能修改一个基本数据类型的参数(即数值型和布尔型)
一个方法可以改变一个对象参数的状态
一个方法不能让对象参数引用一个新的对象
java 值和引用_Java值传递还是引用传递?相关推荐
- java静态引用_Java开发中静态方法引用和实例方法引用案例详细讲解
Java开发 前言 在Java的日常开发中静态方法引用和实例方法引用在很多地方都会用到,可以说是万金油,但是你真的掌握了吗?下面就由小编给大家做一个比较细想的讲解,废话不多说现在开始把. 正文 大家对 ...
- java字面量和符号引用_java -- JVM的符号引用和直接引用
在JVM中类加载过程中,在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用. 1.符号引用(Symbolic References): 符号引用以一组符号来描述所引用的目标,符号可 ...
- java 强弱软虚_Java的四种引用,强弱软虚,用到的场景
众所周知,java中是JVM负责内存的分配和回收,这是它的优点(使用方便,程序不用再像使用c那样操心内存),但同时也是它的缺点(不够灵活).为了解决内存操作不灵活这个问题,可以采用软引用等方法. 在J ...
- java当前4中引用_Java的四种引用
1.强引用 如果一个对象具有强引用,那就 类似于必不可少的生活用品,垃圾回收器绝不会回收它.当内存空 间不足,Java虚拟机宁愿抛出OutOfMemoryError错误,使程序异常终止,也不会靠随意回 ...
- java符号引用 直接引用_Java -- JVM的符号引用和直接引用
Java -- JVM的符号引用和直接引用 在JVM中类加载过程中,*在解析阶段,Java虚拟机会把类的二级制数据中的符号引用替换为直接引用.* 1.符号引用(Symbolic References) ...
- java万能引用_Java的四种引用方式
java内存管理分为内存分配和内存回收,都不需要程序员负责,垃圾回收的机制主要是看对象是否有引用指向该对象. java对象的引用包括 强引用,软引用,弱引用,虚引用 Java中提供这四种引用类型主要有 ...
- 的引用_java中的强引用,软引用,弱引用,虚引用
一对象回收算法 Java在GC时判断对象是否存活有两种方式:第一种是引用计数方式,第二种是可达性分析算法: 引用计数器算法: 在对象中添加一个引用计数器,每当有一个地方引用它时,计数器值就加一:当引用 ...
- java符号引用 直接引用_java虚拟机的符号引用和直接引用
在java中,一个java类将会编译成一个class文件.在编译时,java类并不知道引用类的实际内存地址,因此只能使用符号引用来代替.比如org.simple.People类引用org.simple ...
- java的引用传递_Java的值传递和引用传递
首先来看一段代码: User类: 1 public classUser {2 privateString name;3 4 publicString getName() {5 returnname;6 ...
最新文章
- Android拷贝工程不覆盖原工程的配置方法
- 关于Linux下进程创建的相关知识
- [Windows驱动开发](四)内存管理
- Python中的HTTP协议
- java soap envelope_如何在SOAP请求中关闭Envelope和Body
- Bootstrap系列 -- 41. 带表单的导航条
- 服务器生成php文件夹下,PHP创建文件以供下载,而不在服务器上保存
- PHP开发中涉及到emoji表情的几种处理方法
- mysql中清空数据库,并重置主键为1
- 解决 warning C4819 问题
- linux输出 /dev/null
- BIND rndc—使用说明
- 问卷调查报告html模版,问卷调查报告的格式
- CentOS 8 下载及安装
- 运用supervisor管理thinkqueue 和swoole推送
- 【愚公系列】2022年10月 .Net Core使用cpolar内网穿透功能实现钉钉回调事件的监听
- 淘宝多重优惠的订单退其中一件商品的退款金额设想
- SugarCRM源码分析之缓存
- 图片翻译成中文其实很简单,只需这几步
- 2022-11-16 AndroidS 新建产品lunch
热门文章
- IPD与项目管理、CMM的关系
- ehd边缘直方图描述子 matlab,一种新的图像空间特征提取方法
- [Python] Request module
- 荣耀8获吉尼斯世界纪录!18425米高空直播体验
- 监控oracle等待事件
- CentOS下MySQL安装后配置和设置
- HTML5 Web Applications
- 前后落差大用什么词语_【刺激】全国最长滑索!“白云飞索”全长1500米,落差200多米!...
- php ado 建立注册,如何注册ADO与DAO [Access软件网]
- 有关单元测试的 5 个建议