1、方法是什么?

方法:是一种语法结构,它可以把一段代码封装成一个功能,以方便重复调用。
目标:能够说出使用方法的优点:
    1、提高了代码的复用性。
    2、让程序的逻辑更清晰。

 代码示例:定义一个求和方法sum

public static void main(String[] args) {
        // 张工
        int c1 = sum (10,30);
        System.out.println(c1);

        // 徐工
        int c2 = sum(10,50);
        System.out.println(c2);
    }

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

2、方法定义的完整格式:

方法的声明 注意:方法必须先声明在调用
方法声明的(必要)要素:

方法调用栈

调用方法

1、有返回值的方法

2、无返回值的方法

3、调用方法时出现异常(出错)

一个完整的方法签名(声明)

六部分组成

1、访问修饰符:设置方法访问权限

public:公共的(大家都可以访问的)

private:私有的(只有自己能访问)

protected:受保护的(子类和同包能访问)

不写(default):默认的(同包的可以访问)

2、可选修饰符(可有可无)

static静态的(全局的)

final最终的:表示该方法不能被重写

abstract(抽象):表示该方法是一个抽象的方法

静态方法不能调用非静态方法。

静态方法中使用非static方法,必须创建类的实例对象的

3、返回的数据类型:

方法的返回值(),没有返回使用void表示

4、方法名

方便调用。方法名必须在返回类型的后面。见名知意

5、形式参数列表。

在方法名的后面必须是用一对括号括起来的形式参数列表

6、抛出的异常列表

当调用该方法时,可能会发生一个异常(错误)给方法的调用者。

比如,定义一个除法时,如果分母为0,调用该除法时就会出现异常。(ArithmeticException)

 栈

  • 暂时存放货物的地方或者旅客暂时休息的地方
  • 计算机引入栈:表示临时存放数据的地方,它是一种单向的数据存储结构。
  • 把数据存入栈中,叫入栈(压栈)
  • 从栈中删除数据,叫出栈(弹栈)
  • 栈特点:先进后出,后进先出
  • 英文简写FILO(first in last out)先进后出

修饰符 返回值类型 方法名 (形参列表){

需要执行的功能代码)

return

}

 示例:使用方法对两个整数求和并返回

public static void main(String[] args) {
        int rs = add(100,200);
        System.out.println("和是:" + rs);

        System.out.println("--------------------");
        int rs1 = add(400,800);
        System.out.println("和是:" + rs1);
    }

    public static int add(int a , int b){
        int c = a + b;
        return c;
    }

方法格式的注意点:

  • 方法的修饰符,暂时都使用public static修饰。
  • 方法神明了具体的返回值类型,内部必须使用return返回对应类型的数据。
  • 形参列表可以有多个,甚至可以没有;如果有多个形参必须用" , "隔开,且不能给初始化值。

3、方法的其他写法 (无参数无返回值的方法)

方法定义时:返回值类型、形参列表可以按照需求进行填写

修饰符 返回值类型 方法名 (形参列表){

需要执行的功能代码)

return

}

无返回值类型,即返回值类型为void

 示例:打印三遍HelloWord

public static void main(String[] args) {
        //目标:学会方法定义的其他形式,并理解其流程
        print();
        System.out.println("------------------" );
        print();
    }

    /**
     无参数无返回值的方法
     */
    public static void print(){
        for (int i = 0 ; i < 3 ; i ++) {
            System.out.println("Hello World");
        }
    }

注意:

  • 如果方法不需要返回结果,返回值类型必须申明成void(无返回值),此时方法内部不可以使用return返回数据。
  • 方法如果没有参数,或者返回值类型申明为void可以称为无参数、无返回值的方法,依次类推。

4、方法的常见问题

  • 方法的编写顺序无所谓。
  • 方法与方法之间是平级关系,不能嵌套定义。
  • 方法的返回值类型为void(无返回值),方法内则不能使用return返回数据,如果方法的返回值类型。
  • 写了具体类型,方法内部则必须使用return返回对应类型的数据。
  • return语句下面,不能编写代码,因为永远执行不到,属于无效的代码。
  • 方法不调用就不执行,调用时必须严格匹配方法的参数情况。
  • 有返回值的方法调用时可以选择定义变量接收结果,或者直接输出调用,甚至直接调用;无返回值方法的调用只能直接调用一下。

 5、方法的案例

1、需求:定义一个方法,方法中计算出1-n的和并返回。

