Skip to content

day_06:方法 ​

一、什么是方法? ​

  1. 方法(method)是程序中最小的执行单元。
  2. 重复的代码、具有独立功能的代码可以抽取到方法中。

二、方法的定义与调用 ​

  • 定义:把一些代码打包在一起,该过程称为方法定义。

  • 调用:方法定义后并不是直接运行的,需要手动调用才能执行,该过程称为方法调用。

1. 最简单的方法定义与调用 ​

定义: ​

java
public static void 方法名() {
	方法体(就是打包起来的代码);
}

调用: ​

java
方法名();

注意

方法必须先定义后调用,否则程序将报错。

2. 带参数的方法定义与调用 ​

定义: ​

java
public static void 方法名(参数1,参数2, ......) {
	方法体(就是打包起来的代码);
}

调用: ​

java
方法名(参数1,参数2, ......);

形参与实参: ​

  • 形参:全称形式参数,是指方法定义中的参数。
  • 实参:全称实际参数,方法调用中的参数。

注意

方法调用时,形参和实参必须一一对应,否则程序将报错。

3. 带返回值的方法定义与调用 ​

定义: ​

java
public static 返回值类型 方法名(参数) {
    方法体;
	return 返回值;
}

调用: ​

  • 直接调用:

    java
    方法名(实参);
  • 赋值调用:

    java
    整数类型 变量名=方法名(实参);
  • 输出调用:

    java
    System.out.println(方法名(实参));

返回值: ​

方法的返回值其实就是方法运行的最终结果。

注意事项

  • 方法不调用就不执行;
  • 方法与方法之间是平级关系,不能互相嵌套定义;
  • 方法的编写顺序和执行顺序无关;
  • 方法的返回值类型为void,表示该方法没有返回值,没有返回值的方法可以省略return语句不写,如果要编写return,后面不能跟具体的数据;
  • return语句下面,不能编写代码,因为永远执行不到,属于无效的代码。

三、方法的重载 ​

1. 重载: ​

在同一个类中,定义了多个同名的方法,这些同名的方法具有同种的功能,每个方法具有不同的参数类型或参数个数,这些同名的方法,就构成了重载关系,与返回值无关。

顺序不同可以构成重载,但是不建议!

2. return break关键字的区别: ​

  • return:其实跟循环没有什么关系,跟方法有关的,表示1结束方法2返回结果如果方法执行到了return,那么整个方法全部结束,里面的循环也会随之结束了;
  • break:其实跟方法没有什么关系,结束循环或者switch的。

四、方法的内存 ​

1. 方法调用的基本内存原理 ​

先进后出

2. 方法传递的内存原理 ​

基本数据类型: ​

  • 数据值是存储在自己的空间中;
  • 赋值给其他变量,也是赋的真实的值。

引用数据类型: ​

  • 数据值是存储在其他空间中,自己空间中存储的是地址值;
  • 赋值给其他变量,赋的地址值。

3. 方法的值传递 ​

  • 传递基本数据类型时,传递的是真实的数据,形参的改变,不影响实际参数的值;

  • 传递引用数据类型时,传递的是地址值,形参的改变,影响实际参数的值。

附:练习题 ​

  1. 键盘录入一个正整数,定义一个方法,该方法的功能是计算该数字是几位数字,并将位数返回,在main方法中打印该数字是几位数。

    java
    static void main(String[] args) {
        //创建键盘录入对象
        Scanner sc = new Scanner(System.in);
    
        //键盘录入一个整数
        System.out.println("请输入一个整数:");
        int num = sc.nextInt();
    
        //输出结果
        System.out.println(getNumberDigits(num));
    }
    
    //定义方法
    public static int getNumberDigits(int num) {
        //定义变量记录位数
        int count = 0;
    
        //while循环除10,直到为零
        while (num != 0) {
            //num除10并再赋值给num
            num /= 10;
    
            //位数自增
            count++;
        }
        //返回数字位数
        return count;
    }
  2. 一个大V直播抽奖,奖品是现金红包,分别有{2,588,888,1000,10000}五个奖金,请使用代码模拟抽奖,打印出每个奖项,奖项的出现顺序要随机且不重复。

    java
    static void main(String[] args) {
        //定义奖金数组
        int[] arrBonus = {2, 588, 888, 1000, 10000};
    
        //定义以抽奖金数组
        int[] arrBonusExist = new int[arrBonus.length];
    
        //遍历数组
        for (int i = 0; i < arrBonusExist.length; i++) {
            //调用方法获取随机索引
            int randomIndex = getRandomIndex(arrBonus, arrBonusExist);
    
            //打印抽奖结果
            System.out.println(arrBonus[randomIndex] + "元的奖金被抽出");
    
            //将以抽取的奖金放入以抽取数组中
            arrBonusExist[i] = arrBonus[randomIndex];
        }
    }
    
    //定义方法判断某数组中是否存在某数
    public static boolean getNumExist(int[] arr, int num) {
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == num) {
                return true;
            }
        }
        return false;
    }
    
    //定义方法生成随机索引并判断是否被抽取
    public static int getRandomIndex(int[] arrBonus, int[] arrBonusExist) {
        //创建随机数对象
        Random r = new Random();
    
        //生成随机索引
        int randomIndex = r.nextInt(0, arrBonus.length);
    
        //调用方法判断是否已被抽取
        boolean result = getNumExist(arrBonusExist, arrBonus[randomIndex]);
    
        //若被抽取则再次随机生成索引,直至未抽取
        while (result) {
            //生成随机索引
            randomIndex = r.nextInt(0, arrBonus.length);
    
            //判断是否已被抽取
            result = getNumExist(arrBonusExist, arrBonus[randomIndex]);
        }
    
        //返回随机索引
        return randomIndex;
    }