方法

方法

1 方法的创建与调用

image-20220624094957594

方法的组成:

  1. 访问修饰符:修饰符是可选的,用来指明谁能调用,上例中的public表示公开的,谁都能调用此方法
  2. 返回值类型:方法可以返回一个值。如上面方法中的int约定里返回值必须是整数;在定义方法时如果不需要返回值可以使用关键字void。
  3. 方法名:就是方法(功能块)的名字。方法名和参数列表一起构成了方法签名(方法签名是一个功能块的唯一标识)。
  4. 参数列表:小括号里面代表参数,参数像一个占位符,第3行代码中的5传递给了第7行的a,在第7行到第9行之间,a的值就是5;参数列表是可选的,可以没有也可以有多个,多个的话中间用“,”隔开,没有可以不写
  5. 方法体:大括号里面就是方法体,就是我们要实现某个功能的代码。
  6. static:表示静态。

1.1 无参方法的定义与使用

​ 😀输入一个年份和月份,输出该月份的天数。

import java.util.Scanner;

public class Demo02 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入年份");
        int year = scanner.nextInt();
        System.out.println("请输入月份");
        int month = scanner.nextInt();
        switch (month){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                System.out.println("31天");
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                System.out.println("30天");
                break;
            case 2:
                if (year%4==0&&year%100!=0||year%400==0){
                    System.out.println("29天2");
                }else {
                    System.out.println("28天");
                }
                break;
            default:
                System.out.println("错误的月份");
                break;
        }
    }
}

image-20220624144310914

​ 😀定义一个方法,要求输入一个月份和月份,得到一个天数,此天数数据可以带回到main方法中

import java.util.Scanner;

public class Demo04 {
    public static void main(String[] args) {
        int f = getDay();
        System.out.println(f);

    }

    public static  int getDay(){
        int fate=0;//定义天数变量
        Scanner scanner = new Scanner(System.in);
        System.out.println("请输入年份");
        int year = scanner.nextInt();
        System.out.println("请输入月份");
        int month = scanner.nextInt();
        switch (month){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                fate=31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                fate=30;
                break;
            case 2:
                if (year%4==0&&year%100!=0||year%400==0){
                    fate=29;
                }else {
                    fate=28;
                }
                break;
            default:
                System.out.println("错误的月份");
        }
        return fate;
    }
}

image-20220624150058620

​ 👫从上面可以看到void换成了int,而且定义了一个int类型的变量来接收天数最后多了一句return大代码,这里需要强调一下,如果方法有返回值,那么方法的最后必须要有return语句,且return返回的数据类型和方法的返回类型必须保持一致

​ 👫而对于有参返回值无参数的方法调用,只需在main方法中定义一个返回值类型一致的变量来接收即可

1.2 有参方法的定义与使用

​ 😀要求输入三组这样的年份和月份,并计算它们所对应的天数

import java.util.Scanner;

public class Demo05 {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);

        System.out.println("请输入年份");
        int year = scanner.nextInt();
        System.out.println("请输入月份");
        int month = scanner.nextInt();
        int fate = getDay(year,month);
        System.out.println("天数为:"+fate);

        System.out.println("请输入年份");
        year = scanner.nextInt();
        System.out.println("请输入月份");
        month = scanner.nextInt();
        fate = getDay(year,month);
        System.out.println("天数为:"+fate);

        System.out.println("请输入年份");
        year = scanner.nextInt();
        System.out.println("请输入月份");
        month = scanner.nextInt();
        fate = getDay(year,month);
        System.out.println("天数为:"+fate);
    }

    public static int getDay(int year,int month){
        int fate=0;
        switch (month){
            case 1:
            case 3:
            case 5:
            case 7:
            case 8:
            case 10:
            case 12:
                fate=31;
                break;
            case 4:
            case 6:
            case 9:
            case 11:
                fate=30;
                break;
            case 2:
                if (year%4==0&&year%100!=0||year%400==0){
                    fate=29;
                }else {
                    fate=28;
                }
                break;
            default:
                System.out.println("错误的月份");
                break;
        }
        return fate;
    }



}

image-20220624153444310

😀产生随机数

