java--方法(含debug调试)

1. 方法简介

1.1 概述

  • 方法(method),也叫函数,是可以完成某些特定功能的代码块.
    • 例如: 现实生活中, 拿牙刷, 挤牙膏, 刷上排牙, 刷下排牙, 漱口, 这些单独的动作合起来, 就完成了刷牙的动作.
    • 又例如: 让我们获取数组10和20的最大值, 我们可以通过if语句或者三元运算符实现, 如果再让我们获取22和11之间的最大值, 我们还需要把刚才的逻辑代码在写一次. 这样做很繁琐. 针对于这种情况, 我们就可以把获取两个整数最大值的逻辑代码封装到方法中, 当我们需要比较的时候,直接调用方法就可以了. 这样做, 非常方便.

1.2 定义格式

修饰符 返回值的数据类型 方法名(参数类型 参数名1, 参数类型 参数名2....) { //这里可以写多个参数
    //方法体;
    return 具体的返回值;  //加工好的饲料
}

public static void main(String[] args) {
   
}

1.3 格式解释

  • 修饰符: 目前记住这里是固定格式public static,后面会详细了解
  • 返回值的数据类型: 用于限定返回值的数据类型的.
  • 注意:
    • 返回值的数据类型是int类型, 则说明该方法只能返回int类型的整数.
    • 如果方法没有具体的返回值, 则返回值的数据类型要用void来修饰.
  • 方法名: 方便我们调用方法.
  • 参数类型: 用于限定调用方法时传入的数据的数据类型.
    • 例如: 参数类型是String类型, 说明我们调用方法时, 只能传入字符串.
  • 参数名: 用于接收调用方法时传入的数据的变量.
  • 方法体: 完成特定功能的代码.
  • return 返回值: 用来结束方法的, 并把返回值返回给调用者.
    • 解释: 如果方法没有明确的返回值, 则return关键字可以省略不写.

1.4 注意事项

  • 方法与方法之间是平级关系, 不能嵌套定义.
  • 方法必须先创建才可以使用, 该过程称为: 方法定义.
  • 方法自身不会直接运行, 而是需要我们手动调用方法后, 它才会执行, 该过程称为方法调用.
  • 方法的功能越单一越好.
  • 定义方法的时候写在参数列表中的参数, 都是: 形参.
    • 形参: 形容调用方法的时候, 需要传入什么类型的参数.
  • 调用方法的时候, 传入的具体的值(变量或者常量都可以), 叫实参.
    • 参: 调用方法时, 实际参与运算的数据.

1.5 方法的好处

  • 可以提高代码的复用性, 方便我们维护程序.
    • 即: 当一些代码被反复使用时,可以把它们提取出来,放到一个方法里,以方法的形式来使用这些代码。

2. 无参无返回值的方法

2.1 定义无参无返回值的方法

  • 定义方法时, 要做到三个明确, 这样定义方法就会变得非常简单了:
    • 明确方法名, 即: 方法名要符合小驼峰命名法, 且要见名知意, 方便我们调用.
    • 明确方法的参数列表. 即: 调用方法时, 我们需要给它(方法)什么数据.
    • 明确方法的返回值类型, 即: 调用方法完毕后, 方法会返回给我们一个什么类型的数据.
  • 具体格式
public static void 方法名() {
    //方法体;
}
需求定义printHello()方法, 用来打印"Hello World!"字符串.
  • 参考代码
