JAVA中关于基本数据和引用数据参数传递过程
基本数据和引用数据参数传递过程
案例1:判断程序的输出结果
class Demo{
public static void main(String[] atgs){
int x =4;
show(x);
System.out.println("x="+x); // 最终输出: x=4
}
public static void show(int x){
x = 5;
}
}

执行过程第1步:主函数main()方法压栈,内部变量x赋值为4。
第2步:show()方法压栈,在show()方法中,有一个局部变量x,注意,此 X 非main()中的 x。
第3-4步:show()方法内部的x被main函数中的x赋值为4。
第5步:show()方法执行最后的return(代码省略不写);show()方法弹栈。
第6步:此时栈内还剩main()方法,main()方法内部该执行输出语句了,此时main()方法中只有一个 x,且 x 的值为4,故输出:x=4。
第7步:主函数执行return,程序执行结束。
类似地,
class Demo{
public static void main(String[] args){
int x =4;
show(x);
System.out.println("x="+x); // 最终输出: x=4
}
public static int show(int x){
x = 5;
return x;
}
}
在show()方法中添加返回值,将x返回,此时输出结果仍为4。
因为 return x 该语句将x的值5返回给了主函数的show()中,但是并没有用,并没有进行再赋值,所以输出结果仍为x=4。
案例2
class Demo{
int x;
public static void main(String[] args){
Demo d = new Demo();
d.x = 5;
show(d);
System.out.println("x="+d.x);
}
public static void show(Demo d){
d.x = 6;
}
}

