java基础之 方法

一、什么是方法

方法是用来完成特定功能的代码片段。

比如说我们最常用的 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("\t文件=" + 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

下面这张图片是实际的文件树

image-20210519144518080

  • 递归会根据数据一直调用自身,层数越多消耗的资源越多,数据量大时不建议使用;假设你要遍历整个磁盘的文件,这时就不建议使用。

附录Ⅰ 方法修饰符

默认值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作前缀。
posted @   喵喵扑  阅读(62)  评论(0编辑  收藏  举报
努力加载评论中...
点击右上角即可分享
微信分享提示