一、什么是方法
方法是用来完成特定功能的代码片段。
比如说我们最常用的 System.out.println();
这一段代码中 println()
就是方法,它完成的特定功能是在控制台输出我们需要输出的内容。
二、方法该怎么写
修饰符 返回值类型 方法名称 (参数类型 参数名称){
...方法体...
return 返回值;
}
- 修饰符:定义方法访问的权限,有默认值,具体修饰符看【附录Ⅰ】。
- 返回值类型:说明方法进行后返回数据的类型,方法执行后没有返回结果就写
void
,不能省略不写。 - 方法名:方法名是给代码段起一个名字,方便调用方法。名字要符合命名规范【附录Ⅱ】。
- 参数类型:参数就像一个占位符,方法内部使用参数来模拟传入的数据;如果参数传入值,占位符就会直接被参数替换掉。如果方法不需要参数,可以省略不写。
- 方法体:完成特定功能的代码段。
- 返回值:当代码执行完成后应该告诉调用者的内容,当然也可以什么也不告诉,我们只要不写
return
就表示没有返回值。
// 实例:写一个计算2个整数的和的方法
//修饰符 返回值 方法名 参数类型 参数名称
public static int add (int number1, int number2) {
// 方法体
int sum = number1 + number2;
// 返回值
return sum;
}
三、方法如何调用
方法名(参数值);
- 方法名:我们在写方法时定义的名字。
- 参数值:方法在定义时需要我们传入的值,比如上面的方法sum就需要我们传入2个整数,我们在调用方法时就应该把2个整数值传递过去,如果调用时不传入参数,程序就会报错。
- 如果方法有返回值的,我们可以使用一个变量存放起来,便于后面使用。
public static void main(String[] args) {
// 方法的调用
int sum = add(1,2);
// 使用方法的返回值
System.out.println(sum);
}
// 输出
3
四、方法的重载
书写一个 同名不同参 的方法,这种行为叫做方法的重载。
- 方法名必须相同,如果不同就不能称为重载。
- 参数必须不同,可以是类型或者数量不同。
- 返回值类型不影响方法的重载,只要符合上面的2种情况即可。
// 书写一个add的重载方法,使其能计算2个double类型的数字之和
public static double add (double number1, double number2) {
// 方法体
double sum = number1 + number2;
// 返回值
return sum;
}
- 在调用
add
方法时,jvm会根据传入的参数去匹配对应的方法。
public static void main(String[] args) {
// 方法的调用
int sum = add(1, 2);
// 使用方法的返回值
System.out.println(sum);
double sum2 = add(1.0, 2.0);
System.out.println(sum2);
}
// 输出
3
3.0
五、不定项参数
在传递参数时,在参数类型的后面添加
...
表示这个参数为不定项参数,也就是同类型的参数可以书写多个。
- 不定项参数支持 jdk1.5+
- 不定项参数只能放在参数的最后一个,普通参数放在前面。
// 实例:根据传入的整数,计算整数之和
public static double add(double... numbers) {
System.out.println("不定项参数");
// 方法体
double sum = 0.0;
for (int i = 0; i < numbers.length; i++) {
sum += numbers[i];
}
// 返回值
return sum;
}
- 在调用方法时,固定参数优先级大于不定项参数方法。
public static void main(String[] args) {
// 方法的调用
int sum = add(1, 2);
// 使用方法的返回值
System.out.println(sum);
// 符合条件的方法存在2个,这是会根据优先级大小来调用
double sum2 = add(1.0, 2.0);
System.out.println(sum2);
double sum3 = add(1.0, 2.0, 3.0);
System.out.println(sum2);
}
// 输出
3
重载add方法
3.0
不定项参数
3.0
六、递归
函数调用它自身的情况成为递归
- 新的问题和原来的问题有同样的解决方式时我们可以递归。
- 必须存在一种可能,使递归可以被结束。
// 实例:遍历文件夹下的所有子文件。
// 文件夹下即可能存在文件,也可能是文件夹,
// 如果是文件夹,那么它下面也即可能存在文件,也可能是文件夹,
// 这样子文件夹的问题和我们要查询的总文件夹有同样的处理方式,这时我们就可以使用递归来处理。
public static void dirAllFile(File file) {
// 获取文件夹的文件列表
File[] files = file.listFiles();
Optional<File[]> optionalFiles = Optional.ofNullable(files);
// 判断是否存在文件
if (optionalFiles.isPresent()) {
// 存在文件就比遍历文件
for (File temp : optionalFiles.get()) {
// 如果当前的对象是一个文件夹,我们需要遍历文件夹下的所有文件
if (temp.isDirectory()) {
System.out.println("目录=" + temp.getName());
// 递归
dirAllFile(temp);
} else {
System.out.println(" 文件=" + temp.getName());
}
}
}
}
// 调用
public static void main(String[] args) {
dirAllFile(new File("E:\项目\security"));
}
// 输出
目录=exception
文件=ValidateCodeException.java
目录=filter
文件=JwtAuthenticationTokenFilter.java
文件=ValidateCodeFilter.java
目录=handle
文件=AuthenticationEntryPointImpl.java
文件=JsonAccessDeniedHandler.java
文件=JsonAuthenticationEntryPoint.java
文件=JsonFailureHandler.java
文件=JsonLogoutSuccessHandler.java
文件=JsonSuccessHandler.java
文件=LogoutSuccessHandlerImpl.java
文件=LoginBody.java
文件=LoginUser.java
目录=model
文件=LoginBody.java
文件=LoginUser.java
文件=SecurityConfig.java
文件=SecurityUtils.java
目录=service
文件=PermissionService.java
文件=SysLoginService.java
文件=SysPermissionService.java
文件=TokenService.java
文件=UrlAccessDecisionManager.java
文件=UrlFilterInvocationSecurityMetadataSource.java
文件=UserDetailsServiceImpl.java
下面这张图片是实际的文件树
- 递归会根据数据一直调用自身,层数越多消耗的资源越多,数据量大时不建议使用;假设你要遍历整个磁盘的文件,这时就不建议使用。
附录Ⅰ 方法修饰符
默认值default,不写修饰符即默认default;Y 表示可以访问,N表不可访问。
修饰符 | 当前类 | 同一个包 | 子孙类(同一包) | 子孙类(不同包) | 其他包 |
---|---|---|---|---|---|
public | Y | Y | Y | Y | Y |
protected | Y | Y | Y | N | |
default | Y | Y | Y | N | N |
private | Y | N | N | N | N |
附录Ⅱ 方法命名规范
- 【强制】代码中的命名均不能以下划线或美元符号开始,也不能以下划线或美元符号结束。
- 【强制】代码中的命名严禁使用拼音与英文混合的方式,更不允许直接使用中文的方式。
- 【强制】方法名统一使用
lowerCamelCase
风格,必须遵从驼峰形式。- 【强制】杜绝完全不规范的缩写,避免望文不知义。
- 【推荐】为了达到代码自解释的目标,任何自定义编程元素在命名时,使用尽量完整的单词组合来表达其意。
- 【参考】 获取单个对象的方法用
get
作前缀。- 【参考】获取多个对象的方法用
list
作前缀。- 【参考】获取统计值的方法用
count
作前缀。- 【参考】插入的方法用
insert
作前缀。- 【参考】修改的方法用
update
作前缀。- 【参考】物理删除的方法用
delete
作前缀。- 【参考】逻辑删除的方法用
remove
作前缀。