public static void main(String[] args) {
    System.out.println(getRand(5,12));

}

public static int getRand(int min,int max){
    double d = Math.random();
    int x = (int)(d*100);
    x=x%(max-min+1)+min;
    return x;
}

image-20220624154435020

👫上边方法调用中getRand(5,12)中,5和12都是实际参数(简称实参),而方法定义中的min和max被称为形式参数(简称形参),此时实参5传递给min,12传递给max

2 变量作用域

​ 😀变量是有作用范围(Scope)的,也即作用域。一旦超出变量的作用域,就无法再使用这个变量。在程序中,变量一定会被定义在某一对大括号中,该大括号所包含的代码区便是这个变量的作用域。

2.1 成员变量

​ 😀在类体内定义的变量称为成员变量,它的作用域是整个类,也就是说在这个类中都可以访问到定义的这个成员变量。

public class Demo07 {
    static int i = 47; // 定义一个成员变量,作用域是整个类 Demo
    public static void main(String[] args) {
        System.out.println(i);
    }
}

2.2 局部变量

​ 在一个方法或方法内代码块中定义的变量称为局部变量,局部变量在方法或代码块被执行时创建,在方法或代码块结束时被销毁。局部变量在进行取值前必须被初始化,否则会编译错误。Java 存在块级作用域,在程序中任意大括号包装的代码中定义的变量,它的生命仅仅存在于程序运行
该代码块时。

public class Demo08 {
    public static void main(String[] args) { // main 方法参数列表定义的局部变量 args
        int sum = 0; // main 方法体内定义的局部变量 sum
        for(int i = 1; i < 5; i++){ // for 循环体内定义的局部变量 i
             sum += i;
        }
        System.out.println(sum);
    }
}

分析:

  1. 在上面案例中,就有 3 种定义局部变量的方式。在第 2 行,在静态方法 main 参数列表中定义的局部变量 args,它的作用范围就是整个 main 方法体:以第 2 行的左花括号“{”开始,以第 8 行的“} ”结束。
  2. 在第 3 行,在 main 方法体内,定义了局部变量 sum。它的作用范围从当前行(第 3 行)到以第 8
  3. 行的“}”为止。
  4. 在第 4 行,把局部变量 i 声明在 for 循环里,它的有效范围仅在 for 循环内(4~6 行),只要一离开这个循环,变量 i 便无法使用。
  5. 相对而言,变量 sum 的有效作用范围从第 3 行开始,到第 8 行结束,for 循环也属于变量 sum 的有效范围,因此 sum 在 for 循环内也是可用的。

2.3 局部变量在块作用域的应用

public class Demo09 {
    static int x = 10;

    public static void main(String[] args) {
        int outer = 1;
        { // 直接用{}来定义块
            int inner = 2;
            System.out.println("inner = " + inner);
            System.out.println("outer = " + outer);
        }
        int inner = 3;
        System.out.println("inner = " + inner);
        System.out.println("outer = " + outer);
        System.out.println("In class lecer, x = " + x);
    }
}

image-20220624161204820

👫块作用域除了用 for 等循环或方法体的左右大括号来界定外,还可以直接用大括号{}来定义“块”。

2.3变量块作用域嵌套

  1. 在 Java 中,在方法内定义的变量,其作用范围(包括方法的参数)是从它定义的地方开始,到它所作用范围终结的位置处结束。
  2. 如在方法的开始处定义了一个变量 i,那么直到该方法结束处,都不能再定义另一个同名变量 i。再如,如果在一个 for 循环体中定义了变量 i,那么在这个 for 循环内不能再有同名变量,但出了 for循环之后,是可以再次定义的。这就是作用域不能嵌套的意思。
  3. 在 Java 中,类与方法之间作用域是可以嵌套的,可以把整个类看做一个大的作用域,它定义的字段(或称数据成员)可被方法中的同名字段所覆盖。
public class Demo10 {
    static int x = 10;
    public static void main(String[] args) {
        int x = 20;
        System.out.println(x); // 局部变量覆盖成员变量
    }

}

image-20220624161714850

posted @ 2022-06-24 16:28  茶煮清凉  阅读(50)  评论(0)    收藏  举报