第1步:main()方法进栈,Demo d = new Demo() 该语句分为两部分执行,先执行右边,先在堆内存中开辟空间,其成员变量x默认值为0。
第2步:将开辟的堆内存空间的地址赋值给main()方法中的d,此时d指向0x45该地址。
第3步:执行d.x = 5,用d持有的地址去寻找对象,把对象中的x赋值为5。
第4步:show()方法压栈,将main()方法中的d的值赋给show()方法中的d,此时二者(main()方法和show()方法中的d)所持有的地址相同,均指向堆内存中的0x45地址所代表的对象。
第5步:执行show()方法中的 d.x = 6,将 show()方法中d指向的对象中的x值赋值为6。
第6步:show()方法执行完毕,弹栈。
第7步:执行main()方法中的输出语句,因为前面main()和show()方法中d指向的对象是同一个,所以此时对象中的x的值已经成为6,所以输出为:x=6。
如果,将show()方法稍作更改,代码如下
class Demo{
int x;
public static void main(String[] args){
Demo d = new Demo();
d.x = 5;
show(new Demo());
System.out.println("x="+d.x);
}
public static void show(Demo d){
d.x = 6;
}
}
最后输出结果为x=5。因为在内存中创建了两个对象,而最终输出的对象的x值为5。
JAVA中关于基本数据和引用数据参数传递过程的更多相关文章
- Java中的基本类型和引用类型变量的区别
Java中的基本类型和引用类型变量的区别 学了一年多,说实话你要我说这些东西我是真说不出来是啥意思 基本类型: 基本类型自然不用说了,它的值就是一个数字,一个字符或一个布尔值. 引用类型: ...
- JavaSE基础(十)--Java中的基本数据类型转换
Java中的基本数据类型转换 说基本数据类型转换之前,先了解下 Java 中的 8 种基本数据类型,以及它们的占内存的容量大小和表示的范围,如下图所示. 重新温故了下原始数据类型,现在来解释下它们之间 ...
- 关于Java中的基本数据类型转换
Java中的基本类型有四种,其中整型分为byte.short.int.long,浮点型分为float.double,字符型char,布尔型boolean.8种类型的级别由低到高byte->sho ...
- JAVA中MESSAGEBOX,静态类直接引用
原文:JAVA中MESSAGEBOX,静态类直接引用 package cisdi.mes.wrm.mcode.serviceImpl; import javax.persistence.Entity; ...
- JAVA中的四种引用以及ReferenceQueue和WeakHashMap的使用示例
简介: 本文主要介绍JAVA中的四种引用: StrongReference(强引用).SoftReferenc(软引用).WeakReferenc(弱引用).PhantomReference(虚引用) ...
- Java中的四种引用
引用定义 实际上,Java中存在四种引用,它们由强到弱依次是:强引用.软引用.弱引用.虚引用.下面我们简单介绍下这四种引用: 强引用(Strong Reference):通常我们通过new来创建一个新 ...
- 在JAVA中怎么比较Double类型数据的大小
在JAVA中怎么比较Double类型数据的大小 我来答 浏览 33044 次 3个回答 #活动# “双11”答题活动,奖励加码!最高得2000元购物礼金! pollutedair 2015- ...
- Java中new一个对象是一个怎样的过程?JVM中发生了什么?
Java中new一个对象的步骤: 1. 当虚拟机遇到一条new指令时候,首先去检查这个指令的参数是否能 在常量池中能否定位到一个类的符号引用 (即类的带路径全名),并且检查这个符号引用代表的类是否已被 ...
- Java中值传递和引用传递的区别
在Java中参数的传递主要有两种:值传递和参数传递: 下面是对两种传递方式在内存上的分析: 一:值传递 解释:实参传递给形参的是值 形参和实参在内存上是两个独立的变量 对形参做任何修改不会影响实参 ...
随机推荐
- ASP.NET Core 3.1使用 AutoMapper
多层架构中存在多种模型,如视图模型ViewModel,数据传输对你DTO,ORM对象等,这些数据在层与层之间进行传输必须涉及类型之间的转换. AutoMapper是一个对象-对象映射器,作用是通过设置 ...
- ava基础MySQL存储过程 Java基础 JDBC连接MySQL数据库
1.MySQL存储过程 1.1.什么是存储过程 带有逻辑的sql语句:带有流程控制语句(if while)等等 的sql语句 1.2.存储过程的特点 1)执行效率非常快,存储过程是数据库的服 ...
- Oracle中除数为0的两种解决办法(decode与nullif)
Oracle中Decode函数,语句DECODE(tag,''ZCGS'',0,1)=decode(''@corp-No@'',''6010'',1,0) decode(字段或字段的运算,值1,值2, ...
- h5问题总结
一.下拉刷新上拉加载 主要依赖一款插件mescroll.js http://www.mescroll.com/ 简单好用.以前同事的用法是初始化执行执行上拉会调,页数从0开始,下拉重新加载当前地址走 ...
- 超长JVM总结,面试必备
什么是JVM JVM 是可运行 Java 代码的假想计算机 ,包括一套字节码指令集.一组寄存器.一个栈.一个垃圾回收,堆 和 一个存储方法域.JVM 是运行在操作系统之上的,它与硬件没有直接的交互. ...
- 【WPF】 问题总结-RaidButton修改样式模板后作用区域的变化
最近工作需要,需要重绘RaidButton控件,具体想要达成的的效果是这样的: 当点击按钮任意一个地方的时候,按钮的背景改变. 于是我是这样对控件模板进行修改的: <Style x:Key=&q ...
- 在 Emit 代码中如何await一个异步方法
0. 前言 首先立马解释一波为啥会有这样一篇伪标题的Demo随笔呢? 不是本人有知识误区,或者要误人子弟 因为大家都知道emit写出来的都是同步方法,不可能await,至少现在这么多年来没有提供对应的 ...
- 自动化运维工具-Ansible之1-基础
自动化运维工具-Ansible之1-基础 目录 自动化运维工具-Ansible之1-基础 Ansible 基本概述 定义 特点 架构 工作原理 任务执行模式 命令执行过程 Ansible 安装 Ans ...
- JS中var与let的区别
区别: var声明的变量,其作用域在该语句所在的函数之内,存在着变量提升的现象. let声明的变量,其作用域为该句所在的代码块内,不存在变量提升的问题. let相比于var,其不允许在相同作用域内,重 ...
- Java中定时器Timer致命缺点(附学习方法)
简介 这篇文章我一直在纠结到底要不要写,不想写一来因为定时器用法比较简单,二来是面试中也不常问.后来还是决定写了主要是想把自己分析问题思路分享给大家,让大家在学习过程中能够参考,学习态度我相信大部分人 ...