public static void printHello() {
    System.out.println("Hello World!);
}

2.2 调用无参无返回值的方法

  • 格式
    • 方法名();
      • 解释: 通过方法名();的形式, 可以直接根据方法名调用指定的方法.

2.3 方法调用图解

在这里插入图片描述

2.4 示例一: 打印10次HelloWorld

  • 需求
    • 定义方法printHelloWorld(), 打印10次HelloWorld!.
  • 参考代码

2.5 示例二: 打印奇偶数

  • 需求
    • 定义方法isEvenNumber(), 在方法内部有一个int类型的变量num.
    • 判断该变量值是否是偶数, 并打印具体的结果.
  • 参考代码
    • 略.

3. 有参无返回值的方法

  • 有参无返回值的方法的意思是: 调用方法时, 我们需要传入具体的参数, 但是方法执行完毕后, 并不会给我们返回具体的结果.
  • 具体定义格式
public static void 方法名(参数类型 参数名1, 参数类型 参数名2) {  //这里可以写多个参数
    //方法体;
}
  • 具体调用格式
方法名(参数值1, 参数值2);    //注意: 参数的个数, 以及对应的参数类型都要和定义方法的参数列表保持一致. 

3.1 示例一: 定义求和方法

  • 需求
    • 定义方法getSum(), 接收两个int类型的整数.
    • 在方法内部获取上述两个整数的和, 并直接打印.
  • 参考代码
    • 略.
  • 图解略.

3.2 示例二: 判断奇偶数

  • 需求
    • 定义方法isEvenNumber(), 该方法接收一个int类型的整数num.
    • 判断num是奇数还是偶数, 并打印结果.
  • 参考代码
    • 略.

3.3 实例三: 获取最大值

  • 需求
    • 定义方法getMax(), 该方法接收两个整数.
    • 通过该方法, 获取两个整数的最大值, 并打印.
  • 参考代码
    • 略.

4. 无参有返回值的方法

  • 无参有返回值的方法的意思是: 调用方法时, 我们不需要传入具体的参数, 但是方法执行完毕后, 会给我们返回具体的结果.
  • 具体定义格式
public static 返回值的数据类型 方法名() {
    //方法体;
    return 具体的返回值;
}
  • 具体调用格式
//直接调用, 无意义. 
方法名();

//输出调用
System.out.println(方法名());

//赋值调用,  实际开发中推荐使用.
数据类型 变量名 = 方法名();

4.1 示例一: 定义求和方法

  • 需求
    • 定义方法getSum(), 该方法内部有两个int类型的整数.
    • 获取上述两个整数的和, 并返回.
    • 在main方法中调用getSum()方法, 并打印结果.
  • 参考代码
    • 略.
  • 图解略.

4.2 示例二: 判断奇偶数

  • 需求
    • 定义方法isEvenNumber(), 该方法内部有一个整数num.
    • 判断num是奇数还是偶数, 并返回结果.
    • 在main方法中调用isEvenNumber()方法, 并打印结果.
  • 参考代码
    • 略.

4.3 实例三: 获取最小值

  • 需求
    • 定义方法getMin(), 该方法内部有两个整数.
    • 通过该方法, 获取两个整数的最小值, 并返回.
    • 在main方法中调用getMin()方法, 获取最小值并打印.
  • 参考代码
    • 略.

5. 有参有返回值的方法

  • 有参有返回值的方法的意思是: 调用方法时, 我们不仅需要传入具体的参数, 方法执行完毕后, 还会给我们返回具体的结果.
  • 具体定义格式
    • 下述这个格式就是方法的通用格式.
public static 返回值的数据类型 方法名(参数类型 参数1, 参数类型 参数2) {
    //方法体;
    return 具体的返回值;
}
  • 具体调用格式
//直接调用
方法名(参数值1, 参数值2);    //参数的个数, 及对应参数的类型要和定义方法时的参数列表保持一致.

//输出调用
System.out.println(方法名(参数值1, 参数值2));

//赋值调用
数据类型 变量名 = 方法名(参数值1, 参数值2);

5.1 示例一: 定义求和方法

  • 需求
    • 定义方法getSum(), 接收两个int类型的整数.
    • 获取上述两个整数的和, 并返回.
    • 在main方法中调用getSum()方法, 并打印结果.
  • 参考代码
    • 略.
  • 图解略.

5.2 示例二: 判断奇偶数

  • 需求
    • 定义方法isEvenNumber(), 该方法接收一个int类型的整数num.
    • 判断num是奇数还是偶数, 并返回结果.
    • 在main方法中调用isEvenNumber()方法, 并打印结果.
  • 参考代码
    • 略.

5.3 实例三: 获取最大值

  • 需求
    • 定义方法getMax(), 该方法接收两个整数.
    • 通过该方法, 获取两个整数的最大值, 并返回.
    • 在main方法中调用getMax()方法, 获取最大值并打印.
参数列表:
    int a,int b
返回值类型:
    int
  • 参考代码

5.3 思考题

  • 方法与方法之间可以嵌套定义吗?
  • 方法没有具体的返回值时, 返回值的数据类型可以不写吗?
  • 方法体中的return关键字可以省略吗?

6. 练习题

6.1 示例一: 打印偶数

  • 需求
    • 提示用户录入一个3~100之间的整数并接收.
    • 打印1到该整数之间, 所有的偶数, 并按照3个一行的形式进行输出.
  • 参考代码

6.2 案例二: 打印字符

  • 需求
    • 有定义一个方法,可以接受一个整数,
    • 如果为[90,100]这个范围方法返回’A’
    • 如果为[80,90)这个范围方法返回’B’
    • 如果为[70,80)这个范围方法返回’C’
    • 如果为[60,70)这个范围方法返回’D’
    • 如果为[0,60)这个范围方法返回’E’
    • 整数不在以上范围的返回’F’
  • 参考代码

6.3 案例三: 遍历数组

  • 需求
    • 定义方法printArray(), 接收一个int类型的数组.
    • 通过该方法, 实现遍历数组的功能.
    • 在main方法中, 调用方法, 打印指定的数组.
  • 参考代码

6.4 案例四: 获取数组最值

  • 需求
    • 定义方法printArray(), 接收一个int类型的数组.
    • 通过该方法, 获取数组元素中的最大值.
    • 在main方法中, 调用方法, 打印对应的结果.
  • 参考代码

6.5 案例五: 模拟计算器

  • 需求
    • 定义方法, 接收两个int类型的整数.
    • 分别获取这两个整数的加减乘除的运算结果, 然后返回.
    • 在main方法中调用该方法, 并打印结果.
  • 参考代码

7.方法参数深入研究

  • 概述:
    • 我们刚刚接触过方法,知道方法如果没有调用是不会执行的, 我们调用方法就需要对方法的形式参数进行赋值, 那么形式参数是基本数据类型引用数据类型, 在传递的时候需要额外注意

7.1. 方法的参数是基本数据类型

  • 特点: 如果方法的参数是基本数据类型, 我们在调用方法是需要传入基本类型对应的值, 形参的改变不影响实参
  • 例如:
    • 已知int a = 10; int b = 20, 请定义方法,方法接受两个int类型的整数, 将两个整数置换
  • 参考代码:
public class ArgsDemo {
    public static void main(String[] args) {
        // 定义变量
        int a = 10;
        int b = 20;
        System.out.println("a:" + a + ",b:" + b);
        change(a, b);
        System.out.println("a:" + a + ",b:" + b);

    }
    public static void change(int a, int b) {
        System.out.println("change方法开始了");
        System.out.println("a:" + a + ",b:" + b);
        int c=a;
        a = b;
        b = c;
        System.out.println("a:" + a + ",b:" + b);
        System.out.println("change方法结束了");
    }
}
  • 思考:
    • main方法中的两条输出语句分别输出什么?
  • why:
    • main方法中有变量a和b,在main方法中使用a和b使用的是main中的a,b
    • main方法中调用change方法将a和b传递过去,变量参与运算是将其值参与运算,所以我们传递过去的是10和20
    • change方法中的形式参数int a,int b,其实是change方法中的局部变量,接受了10和20,然后方法中操作的是change方法中的a和b,和main方法中的a和b没关系
  • 特点:
    • 如果方法的参数是引用数据类型, 我们在调用方法是需要传入引入类型对应的地址值,形参的改变影响实参
  • 例如:
    • 请定义方法, 能够实现将数组中所有偶数元素变成以前的2倍
  • 参考代码:
public class ArgsDemo2 {
    public static void main(String[] args) {
        int[] arr = { 1, 2, 3, 4, 5 };
        for (int x = 0; x < arr.length; x++) {
            System.out.println(arr[x]);//1,2,3,4,5
        }
        change(arr);
        for (int x = 0; x < arr.length; x++) {
            System.out.println(arr[x]);//1,4,3,8,5
        }
    }
    public static void change(int[] arr) {
        for (int x = 0; x < arr.length; x++) {
            //如果数组元素是偶数,值就变成了以前的2倍
            if (arr[x] % 2 == 0) {
                arr[x] *= 2;
            }
        }
    }
}
  • 思考:
    • main方法中第二次输出数组, 数组的内容是否改变?
  • 图解:
    在这里插入图片描述

8. 方法重载

8.1 概述

  • 同一个类中, 出现方法名相同, 但是参数列表不同的两个或以上的方法时称为方法重载. 方法重载与方法的返回值的数据类型无关.
  • 注意: 参数列表不同分为两种情况
    • 参数的个数不同.
    • 对应参数的数据类型不同.

8.2 示例代码

  • 正确示例
public class MethodDemo01 {
    public static void fn(int a) {      //function
        //方法体
    }
    public static int fn(double a) {
        //方法体
    }
}
public class MethodDemo02 {
    public static float fn(int a) {
        //方法体
    }
    public static int fn(int a , int b) {
        //方法体
    }
}
  • 错误示例
public class MethodDemo01 {
    public static void fn(int a) {
        //方法体
    }
    public static int fn(int a) {   //错误原因: 参数列表相同.
        //方法体
    }
}
public class MethodDemo02 {
    public static void fn(int a) {
        //方法体
    }
} 


public class MethodDemo03 {
    public static int fn(double a) { //错误原因:这是两个类的两个fn方法
        //方法体
    }
}

8.3 案例: 判断数据是否相等

  • 需求
    • 定义方法compare(), 用来比较两个整型数据是否相等.
    • 要求兼容所有的整数类型, 即(byte, short, int, long)
  • 参考代码
public class MethodDemo01 {
    public static void main(String[] args) {
        //定义不同数据类型的变量
        byte a = 10;
        byte b = 20;
        short c = 10;
        short d = 20;
        int e = 10;
        int f = 10;
        long g = 10;
        long h = 20;
        // 调用
        System.out.println(compare(a, b));
        System.out.println(compare(c, d));
        System.out.println(compare(e, f));
        System.out.println(compare(g, h));
    }

    // 两个byte类型的
    public static boolean compare(byte a, byte b) {
        System.out.println("byte");
        return a == b;
    }

    // 两个short类型的
    public static boolean compare(short a, short b) {
        System.out.println("short");
        return a == b;
    }

    // 两个int类型的
    public static boolean compare(int a, int b) {
        System.out.println("int");
        return a == b;
    }

    // 两个long类型的
    public static boolean compare(long a, long b) {
        System.out.println("long");
        return a == b;
    }
}

8.4 思考题

  • 判断下述哪些方法是重载关系.
public static void open(){}
public static void open(int a){}
static void open(int a,int b){}
public static void open(double a,int b){}
public static void open(int a,double b){}
public void open(int i,double d){}
public static void OPEN(){}
public static void open(int i,int j){}

再来回顾一下重载的定义,相信能加深你的印象~

  • 同一个类中, 出现方法名相同, 但是参数列表不同的两个或以上的方法时称为方法重载. 方法重载与方法的返回值的数据类型无关.
  • 注意: 参数列表不同分为两种情况
    • 参数的个数不同.
    • 对应参数的数据类型不同.

9. Debug调试

9.1 概述

  • Debug是供程序员使用的程序调试工具,它可以用于查看程序的执行流程,也可以用于追踪程序执行过程来调试程序
  • Debug调试窗口介绍

9.2 示例

  • 需求
    • 定义getSum()方法, 用来获取两个整数和.
    • 在main方法中调用getSum()方法.
  • 参考代码
public class MethodDemo05 {
    public static void main(String[] args) {
        int a = 10;
        int b = 20;
        int sum = getSum(a, b);
        System.out.println("sum: " + sum);
    }

    public static int getSum(int a, int b) {
        int sum = a + b;
        return sum;
    }
}

9.3 步骤

  • 加断点. 哪里不会点哪里.
    • 即: 选择要设置断点的代码行,在行号的区域后面单击鼠标左键即可
  • 运行加了断点的程序, 就可以开始进行Debug调试了.
    • 即:在代码区域右键, 然后选择Debug开始执行.
  • 开始调试时, 看哪里呢?
    • Debugger窗口: 看代码执行到了哪里.
    • Console窗口: 看程序执行过程中的结果展示(就是控制台).
    • Variables窗口: 看代码执行过程中, 变量的变化.
  • 如何进行下一步呢?
    • F7: 逐过程调试.
    • F8: 逐行调试.
    • F9: 逐断点调试.
  • 如何删除断点?
    • 选择要删除的断点,单击鼠标左键即可
    • 如果是多个断点,可以每一个再点击一次。也可以一次性全部删除.
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值