public static void main(String[] args) { // 需求:定义一个方法,方法中计算出1-n的和并返回。 System.out.println("1-5的和是:" + sum(5)); System.out.println("-----------------------------"); System.out.println("1-100的和是:" + sum(100)); } public static int sum(int n ){ int sum = 0 ; for (int i = 1; i <= n ; i++) { sum += i; } return sum; }

2、需求:判断一个整数是奇数还是偶数,并进行结果的输出,使用方法完成。 拿一个整数,然后调用方法,把整数交给方法,在方法中输出该数是奇数还是偶数。

public static void main(String[] args) { //需求:判断一个整数是奇数还是偶数,并进行结果的输出,使用方法完成。 // 拿一个整数,然后调用方法,把整数交给方法,在方法中输出该数是奇数还是偶数 check(11); System.out.println("-----------------"); check(200); } public static void check(int number){ if (number % 2 == 0){ System.out.println(number + "是偶数"); }else{ System.out.println(number + "是奇数"); } }

3、需求:把找出数组的最大值案例,改造成方法,可以支持返回任意整型数组的最大值数据。

public static void main(String[] args) { //需求:把找出数组的最大值案例,改造成方法,可以支持返回任意整型数组的最大值数据。 int [] ages = {23 , 19 , 25 , 78 , 34}; int max = getArrayMaxData(ages); System.out.println("最大值数据是:" + max); } public static int getArrayMaxData(int [] arr){ // 找出数组的最大值返回 int max = arr [0]; //遍历数组的每个元素与最大值数据进行比较,若较大,则替换 for (int i = 1; i < arr.length; i++) { if (arr[i] > max ){ max = arr [i] ; } } return max ; }

4、写一个函数,接受一个整数,返回这个整数是几位数

public static void main(String[] args) { int number = 50000; System.out.println(number + ":这是一个" + place(number) + "位数"); } //3、写一个函数,接受一个整数,返回这个整数是几位数 public static int place (int num){ int place = 0; while (true){ num /= 10; place += 1; if (num == 0){ break; } } return place; }

5、写一个函数,判断一个整数是否是质数

public static void main(String[] args) { //4、 judgeNum(50);//判断50是否是质数 judgeNum(3);//判断3是否是质数 } //4、写一个函数,判断一个整数是否是质数 public static void judgeNum (int num){ //定义一个临时变量 int temp = 0; for (int i = 2; i <= num / 2; i++) { //判断这个数能否整除i的值 if (num%i ==0){ //能整除,则说明是质数,临时变量加1. temp ++; break; } } if (temp == 0 && num>1){ System.out.println(num + "这个数是质数"); }else{ System.out.println(num + "这个数不是质数"); } }

6、方法的调用流程

  • 方法没有被调用的时候,在方法区中的字节码文件里存放
  • 方法被调用的时候,需要进入到栈内存里运行

 7、方法的参数

参数的类型:

形式参数:

方法声明(定义)的时候,就是形式参数

实际参数:

在调用的时候,实际传入的值,就是实际参数

Java中只能进行值传递。

即使传入的是引用类型数据,其实也传入的该引用的数据的内存地址,也称为值传递。

方法的参数传递机制:

  • 基本类型的参数传递

        理解java的基本类型的参数传递:值传递:在传输实参给方法的形参的时候,并不是传输实参变量本身,而是传输实参变量中存储的值。实参:如在方法内部定义的变量; 形参:如在定义方法时,“()”中所声明的参数。

  • 引用类型的参数传递

        理解引用类型的参数传递机制: 值传递,区分其不同点

  • 基本类型和引用类型的参数在传递时候有什么不同?

        1、都是值传递。
        2、基本类型的参数传输存储的数据值。
        3、引用类型的参数传输存储的地址值。

 8、方法的参数传递机制(引用类型)案例:

1、打印任意整型数组的内容

public static void main(String[] args) {
        // 需求:打印任意整型数组的内容
        int[] ages = {10, 20, 30, 40};
        printArray(ages);

        System.out.println("-----------------");
        int[] number = {1, 2, 3, 9, 10};
        printArray(number);

        System.out.println("-----------------");
        int[] number1 = null;
        printArray(number1);
    }
    public static void printArray(int [] arr){
        System.out.print("[");

        if (arr != null && arr.length >0){
            for (int i = 0; i < arr.length; i++) {
//            if (i == arr.length - 1){
//                System.out.print(arr[i] );
//            }else{
//                System.out.print(arr[i] + ", ");
//            }
                System.out.print(i == arr.length - 1 ? arr[i] : arr[i] + ", ");//三元运算符
            }
        }

        System.out.println("]");
    }

2、设计一个方法可以接收整型数组,和要查询的元素值;最终返回元素在该数组中的索引,如果数组中不存在该元素则返回-1。

public static void main(String[] args) {
        //需求:设计一个方法可以接收整型数组,和要查询的元素值;最终返回元素在该数组中的
        // 索引,如果数组中不存在该元素则返回-1.
        //定义数组,调用方法
        int[] arr = {11, 22, 33, 66, 87, 19};
        int index = searchIndex(arr,87);
        System.out.println("您查询的数据的索引是: " + index);
    }

/**
 1、定义一个方法:参数接收数组,要查询的数据,返回值:整型
 */
    public static int searchIndex(int [] arr , int data ){
        //开始找出这个数据的索引
        for (int i = 0; i < arr.length; i++) {
            if (arr[i] == data){
                return i;
                }
            }
            return - 1 ;// 代表查无此元素。
        }

3、如果两个数组的类型,元素个数,元素顺序和内容是一样的我们就认为这2个数组是一模一样的。使用方法完成:能够判断任意两个整型数组是否一样,并返回true或false。

public static void main(String[] args) {
        //需求:如果两个数组的类型,元素个数,元素顺序和内容是一样的我们就认为这2个数组是一模一样的。
        //使用方法完成:能够判断任意两个整型数组是否一样,并返回true或false。
        int[]arr1 = {10,120,30};
        int[]arr2 = {10,20,30};
        System.out.println(campare(arr1, arr2));

    }
    
    
    //1、定义方法,接收2个整型数组,--》是否需要参数、返回值类型:布尔类型
    public static  boolean campare(int[]arr1,int[]arr2){
        //2、判断两个数组的内容是一样的呢
        if (arr1.length == arr2.length){
            for (int i = 0; i < arr1.length; i++) {
                if (arr1[i] != arr2[i]){
                    return false ;
                }
            }
            return true; // 是一样的!
        }else{
            return false;
        }
    }

9、方法重载

  • 方法重载:同一个类中,多个方法的名称相同,形参列表不同。
  • 方法重载的前提是:在同一个类里,并且方法的名字一样。
    在同一个类中。方法名必须相同,但是参数列表不同(参数的个数不同、参数的数据类型不同、参数的顺序不同(指的是参数的数据类型的顺序))
  • 方法重载的好处:对于相似功能的业务场景:可读性好,方法名称相同提示是同一类型的功能,通过形参不同实现功能差异化的选择。
  • 案例1:
public class Test1 {
    /*
    定义类 Test1,类中定义 main方法,定义int类型a为10, b为10.
main方法中,调用printNum方法,传入a,b
main方法中,调用doubling方法,传入a,b
main方法中,调用printNum方法,传入a,b
main方法中,调用doubling方法,传入a,用a接收返回值
main方法中,调用doubling方法,传入b,用b接收返回值
main方法中,调用printNum方法,传入a,b
     */

    public static void main(String[] args) {
        int a = 10;
        int b = 10;
        printNum(a,b);
        System.out.println("------------");
        doubling(a,b);
        System.out.println("------------");
        printNum(a,b);
        System.out.println("------------");
        a = doubling(a);
        System.out.println(a);
        System.out.println("------------");
        b = doubling(b);
        System.out.println(b);
        System.out.println("------------");
        printNum(a,b);
    }

    /*
    定义printNum方法,参数为(int iVar, int iVar2),返回值无,输出iVar和iVar2的值
     */
    public static void printNum (int iVar,int iVar2){
        System.out.println(iVar);
        System.out.println(iVar2);
    }
    /*
    定义doubling方法,参数为(int r, int p),返回值无,方法内r翻倍,p翻倍,并调用printNum方法,输出r和p的值
     */
    public static void doubling (int r,int p){
        r *= 2;
        p *= 2;
        printNum(r,p);
    }
    /*
    定义doubling方法,参数为(int r),返回值int, 方法内r翻倍,返回r.
     */
    public static int doubling (int r){
        r *= 2;
        return r;
    }
}
  • 案例2:
public static void main(String[] args) {
        fire();
        fire("岛国");
        fire("岛国",100);
    }

    public static void fire(){
        fire("米国");
    }

    public static void fire(String location){
        fire(location,1);
    }

    public static void fire(String location ,int number){
        System.out.println("默认发射" + number + "枚武器给" + location + "----");
    }
  • 方法重载的识别方法:

        同一个类中,多个方法的名称相同,形参列表不同,其他无所谓。

        形参列表的不同指的是:形参的个数、类型、顺序不同。不关心形参的名称。

// 新方法
    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(){}

如果调用方法时的实参,同时满足多个重载方法,会优先调用类型更小的重载方法

10、补充知识:单独使用return关键字

return关键字单独使用:可以立即跳出并结束当前方法的执行;return关键字单独使用可以放在任何方法里。

示例:如果写一个除的方法,我们如果输入的分母为0,方法会出现bug!所以应该先判断分母是否等于0,如果等于0,就可以使用return直接结束当前的除的方法了。代码如下:

public static void main(String[] args) {
        // 目标:明确return关键字的作用。
        System.out.println("main开始。。");
        chu(10,0);
        System.out.println("main结束。。");
    }


    public static void chu(int a ,int b){
        if (b == 0){
            System.out.println("您输入的数据有问题,除数不能是0!!");
            return;// 立即跳出当前方法并结束当前方法执行。然后还能执行下面的a/b。
        }
        //如果b等于0,a除b会出现bug。所以必须加一层判断b是否等于0。
        int c = a / b;
        System.out.println("结果是:" + c);
    }

一dian小知识:

gui的界面来获取输入的值

把字符串变成整型

代码实现:

//gui的界面来获取输入的值
        String numString = JOptionPane.showInputDialog("请输入一个整数:");
        System.out.println(numString);
        //把字符串变成整型
        int num = Integer.parseInt(numString);
        System.out.println(111==num);