首先要知道java方法参数是怎么传递的
java方法参数的传递分为两种
1.基本类型的传递:
java方法中参数的传递对于基本类型来说是传递基本类型的值,也就是我们所说的传值
2.对象的传递:
对于对象的传递java中是传递对象的引用,也就是传递对象的地址,也就是传址(有的也说这个也是传值,只不过这个值包装了对象的地址原理其实是一样的)
java方法的调用是在方法栈中运行,分为方法入栈、出栈、压栈、弹栈、执行代码五个部分。
入栈:当运行方法的时候方法就会进入方法栈接着执行此方法。
出栈:当方法运行完毕之后方法就会移除方法栈
压栈与弹栈:当一个方法在运行当中调用了另一个方法,那么此方法就会压栈,被调用的方法就会入栈开始执行,当被调用的方法执行完毕出栈后,压栈的方法就会弹栈,接着执行后面的代码。
光说没用,看看例子吧
例1:
public static void main(String[] args) {
int i = 5;
change(i);
System.out.println(i); //result 5
}
public static void change(int i) {
i = 500;
}
分三个阶段分析:
阶段一:main方法入栈开始执行代码,在栈中初始化一个基本变量int i=5,执行到change方法,main方法压栈。
阶段二:change方法入栈开始执行代码,这里要注意,当执行change方法的时候是在方法栈中重新开辟一块内存来执行此方法;此方法传递了一个参数int i = 5,在内存中是初始化一个变量并赋值为5接着执行 i = 500,重新给变量i赋值为500,然后方法执行完毕,chang方法出栈,这个时候,为执行chang方法开辟的那块内存就会自动销毁。
阶段三:change方法执行完出栈,main方法弹栈,接着执行后面的代码,这里注意了, main方法中的变量i虽然传递给chang方法重新赋值,但只是在chang方法内部赋了值,当chang方法执行完出栈了,内存自动销毁,也就是说,main方法中变量i并没有被赋上值还是原来的5,所以最后打印出5,main方法出栈,执行main方法的那块内存销毁。
例2:
public static void main(String[] args) {
Person person = new Person();
person.age = 18;
changeAge(person);
System.out.println(person.age); //result 25
}
public static void changeAge(Person person) {
person.age = 25;
}
class Person {
int age;
}
分析:
同样是三个阶段:
阶段一:main方法入栈开始执行代码,初始化一个Person对象(这里是在堆中new一个Person),并给person对象的age属性赋值为18。
阶段
二:changeAge方法入栈开始执行代码,这里要注意,当执行change方法的时候是在方法栈中重新开辟一块内存来执行此方法;此方法传递了一个Person对象引用(即堆中new出来的person对象的地址),接着重新给person对象中的age属性赋值为25方法执行完毕,chang方法出栈,这个时候,为执行chang方法开辟的那块内存就会自动销毁,但是Person对象是在堆内存中,并没有销毁,也就是说现在person对象的age属性的值为25。
阶
段三:change方法执行完出栈,main方法弹栈,接着执行后面的代码,所以我们会看到打印出Person对象的age属性的值是25,方法执行完毕main方法出栈,执行main方法的那块内存销毁,这个时候就没有任何一个对象的引用指向堆内存中的person对象了,java虚拟机会通过finalize方法清理没有引用指向的对象进行垃圾回收。
总结:
java方法的运行主要有三点
1:java方法的参数的传递对于基本类型则是传递变量的值,对于对象则是传递对象的应用(即对象的地址)
2:java方法是在方法栈中运行的主要分为五个部分:入栈、出栈、压栈、弹栈、执行代码
3:java每执行一个方法都会在方法栈中开辟一个新的内存,且当方法执行完毕这块内存会自动释放
- 大小: 14 KB
分享到:
相关推荐
java 线程Dump 分析工具: Java的TDA线程转储分析器是一个用于分析Sun Java VM生成的线程转储和堆信息的小型Swing GUI(目前用1.4测试)。它从提供的日志文件中解析线程转储和类直方图。它提供关于发现的线程转储的...
这个文件最重要的作用就是分析 Java 堆内存泄露问题,heap analyzer,MAT 等工具都可以分析这种文件。 Java core 文件保存的是 java 应用程序在崩溃时或任一时刻关于 Java 运行环境的各种信息。包括 Java 虚拟机的...
通过对Java程序运行时内存的分析,帮助读者理解程序运行的实质,以便更加熟悉Java编程
java程序的运行机制详细分析,很基础的东西,但是很容易被忽略的部分
java线上故障分析-线程dump,堆内存分析
《数据结构与算法分析:Java语言描述 第2版 》是国外数据结构与算法分析方面的经典教材 使用卓越的Java编程语言作为实现工具讨论了数据结构(组织大量数据的方法)和算法分析(对算法运行时间的估计) 随着计算机速度...
包括 堆内存dump分析工具和thread dump(java core)的分析工具 还包括两篇关于dump分析的文档,分析java系统内存泄露死循环等非常需要啊有木有
有时候我们需要通过java代码启动多个java子进程。...最简单的方法就是通过 Runtime中的exec方法执行java classname。如果执行成功,这个方法返回一个Process对象,如果执行失败,将抛出一个IOException错误。
Mac OS java内存分析工具,Eclipse MAT(Memory analyse tool)
java线程分析工具(工具+使用说明) ...2、运行分析工具 在windows中双击运行:java线程堆栈分析工具-jca463.jar 3、拖入报告 导出1.txt到windows中,将1.txt拖入工具界面中的表格“Thread Dump List”
java开发校园人流量分析小程序源码.zipjava开发校园人流量分析小程序源码.zipjava开发校园人流量分析小程序源码.zipjava开发校园人流量分析小程序源码.zipjava开发校园人流量分析小程序源码.zipjava开发校园人流量...
JConsole(观察分析Java程序的运行)
java编写的词法分析器模拟自动机的运行,但是此程序只是初级版本未实现报错功能,提供一种思想。附测试用例
递归下降法实现语法分析器源代码(java语言编写),将src文件导入eclipse工程即可运行处结果。
Java内存分析工具,解决内存泄漏问题
上课写java的c语言词法分析器 把要分析的代码放在D盘里,建一个cifafenxi.txt,放在这里就可以运行了
编译原理CompilingPrinciple java语言开发的词法分析器含GUI界面, 按照编译原理状态机方式编写,写法简单,基于JDK开发不需要单独下载依赖jar包 下载后用eclipse或者时其他编辑器打开运行src->compiled->view->...
性能测试,线程的 dump 看到线程的 死锁,等待 运行状态
LL(1)语法分析器代码java编译原理,带注释,可运行借鉴.pdf
c语言,Java,词法分析,词法分析界面,编译原理课程实验,这是完整的可运行源代码,是用intellij IDEA写的