Java 方法

对方法的理解

1.方法是完成特定功能的、相对独立的程序段。
2.方法定义遵循功能单一原则,也就是一个方法只做一件事。
3.方法的特征是()

方法分类

-系统方法
系统方法是jdk中提供好的方法,例如

Arrays.sort();
System.out.println();

-自定义方法
如果系统方法不能满足开发的需要,此时应该由开发人员自己定义方法,完成相应的功能。

方法构成

方法的语法结构

[修饰符] 返回值类型 方法名称([参数表]){
    //方法体
}

例如:

public static void sort(){

}
public static void sort(int []arr){

}
public static int sort(double []arr){
    return 0;
}

方法定义与调用

案例:
分别输入三个学生的Java成绩,SQL成绩,Oracle成绩,然后分别计算三个同学的平均成绩。
分析:
三个学生应该考虑使用数组,但是鉴于这个案例是引出方法的定义,所以不使用数组,版本一代码如下:

public static void main(String[] args) {
        java.util.Scanner input = new java.util.Scanner(System.in);
        // 第一个学生的成绩
        int java1 = 0;
        int sql1 = 0;
        int oracle1 = 0;
        System.out.println("请输入Java成绩:");
        java1 = input.nextInt();
        System.out.println("请输入SQL成绩:");
        sql1 = input.nextInt();
        System.out.println("请输入Oracle成绩:");
        oracle1 = input.nextInt();
        double result1 = (java1 + sql1 + oracle1) * 1.0 / 3;
        System.out.println("第一个新兵的平均成绩是:" + result1);
        
        // 第二个学生的成绩
        int java2 = 0;
        int sql2 = 0;
        int oracle2 = 0;
        System.out.println("请输入Java成绩:");
        java2 = input.nextInt();
        System.out.println("请输入SQL成绩:");
        sql2 = input.nextInt();
        System.out.println("请输入Oracle成绩:");
        oracle2 = input.nextInt();
        double result2 = (java2 + sql2 + oracle2) * 1.0 / 3;
        System.out.println("第二个新兵的平均成绩是:" + result2);
        
        // 第三个学生的成绩
        int java3 = 0;
        int sql3 = 0;
        int oracle3 = 0;
        System.out.println("请输入Java成绩:");
        java3 = input.nextInt();
        System.out.println("请输入SQL成绩:");
        sql3 = input.nextInt();
        System.out.println("请输入Oracle成绩:");
        oracle3 = input.nextInt();
        double result3 = (java3 + sql3 + oracle3) * 1.0 / 3;
        System.out.println("第三个新兵的平均成绩是:" + result3);
    }

可以发现版本一代码严重冗余,违背方法的减少冗余性的要求。改进如下:
分析代码冗余部分,析出为方法,即将本例中输入学生成绩的功能写在一个方法中,多次调用。

 public static void main(String[] args) {
        getAvg();//方法的调用
        getAvg();//方法的调用
        getAvg();//方法的调用
    }
    //被调方法
    public static void getAvg(){
        java.util.Scanner input = new java.util.Scanner(System.in);
        int java = 0;
        int sql = 0;
        int oracle = 0;
        System.out.println("请输入Java成绩:");
        java = input.nextInt();
        System.out.println("请输入SQL成绩:");
        sql = input.nextInt();
        System.out.println("请输入Oracle成绩:");
        oracle = input.nextInt();
        double result3 = (java + sql + oracle) * 1.0 / 3;
        System.out.println("第三个新兵的平均成绩是:" + result3);
    }

方法返回值

返回值的设计

  1. 在方法名前面写返回值的类型
  2. 在方法体内部使用return语句返回数据
  3. 主调方法通过赋值语句将方法返回值赋给变量
  4. 一个方法只能返回一个值
方法常见错误
  1. 方法返回值定义为viod,有返回值
  2. 方法返回值定义为double,返回值为其他类型
  3. 无返回值时,主调方法中接受返回值
  4. return之后语句不会执行
  5. 确保没有return语句不会运行的情况出现

方法参数设计

什么样的数据应该设计成方法参数?
在被调函数中每次调用都需要变化的数据,设计成方法参数。例如第几个学生就需要设计成方法参数。
方法参数是主调方法向被调方法传入的数据,方法参数是被调方法执行的前提条件。

形式参数与实际参数

主调方法提供的参数是实际参数
被调方法接收数据的参数是形式参数
主调方法的实参传递给被调方法的形参。按照个数,顺序依次赋值。

变量的作用域和生命周期

代码示例:

//主调方法
    public static void main(String[] args) {
        for (int i = 0; i < 3; i++) {
            double d1 = getAvg(i+1);
            System.out.println(d1);
        }
    }
    
    //被调方法
    public static double getAvg(int index){
        java.util.Scanner input = new java.util.Scanner(System.in);
        int java = 0;
        int sql = 0;
        int oracle = 0;
        System.out.println("请输入第"+index+"个学生的Java成绩:");
        java = input.nextInt();
        System.out.println("请输入第"+index+"个学生的SQL成绩:");
        sql = input.nextInt();
        System.out.println("请输入第"+index+"个学生的Oracle成绩:");
        oracle = input.nextInt();
        return  (java + sql + oracle) * 1.0 / 3;
    }

问题一:

  1. main()方法中的变量args,i,d1是在什么时候分配的内存?什么时候回收内存?
  2. getAvg()方法中的形参index,变量java,sql,oracle什么时候分配的内存?什么时候回收内存?
    什么是变量生命周期?
    答:变量的生命周期是指变量什么时候分配内存,什么时候回收内存。变量从分配内存到回收内存的时间段称为变量的生命周期。
  • 方法中的参数的生命周期:从方法调用开始到方法调用结束。
  • 方法内部变量的生命周期:当变量所在的代码块被运行时变量生命周期开始,当变量所在的代码块运行结束时,变量生命周期结束。

问题二:

  1. main()方法中的变量args,i,d1是在哪个代码块中可以被使用?
  2. getAvg()方法中的形参index,变量java,sql,oracle在哪个代码块中可以被使用?

什么是变量的作用域?
答:变量的作用域是指:变量的使用范围(代码块)

  • 变量的作用域是变量所在的包裹变量的,离变量最近的代码块
  • 方法形参的作用域是方法体
  • for循环的变量的作用域是for的循环体

总结

  • 方法定义:是遵循功能单一原则、完成特定功能的、相对独立的程序段。
  • 方法分类:系统方法、自定义方法。
  • 方法的使用:定义方法(方法命名、参数、返回值)、方法调用。
  • 作用域与生命周期
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容