package com.jvmfinalstatic;
//需求分析:本节学习java中参数传递过程:
//参考文献:http://blog.sina.com.cn/s/blog_59ca2c2a0100qhjx.html
//参考文献2:http://blog.youkuaiyun.com/yangyuankp/article/details/7651251
/*
* 1.基本类型作为参数传递时:
* 基本类型作为参数传递时,传递的是这个值的拷贝。无论你怎么改变这个拷贝,原值是不会改变的。
* 2.对象作为参数传递时:
* 当对象作为参数传递时,传递的是对象的引用,也就是对象的地址
* 3.总结:
* 无论是基本类型作为参数传递,还是对象作为参数传递,实际上传递的都是值,只是值的的形式不用而已。
* 第一个示例show1()用基本类型作为参数传递时,将栈内存中的值9传递到了change1方法中。第二个示例
* 中用对象作为参数传递时,将栈内存中的值(指向堆内存中对象的地址)传递到了change2方法中。当用对象
* 作为参数传递时,真正的值是放在堆内存中的,传递的是栈内存中的值,而栈内存中存放的是堆内存的地址,
* 所以传递的就是堆内存的地址。这就是它们的区别。
* */
class Student{
private String name;
private int age;
Student(String name,int age){
this.setName(name);
this.setAge(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;
}
}
class BaseParaDeli{
private int data = 9;
//int 是基本类型因此执行这句话就会 在栈内存中直接开辟一个内存把9存入;这个内存的"名字"为data;
public String str = "i am eternal";
// 此时,会在常量池种开辟一个内存,在其中存入"i am eternal";并且在栈内存中开辟一个内存"名字"为
//str其中存放的是常量池中"i am eternal"的地址;
public void show1(){
BaseParaDeli bpd = new BaseParaDeli();
bpd.change1(data);
System.out.println("data = "+data);//输出:结果 data = 9;
/* 原因分析: 调用BaseParaDeli对象的change1方法,并且以date为参数。JVM读到这段代码时,检测到
* change1方法中的 x 是局部变量,第一步:在栈中开辟一块空间把x放入其中,并且把date的值赋给x,
* 此时 栈中这个内存的"名字"为x 其中存放的值为 9;第二步:读到x = 100时,把100赋给x;因此,在
* 栈中就会出现两个内存地址 一个名为 data 存放的是9,两一个名为x存放的是100。第三步:change1方
* 法执行完毕,立即释放局部变量 x 所占用的栈空间
*
* */
}
public void show2(){
BaseParaDeli bpd = new BaseParaDeli();
Student stuOne = new Student("John",25);
bpd.change2(stuOne);
System.out.println(stuOne.getName()+" "+stuOne.getAge());//输出: John 25
/* 原因分析:
* 调用bpd对象的change2方法,以引用stuOne为参数。第一步:JVM检测到change2方法中的stu参数为局部变量,
* 立即加入到栈中,由于是引用类型的变量,所以stu中保存的是stuOne中的指针,此时stu和sutOne指
* 向同一个堆中的对象。在stu和stuOne之间传递是指针(引用/ 地址)。 也就是说,在栈内存中有两个地址:一个
* "名字"为stuOne其中存放的是执行堆中对象的地址(比如XXF100);另一个"名字为"stu的内存里面存放的是同一个地址(XXF100)
* 第二步:当读到:stu = new Student("xiaoMing",100);change2方法中又实例化了一个Student对象,并且赋给stu;
* 即:在堆区new了一个对象,并且把该对象的指针保存在栈中的stu对应空间,此时实例stu不再指向实例stuOne所指向的对象,
* 但是实例stuOne所指向的对象并无变化,这样无法对stuOne造成任何影响,因此输出结果为:John 25;
* 第三步:方法执行完毕后,栈中的内存自动释放,堆中的对象等待回收机制回收;
*
* */
}
public void show3(){
BaseParaDeli bpd = new BaseParaDeli();
Student stuOne = new Student("Mike",30);
bpd.change3(stuOne);
System.out.println(stuOne.getName()+" "+stuOne.getAge());//输出: Mike 200
/*原因分析:
* 调用bpd对象的change3方法,以引用stuOne为参数。第一步:JVM检测到change3方法中的stu参数为
* 局部变量,立即加入到栈中,由于是引用类型的变量,所以stu中保存的是stuOne中的指针,此时stu和
* sutOne指向同一个堆中的对象。在stu和stuOne之间传递是指针(引用/ 地址)。 也就是说,在栈内存中
* 有两个地址:一个"名字"为stuOne其中存放的是执行堆中对象的地址(比如XXF100);另一个"名字为"stu的
* 内存里面存放的是同一个地址(XXF100)
* 第二步:stu.setAge(200);其实就是调用stuOne指向的对象的setDay方法,因为两者指向的是同一堆中的对象
* 所以stu对属性的改变会影响到stuOne的属性。
* 第三步:change3方法执行完毕,立即释放局部引用变量stu
*/
}
public void show4(){
BaseParaDeli bpd = new BaseParaDeli();
bpd.change4(str);
System.out.println("str: "+str);//输出结果:str: i am eternal
/*原因分析:
* 调用bpd对象的change4方法,以字符串str为参数。第一步:JVM检测到change4方法中的s参数为
* 局部变量,立即加入到栈中,由于是字符串类型的变量,所以s中保存的是str中的指针,此时s和
* str指向常量池中同一个对象。
* 第二步:s = s + "is change ?";其实就是在常量池中再开辟一个内存把s= i am eternal is change ?
* 存入其中,并且将栈中s中存放的地址指向它;这样 在栈中有两个内存 s 和 str 堆中也有两个内存,各自
* 指向各自的,因此str的值不会发生改变;
* 第三步:change4方法执行完毕,立即释放局部引用变量s
*
* 总:String变量和基本数据类型包装类中的那六个是一样的道理:可以参考上篇文章;
*
*
* */
}
public void change1(int x){
x = 100;
}
public void change2(Student stu){
stu = new Student("xiaoMing",100);
}
public void change3(Student stu){
stu.setAge(200);
}
public void change4(String s){
s = s + "is change ?";
}
}
public class ParameterDelivery {
public static void main(String[] args) {
BaseParaDeli bp = new BaseParaDeli();
bp.show1();
bp.show2();
bp.show3();
bp.show4();
}
}
相关推荐
Unity手游优化实战:用GPU Instancing把草地渲染的DrawCall从8000降到20(附完整Shader)
本文详细介绍了Unity手游中利用GPU Instancing技术优化草地渲染的实战方法,将DrawCall从8000降至20。通过Shader改造和性能优化技巧,开发者可以在移动端实现高效渲染,显著提升游戏性能。文章包含完整的Shader代码和优化策略,适合Unity开发者学习应用。
Java参数传递原理和JVM详解
很多人再刚接触Java参数传递的时候,会一脸的问号????,到底参数是怎么传递的呢?我们首先要知道Java虚拟机中运行时数据区的分布情况: 虚拟机中各区域的作用 程序计数器: 程序计数器的主要作用就是控制程序的运行。每一个线程都需要一个独立的程序计数器,虚拟机通过程序计数器来判断那个线程执行。这个区域占用内存极小,是“线程私有”的内存区域。 虚拟机...
信捷CODESYS平台伺服电机转矩控制模式应用与切换
信捷CODESYS二次开发软件:XS Studio 在运动控制中的转矩控制案例
小白学习Java第三天,JVM的内存划分及方法中参数的传递
一、JVM的内存划分 内存是计算机中的重要原件,临时存储区域,作用是运行程序。我们编写的程序是存放在硬盘中的,在硬盘中的程 序是不会运行的,必须放进内存中才能运行,运行完毕后会清空内存。Java虚拟机要运行程序,必须要对内存进行空间的分配和管理。 为了提高运算效率,就对空间进行了不同区域的划分,因为每一片区域都有特定的处理数据方式和内存管理方式,共分为5部分: 栈:存储的都是方法中的局部变量,方法...
单片机按键识别篇---单击---双击----长按
最近做一任务需要使用一个按键实现三种功能,分别是按键单击功能,按键双击功能和按键长按功能,可能之前没有接触过这类按键复用情况,顶多也只是简单识别单击和长按,没有想过双击以上按键功能,也是绞尽脑汁,想了半天,又上网看了些例程,算是对于按键的识别有点小小的了解,感觉这个功能挺实用,在此做个随笔。 一、思路 1.识别长按操作思路:我们使用系统定时器定时,然后让系统每过一段时间去扫描按键I/O...
告别TwinCAT:手把手教你用IgH EtherCAT Master在LinuxCNC上搭建实时运动控制平台
本文详细介绍了如何利用IgH EtherCAT Master和LinuxCNC搭建开源实时运动控制平台,替代商业软件TwinCAT。通过分步指南,包括实时Linux环境配置、EtherCAT主站安装、LinuxCNC集成及多轴同步控制实现,帮助开发者构建高性能、低成本的工业自动化解决方案。
详解Java中参数在方法中传递的过程
参数的传递都是 值传递,在调用方法的时候,参数会被创造出一个副本,原本的值是不会改变的。基本数据类型,也称为值类型。1.方法中传入的是基本数据类型,原变量的值不会发生改变。2.如果方法中传入的是引用数据类型(即类类型),那么传入方法中,如果对对象的相关属性进行了修改,那么原对象的相关属性也会发生改变。 下面我们结合代码 以及内存解析图 来加深下对参数在方法中传递的过程的理解。packa...
【系统分析师】2026年上半年真题:论文及解题思路
四篇论文围绕系统与开发实践展开: 安全架构设计强调数据加密(国密算法)、零信任访问控制及容灾架构,以某医疗云平台为例,实现RTO<5分钟的高可用保障。 架构风格应用解析微服务/事件驱动等风格选型,结合电商平台案例,通过服务拆分与异步通信提升扩展性。 需求评审机制提出正式评审与走查结合的方法,在金融系统中减少30%返工,解决业务规则二义性问题。 LLM测试生成利用大模型从需求/代码生成用例,辅以人工校验,使测试效率提升50%,覆盖边缘场景。 各篇均遵循“背景-理论-实践”结构,突出
java传值与传引用
Java中的参数传递机制一直以来大家都争论不休,究竟是“传值”还是“传址(传引用)”,争论的双方各执一词,互不相让。不但“菜鸟”们一头雾水,一些“老鸟”也只知道结果却说不出所以然来。我相信看过下面的内容后,你就会明白一些。 先看基本类型作为参数传递的例子: public cl
FFmpeg 开发(01):FFmpeg 编译和集成
尽管 FFmpeg 功能强大,但是由于其采用的是带有传染性的 LGPL/GPL 开源协议,所以一些大厂基本上都是自己独立开发类似的音视频处理库,甚至在接口和组织模块上模仿 FFmpeg 。
【二.图像处理核心技术】【5.形态学操作:腐蚀/膨胀/开闭运算】
想象一下,你拍了一张布满雪花点的老照片,或者扫描了字迹断裂的文档,这时候形态学操作就是你的像素整形师!它们能让模糊的边界变清晰,把断裂的笔画连起来,甚至从X光片里揪出癌细胞。今天我们要聊的,是计算机视觉界的"广场舞双雄"——腐蚀和膨胀。这俩操作就像给像素点们请了个健身教练,要么集体减肥(腐蚀),要么组团增肌(膨胀)。下次当你用美颜相机时,不妨会心一笑——这看似魔法的背后,正是形态学在默默耕耘。腐蚀的规则很简单:如果一个像素点周围的邻居不全白,它就"狗带"(变黑)。:先用砂纸打磨(腐蚀),再喷漆填补(膨胀)
Java基础-10总结形式参数,包,修饰符,内部类
你需要的是什么,直接评论留言。 获取更多资源加微信公众号“Java帮帮” (是公众号,不是微信好友哦) 还有“Java帮帮”今日头条号,技术文章与新闻,每日更新,欢迎阅读 学习交流请加Java帮帮交流553841695 分享是一种美德,分享更快乐! 类,抽象类,接口的综合小练习 /* 教练和运动员案例(学生分析然后讲解) 乒乓...
ABB机器人与S7-1200PLC实现位置坐标数据发送和接收的具体方法
ABB机器人与S7-1200PLC实现位置坐标数据发送和接收的具体方法
Java 参数传递问题详解
昨天实验室同门问了个关于Java参数传递的问题,虽然很基础。但是却挺有意思的,也时初学者可能比较疑惑的地方,今天就花点时间总结一下。如有错误还请批评指正。 问题引入 就是这样一个简单的问题,我在类中定义了一个全局的String str和char数组chars,并且在类的实例化中调用了**exchange()**方法,最后对原始str和chars的内容进行了输出。这时候读者不妨停下简单思考下此刻的输出应该时是什么呢? import java.util.Arrays; public class Param
温度PID控制PLC程序
温度PID稳定控制程序,适用于欧姆龙PLC,对其他PLC也具有很大参考价值
Statistics and Machine Learning Toolbox
Statistics and Machine Learning Toolbox(带书签),MATLAB统计学习工具
java基础—方法的参数传递机制
java基础—方法的参数传递机制 1、基本类型参数传递 Java里方法的参数传递方式只有一种:值传递。所谓值传递,就是将实际参数值的副本(复制品)传入方法内,而参数本身不会受到任何影响。 Java里的参数传递类似于《西游记》里的孙悟空,孙悟空复制了一个假孙悟空,这个假孙悟空具有和孙悟空相同的能力,可除妖 或被砍头。但不管这个假孙悟空遇到什么事,真孙悟空不会受到任何影响。与此类似,传入方法的是实际参数值的复制品,不管方法 中对这个复制品如何操作,实际参数值本身不会受到任何影响。下面程序演示了方法参数传
LinePhone3.2.7(android端最新版本) sip客户端
SIP客户端For android:LinePhone3.2.7(最新版本),官网地址:http://www.linphone.org/
java参数传递的最终理解
java的参数传递一直是个令初学者搞不懂的知识(- - 比如我)。今天决下心来敲代码,研究透彻java的参数传递。 根据所学习的资料,java的参数传递只有一种——值传递。 可能大部分CS专业的学生(再次——比如我)最初都是由接触C/C++开始,因此印象中总会有两种参数传递类型——1.值传递,2.引用传递。 再说说两种传递类型(浅谈C/C++): 1.值传递——值传递时内
android 蓝牙通讯demo
android 下蓝牙通讯demo,实现了发现蓝牙,使能蓝牙,通过蓝牙发送消息。
图解Java 中的参数传递是传值还是传引用?
在 Java 中,所有的参数传递都是值传递。这意味着方法调用时传递的是实际参数(实参)的副本,而不是参数的引用。尽管这一点在处理对象类型时可能显得有些模糊,但深入理解这一概念可以帮助我们更好地掌握 Java 编程。Java 中的参数传递机制是一个非常重要的概念,理解它对于编写健壮的代码至关重要。Java 采用的是值传递,这意味着传递的是实参的副本。对于基本类型,传递的是值的副本;对于对象类型,传递的是对象引用的副本。
关于java中的参数传递
作为一个JAVA的初学者,不得不说参数传递是一个很让人头疼的问题,特别是在“无数个类互相调用”,传引用时。大一学过一年的C++(接下去大二,看来还很嫩),平时的题目传参还停留在传基本数据类型的参数,但是当用JAVA做扫雷游戏时,需求多了,类自然也多了,那么很多时候类的属性会是类类型的。这个时候,当多个类之间相互调用时,会遇到两个问题:第一,如何提炼参数?第二,参数如何传递,且参数间接传递时如何避免
Oracle 存储过程的参数传递:IN / OUT / IN OUT 深度解析
Oracle 存储过程参数传递:IN/OUT/IN OUT 关键解析 核心摘要 Oracle 存储过程的参数传递模式(IN/OUT/IN OUT)不仅是语法差异,更是严格的编程契约: IN参数:单向输入,PL/SQL内只读不可修改,传递值拷贝 OUT参数:单向输出,强制要求过程内赋值,忽略调用方初始值 IN OUT参数:双向传递,既接受初始值又返回修改值 重点说明 OUT参数陷阱:过程内必须显式赋值,否则返回NULL,容易导致静默错误 IN参数优势:线程安全,天然防御性编程,适合传递查询条件等输入数据 IN
Java中参数传递机制
很多都知道Java参数传递,但是能有几个人能真正说出实参值是如何传入方法的呢? Java里方法的参数传递方式只有一种:值传递。所谓值传递,就是将实际参数值得副本(复制品)传入方法内,而参数本身不会受到任何影响。 public class SwapDemo { public static void swap(int a,int b){ int tmp = a; a = b;
JAVA入门级教学之(参数传递)
定义一个测试类: package com.lbj.javase04; public class Test01 { public static void main(String[] args) { // TODO Auto-generated method stub int i=10; //add方法调用的时候,给add方法传递了一个变量i,到底传递的是什么? //jav...
java函数 的参数传递
作者:Intopass 链接:https://www.zhihu.com/question/31203609/answer/50992895 来源:知乎 著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。 首先,不要纠结于 Pass By Value 和 Pass By Reference 的字面上的意义,否则很容易陷入所谓的“一切传引用其实本质上是传值”这种并不能解决问题无意义论战中。更何况,要想知道Java到底是传值还是传引用,起码你要先知道传值和传引用的准确含义吧?可是如果你已经知道
Java初学-函数
Java初学三 一个简单的代码: class Dome{ public static void main(String[] args){ System.out.println("Welcome Java!"); } } 其中: public主函数是公开权限最大权限 static主函数是静态函数 void该函数没有返...
java 参数传递 引用传递,Java 参数传递是值传递还是引用传递?
最近在看 Martin Fowler 重构一书,在一章中看到 JS 参数传递是按值传递,联想到 Java。下面我们聊聊 Java 参数传递是值传递还是引用传递?还记得初学 Java 的时候,同学就问我这个问题,我很自信的就回答当然是按值传递。然后用代码举了例子。输出结果:oldAge is 100change age is 10虽然同学认为我的例子没有问题,但是却不信服这个结论,举了另一个对象的例...
初学java,对比c++不同
初学Java笔记: publicclassTestRecursion01 { publicstaticvoidmain(String[]args) { longd=a(10); System.out.println(d); longf=b(10); System.out.println(f); } staticintcount=0; staticlonga(intn) { if(n==1) return1; else returnn*a(n-1); } //用循环的方法...
java 对象类型的参数传递
本人初学java在学习到对象型参数传递时,对此感觉思维混乱。最终花了半天时间理清了思路: 我写了一个简单的程序来辅助理解: 其实定义了7个类的实例,进行改变和交换,从中观察其规律。 package demo; class Time{ int a; } public class demo{ Time time1 = new Time(); Time time2 = ne
488



被折叠的 条评论
为什么被折叠?



