方法
- 当用代码定义了一个功能,想要将该功能保存下来沿用,就要用以方法为载体;
- Java中运行代码除极个别情况外,必须写在方法中,方法就是代码的载体;
- 平时代码的main方法也是一个方法,只是比较特殊,可以被jvm识别;
- 因为要适应不同的需求,方法也需要千变万化,一个main方法显然无法满足需求;
- 方法的出现提高了代码的复用性;
1. 方法格式
权限修饰符 静态修饰符 返回值类型 方法名(参数1, 参数2...){
方法体语句;
return 返回值;
}
2. 方法详解
- 权限修饰符:设定方法的作用范围,public(公开)、private(私密)、protected(保护);
- 静态修饰符:static关键字表示静态,有static则为静态方法,反之为非静态方法;
- 返回值类型:代码运行结果的数据类型,如果没有返回值则为void关键字,同时代码中不能出现return关键字,因为无需返回;
- 方法名:方法的名称,通过方法名来调用方法,采用小驼峰命名法命名;
-
参数:
- 实际参数,调用方法时传递给方法的参数,实际参加代码的运算,基本数据类型为值,引用数据类型为地址值;
- 形式参数,在定义方法时命名的参数,用来表示接收参数的数据类型;
- 参数名:变量名,采用小驼峰命名法命名;
- 方法体语句:方法中的功能代码, 也是我们实际运行的代码;
- return:关键字,表示结束方法,同时返回一个值;
- 返回值:方法运行的结果,由return返回给调用者,当没有返回值时,不能出现return和返回值;
3. 方法分类
-
无返回值,无参数:
public static void notify(){}
,常用于声明和提醒等; -
无返回值,有参数:
public static void shark(int money){}
-
有返回值,无参数:
public static String getInfo(){}
-
有返回值,有参数:
public static int getSum(int a,int b){}
class FunctionTest{
public static void main(String[] args){
notify();
shark(10);
String info = getInfo();
System.out.println("我电脑的信息是:" + info);
int result = getSum(24323,3242135);
System.out.println("这两个数字的和是:" + result);
}
// 无返回值,无参数
public static void notify(){
System.out.println("请站稳扶好,注意脚下安全");
}
// 无返回值,有参数
public static void shark(int money){
System.out.println("您投币" + money + "元,可以摇" + money*10 + "分钟");
}
// 有返回值,无参数
public static String getInfo(){
String CPU = "i18 10086";
String Card = "GTX 2080Ti";
String SSD = "Intel 1T";
return CPU + "\t" + Card + "\t" + SSD;
}
// 有返回值,有参数
public static int getSum(int a,int b){
return a + b;
}
}
4. 调用方式
调用方法时,传递一个实参,相当于将该实参赋值给方法中的形参。
- 单独调用:方法独立于其他代码,独立执行功能;
- 输出调用:只做结果输出,调用无意义;
- 赋值调用:有返回值,可进一步操作返回值;
5. 方法重载
定义:一个类里面出现多个方法名相同,参数列表不同的多个方法,这种现象为方法重载;
作用:方法重载是为了提高方法名的使用率;
注意:程序中绝对不允许出现两个完成一样的方法(方法名和参数列表相同);
-
分类
- 参数个数不同
- 参数类型不同
- 参数顺序不同(开发中一般不用,无意义)
6. 方法执行流程
-
java虚拟机内存结构图
-
方法区
- 定义:方法区与Java堆一样,是各个线程共享的内存区域;
- 作用:存储已被Java虚拟机加载的类信息、常量、静态变量、即时编译器编译后的代码等;
- 特点:
- 方法区的大小不必是固定的,jvm可以根据应用的需要动态调整;
- 方法区同样存在垃圾收集;
-
栈
- 定义:栈是一种后进先出的线性表数据结构,分为栈顶和栈底,允许从栈顶插入或删除元素,栈只有入栈和出栈两种操作;
- 作用:运行方法和存储局部变量;
- 特点:
- 只能从栈顶添加或删除元素;
- 栈是后进先出的数据结构;
-
执行流程
- java程序开始执行时,先通过类加载器子系统找到硬盘上的字节码(class)文件,然后将其加载到java虚拟机的方法区当中;
- 当调用某个方法时,jvm会将这个方法压入栈中执行(入栈);
- 当该方法中又调用其他方法时,jvm会中断该方法,并将新的方法压入栈中执行(入栈),此时后一个方法位于前一个方法上面;
- 当后一个方法执行完后,就会被jvm从栈中移除(出栈),并继续执行前一个方法直至结束,出栈;
7. 递归
定义:程序调用自身的编程技巧,成为递归。
- 作用:方法内调用的方法执行的动作恰好和本方法一样,我们就可以调用这个方法本身根据不同的参数再执行一遍;
- 注意
- 递归程序必须事先判断好停止点,不然就会造成无限调用的情况;
- 递归程序执行的动作虽然一样,但是每次执行的参数都不同,不然就会无意义;
public class RecursionTset {
public static void main(String[] args) {
// TODO Auto-generated method stub
int result = sumUp(100);
System.out.println(result);
}
public static int sumUp(int n) {
if(n == 1 || n == 0) {
return n;
} else {
return sumUp(n-1)+n;
}
}
}