Java方法
3、关于方法在计算机中的实现(续)
下面通过一段Java递归代码和概念图说明Java方法在JVM虚拟机上运行时在内存空间上的实现原理
简单的递归函数
import java.util.Scanner;
public class Recursion {
public static void main(String[] args) {
System.out.println("main方法");
// Scanner sc = new Scanner(System.in);
// int x = sc.nextInt();
// int z = sc.nextInt();
int x = 3;
int y = 1;
int z = 2;
System.out.println(getRes(x,y,z));
}
public static int getRes(int x,int y,int z){
System.out.println("getRes方法");
if(x != z){
x = x - y;
return getRes(x,y,z);
}
return 666;
}
}
//整个代码执行后的结果
//main方法
//getRes方法
//getRes方法
//666
//
//下面是println()方法在JVM上实现的模拟图
从上图我们可以知道JVM上运行的方法必定是位于栈内存空间即JVM只执行位于栈顶的“活跃”方法
对于不执行的方法,我们可以认为它不活跃
接上图我们继续模拟整个代码的执行概念图(省略println()方法,仅展示传参后getAns()方法在栈内存空间执行的概念图)
第一个部分的mian()栈帧内出现了标注错误,应该是第三部分那样的,可能会有一点点影响但是结合代码还是影响不大的,嘿嘿
当然在方法出栈后该方法占用的内存空间也将被释放
这也能解释为什么不同的方法中可以定义相同的变量名
在上述的递归程序走我们传递的参数和返回的值是int型的
我们在处理实际问题时并不可能一直处理一种类型的数据
而应该是对于多种类型数据并存的一类问题的解决方法
下面就是解决这一问题的方案
4、方法的重载
方法的重载( Overloading )
In my opinions, 应该是在①同一个类中,②方法名相同,③参数列表不同的多个方法被称为方法重载,其中参数列表不同又有 a:参数类型不同;b:参数的个数不同;c:参数传递的顺序不同;
具体的代码展示
public class OverLoad {
public static void main(String[] args) {
int a = 100;
int b = 200;
int c = 300;
double a1 = 100.00;
double b1 = 200.00;
double c1 = 300.00;
float a2 = 100.00f;
float b2 = 200.00f;
System.out.println(getAns.getAns(a,b));
System.out.println(getAns.getAns(a2,b2));
System.out.println(getAns.getAns(a1,b1,c1));
System.out.println(getAns.getAns(a,a1));
System.out.println(getAns.getAns(b1,a));
}
}
class getAns {
public static int getAns(int a,int b){
return a + b;
}
public static double getAns(double a,double b,double c){
return a + b + c;
}
public static float getAns(float a,float b){
return a + b;
}
public static double getAns(int a,double b){
return a + b;
}
public static double getAns(double a,int b){
return a + b;
}
}
/*输出结果
300
300.0
600.0
200.0
300.0
*/
以上就是我在学习Java方法中的收获,当然可能还有一些收获自己也还没收获住,嘿嘿