- 方法的本质及作用
- 方法(method)
- 方法的作用:
- 注意点
- 方法的定义
- 修饰符列表
- 返回值类型
- 方法名
- 形式参数列表(形参)
- 方法的调用
- 栈数据结构
- 方法的重载
- 递归
就是一段可以被重复利用的代码片段,并且每一个方法都会完成一个独立的功能。方法的作用:
代码复用(重复的代码不需要重复的编写,这种功能的代码可以只写一份,如果需要使用这个功能的话,我们就调用这个方法)
注意点-
方法必须先调用才能够执行,如果不调用,方法是无法执行的,main方法是JVM自动调用的,不需要我们手动调用
-
方法在一个类体当中定义的时候,是没有顺序要求的
-
方法当中不能定义方法,一个方法是定义在类体中的
- 定义一个方法的语法规则
修饰符列表[ 修饰符列表 ] 返回值类型 方法名(形式参数列表){
}
- 目前写死了就行 public static,后期会详讲
- 修饰符列表是个可选项(可有可无)
- public 表示公开的 static 表示静态的
什么是返回值?
- 值:就是一个数据,或者称为一个结果
- 返回值:main方法调用了sumInt方法,那么sumInt这个方法执行结束之后,应该有一个执行结果返回给main方法,这里所说的执行结果就是返回值,A调用B,B结束的时候应该返回执行的结果给A
- 返回值:实际上就是返回一个数据,这个数据可以是任何一种数据类型
在代码的角度。我们怎么去实现:值得返回?
- 非常重要:在Java代码角度,使用“return” 值,这样的语句来完成数据的返回
- 返回给谁了?谁调用了,就返回给谁了(返回给了调用者)
- “return”值,这个Java语句的作用:将结果返回给调用者,同时所在的方法执行结束。
- 只要“return”值这个语句执行,所在的方法结束,同时将结果返回给调用者
返回值类型起到两个作用:
-
作用一:约束返回的数据的类型,不能随意返回数据,只能返回这种类型下的数据
-
作用二:根据方法声明的返回值类型来定义接收这个方法返回值的变量的类型
方法的返回值类型,可以是哪些类型?
- 基本数据类型 byte short int long float double boolean chart
- 引用数据类型 String…
- void 表示这个方法执行完之后,不需要返回任何数据类型,返回值类型必须是void,不能空着不写
关于"return值"的这样的语句
当一个方法的返回值类型是void,那么方法体中不能写:return 值
当一个方法的返回值类型不是void,那么方法体中就必须写:return 值
- break语句用来终止循环
- return语句用来终止方法的执行
- 方法名是标识符,只要遵循标识符的命名规则和命名规范即可
- 一般一个方法都是完成特定功能的,所以方法名一般都是以”功能“命名。sunInt ,表示int数据类型求和
- 方法名要见名知意(一个好的方法名,可以大大提升程序的可读性)
- 方法名和变量名的命名规范一样,都是首字母小写,后面每个单词首字母大写,遵循驼峰命名方式。
方法在声明的时候,小括号中的叫做:形式参数列表(形参)
public static int sum(int x, int c){}
// (int x, int c) 是形式参数列表
// int x 和int c 都是形参
- 形参的个数没有要求,0~N个,有多个的话,使用英文逗号隔开
- 形参中起决定性作用的是:参数的类型。
- 方法上的每一个形参,都是局部变量
方法在调用的时候,小括号中的叫做:实际参数列表(实参)
sum(10,20): // (10,20) 叫做实际参数列表 // 10 和 20 都是实参
形式参数列表 和实际参数列表要一一对应:
- 个数要一样
- 类型要对应相同
- 如果一个方法的修饰符列表当中有static,那么调用这个方法的语法格式是:类名.方法名(实参列表);
- 当调用者和被调用者在同一个类中的时候,类名可以省略
特点:先进后出
在Java中的JVM当中有一块空间(一个线程一块),叫做 vm stack(虚拟机栈),
方法调用的时候,需要的空间在vm stack 当中进行分配
- 方法调用是在压栈(给方法分配执行空间)
- 方法结束是弹栈(将之前分配的空间全部释放掉)
- 方法只定义,不去调用,这个方法是不会执行的,只有方法在调用的时候,才会给该方法分配空间,这个时候发生压栈动作,如果方法执行结束了,这个方法所属的空间就要释放掉,此事发生弹栈动作。
- 方法当中的局部变量只在当前方法中有效,因为方法结束之后,该方法所属的内存空间全部释放了。
什么是方法的重载?
在一个类中,允许方法名一致,参数列表不同,像这种情况,就属于方法重载机制。
- Java编译器是允许的,方法名虽然是一样的,但是参数列表不同,Java编译器可以区分,
什么时候需要使用方法的重载呢?
- 在功能相似的情况下,可以把方法名定义为相同的方法名。
- 如果功能A和功能B完全不一样,不相似,没关系,方法名千万别一样。
方法重载的好处?
- 代码美观
- 更便于程序员的开发
代码满足什么条件的时候,能够构成方法重载机制呢?
-
条件一:在同一个类当中
-
条件二:方法名一致
-
条件三:参数列表不同
个数不同算不同
类型不同算不同
顺序不同算不同
方法重载需要注意的问题:
- 方法的重载和方法的返回值类型无关
- 方法的重载和方法的修饰符列表无关
以下代码都不构成方法重载
// 类型一样,不构成
public static void x(int a , int v){}
public static void x(int b , int d){}
//方法的重载和修饰符列表,返回值类型无关
public static void a(int b , int d)[]
void a(int b , int d)
递归
什么是方法递归?
- 方法自己调用自己
对于递归来说:
- 必须要有结束条件
- 不能无限制的递归,无限制递归会导致“栈内存溢出错误”。栈内存溢出错误之后,JVM就停止了。
栈内存溢出错误:
java.lang.StackOverflowError(它发生之后,JVM就推出了)
- 递归不建议使用,因为使用递归,一旦没有结束条件,就会发生栈内存溢出错误。
- 原则:能用循环的尽量使用循环,只有当循环搞不定的时候,才会选择使用方法递归的方式。(递归比循环更耗费内存空间)
有的时候,即使存在递归的结束条件,并且我们也知道这个递归条件早晚有一天会成立的,但运行的时候还是发生了栈内存溢出错误?这是为什么?这是因为递归的太深了。栈内存不够。怎么解决这个问题呀?
- 设置VMStack栈内存的大小,可以先考虑扩展VMStack的空间,变大一点。
- 如果变大了,还是不行,那基本上可以断定,你这个递归的结束条件是有问题
使用递归计算累加
阶乘



