一、方法
- 方法调用: 类名.方法名(实参);
- .方法定义在类中,一个类中可以定义多种方法,但是方法体内不能够再定义方法。
- 方法只定义不调用是不会执行的,并且在JVM(java虚拟机)中也不会给该方法分配“运行所属”的内存空间,只有在调用这个方法的时候,才会动态的给这个方法分配所属的内存空间。
4.一个方法有返回值的时候,调用此方法可以接收返回值也可以不接收返回值,但是一般情况下是接收返回值的。
二、JVM(java虚拟机)
Java虚拟机主要包括三块内存空间:方法区内存,堆内存,栈内存。
(1)方法区内存:存储代码片段(方法代码片段属于.class字节码文件的一部分,在类加载的时候,JVM将它放在了方法区当中,所以JVM三块主要的内存空间中方法区内存最先有数据,存放了代码片段)
(2)栈内存:分配方法运行的所属内存空间
①栈帧永远指向栈顶元素
②栈顶元素永远处于活跃状态,其它元素静止
③术语: 压栈/入栈/push —— 弹栈/出栈/pop
(3)画图表示虚拟机处理代码的过程
public class Test4 {
public static void main(String[] args){
int a=1;
m(a);
System.out.println(a);
}
private static int m(int b) {
b++;
return b;
}
}
三、方法重载(Overload)
对待功能相似的方法名定义一样
(1) 方法重载条件①在一个类中②方法名相同③参数列表不同④类型不同
(2) 方法重载只和方法名和参数类型有关
public class Test1 {
public static void main(String[] args){
m(10);
m('1');
m(10.0);
}
private static int m(int a){
System.out.println(a);
return a;
}
private static double m(double a){
System.out.println(a);
return a;
}
private static char m(char a){
System.out.println(a);
return a;
}
}
四、方法递归(实际上就是入栈出栈的过程)
(1)递归就是方法自身调用自身
(2)递归十分占内存,能不用则不用
(3)Error:java.lang.StackOverflowError 栈内存溢出错误
错误无法返回,只有一个结果,就是JVM停止工作
(4)递归必须有结束条件,否则一定会发生栈内存溢出错误。递归即使有了争取的结束条件,也可能发生栈内存溢出错误,因为递归的太深了。
举例:计算1-N的乘积
普通方法
public class Test2 {
public static void main(String[] args) {
System.out.println("请输入您要计算到的N:");
Scanner s =new Scanner(System.in);
int n=s.nextInt();
int result = 1;
for(int i=1;i<=n;i++){
result *= i;
}
System.out.println("1-N的乘积为"+result);
}
}
采用递归方法(面试题经常问到)
public class Test3 {
public static void main(String[] args) {
System.out.println("请输入您要计算到的N:");
Scanner s =new Scanner(System.in);
int n=s.nextInt();
int result=m(n);
System.out.println(result);
}
private static int m(int n) {
if(n==1){
return 1;
}
return n*m(n-1);
}
}