方法概述

方法是具有特定功能的代码集合,由于我们是把重复的代码写到方法当中,以后要用直接调用方法即可,不需要再写一遍了。代码相当于只写了一遍。所以以提高代码的复用性。如果要修改代码,我们也只要修改一处即可,所以方法还可以提高代码的可维护性

方法到底要学什么?

方法需要先定义,才能使用,方法的定义,也叫做创建方法。

方法里面的代码不会主动执行,需要手动调用,才能执行。

学方法就是学两个:

  • 方法如何定义
  • 方法如何调用

定义格式:

public static void 方法名 () {
  // 方法体;
}

调用格式:

方法名();

注:方法与方法之间是平级关系,不能嵌套调用。

public class Demo1 {
    //入口方法
    public static void main(String[] args) {
        //方法调用
        eat();
        System.out.println("主方法执行");
    }

    //方法定义
    public static void eat() {
        //方法调用
        sleep();
        System.out.println("吃饭");
    }
      
	//方法定义
    public static void sleep() {
        System.out.println("睡觉");
    }
}

方法的调用过程

  • 方法没被调用前在方法区中的字节码文件中,调用后进入栈内存。
  • 栈内存有什么特点?先进后出。

day04—java基础之方法详解_java

方法1 方法2 方法3 依次进栈,然后是 方法3 方法2 方法1 依次出栈。

方法调用1:

day04—java基础之方法详解_java_02

方法调用2:

day04—java基础之方法详解_数据类型_03

day04—java基础之方法详解_数据类型_04

day04—java基础之方法详解_System_05

有参数无返回值方法的定义和调用

day04—java基础之方法详解_方法名_06

定义格式:参数:由数据类型和变量名组成

public static void 方法名 (参数1) {
	方法体;
}
// 当有多个参数时,通过逗号分隔。
public static void 方法名 (参数1, 参数2, 参数3...) {
	方法体;
}

调用格式:

方法名(参数);

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

===========================
isEvenNumber(10);

getMax(10,20);

注:方法调用时,参数的数量和类型必须与方法定义中的设置相匹配,否则程序将报错

public class Demo2 {
    public static void main(String[] args) {
        //带参数方法调用
        isEvenNumber(10);
    }

    //定义带参数的方法
    public static void isEvenNumber(int num) {
        if (num % 2 == 0) {
            System.out.println("偶数");
        } else {
            System.out.println("奇数");
        }
    }
}

形参和实参

  1. 形参:方法定义中的参数

等同于变量定义格式,例如:int number

  1. 实参:方法调用中的参数

等同于使用变量或常量,例如: 10 number

public class Example {  
    public void printMessage(String message) { // String message 是形参  
        System.out.println(message);  
    }  
}

public class Main {  
    public static void main(String[] args) {  
        Example example = new Example();  
        example.printMessage("Hello, World!"); // "Hello, World!" 是实参  
    }  
}

方法练习-打印n-m之间所有的奇数

  • 需求:定义一个方法(print) 用于打印 n 到 m 之间所有的奇数
  • 思路:
    1:定义方法,名称为print 2:为方法添加两个int类型的形参,准备接受调用者传递过来的实参 3:方法中设计for循环,循环从n开始,到m结束 4:循环中加入if判断,是奇数,则打印 5:main方法中调用print方法,传入两个实际参数
public class Demo2Method {
    public static void main(String[] args) {
        // 5:main方法中调用print方法,传入两个实际参数
        print(10,20);
    }

    //1:定义方法,名称为print
    // 2:为方法添加两个int类型的形参,准备接受调用者传递过来的实参
    public static void print(int n, int m){
        //健壮性
        if(n>m){
            System.out.println("参数有误");
            return;
        }
        System.out.println(n + "到" + m + "之间的奇数为:");
        // 3:方法中设计for循环,循环从n开始,到m结束
        for(int i = n; i <= m; i++){
            // 4:循环中加入if判断,是奇数,则打印
            if(i % 2 == 1){
                System.out.println(i);
            }
        }
    }
}

有参数有返回方法的定义和调用

  • 为什么要有带返回值的方法
    我们需要根据一个方法产出的结果来组织另外一段代码的逻辑,为了拿到这个方法产出的结果,就需要定义带返回值的方法。
  • 定义格式
public static 返回值数据类型  方法名 ( 参数 ) {
	return 数据 ;
}





public static boolean isEvenNumber( int number ) {           
	return true ;
}
public static int getMax( int a, int b ) {
	return  100 ;
}

注:方法定义时return后面的返回值与方法定义上的返回值数据类型要匹配,否则程序将报错

调用格式:

方法名 ( 参数 ) ;
数据类型 变量名 = 方法名 ( 参数 ) ;

isEvenNumber ( 5 ) ;
boolean  flag =  isEvenNumber ( 5 );

方法的通用格式(掌握)

 

public static void/返回值数据类型 方法名(参数) {
   方法体; 
   return 数据 ;
}
  • 解释:
  • public static 修饰符,目前先记住这个格式
    返回值数据类型 方法操作完毕之后返回的数据的数据类型
    如果方法操作完毕,没有数据返回,这里写void,而且方法体中一般不写return
    方法名 调用方法时候使用的标识
    参数 由数据类型和变量名组成,多个参数之间用逗号隔开
    方法体 完成功能的代码块
    return 如果方法操作完毕,有数据返回,用于把数据返回给调用者
  • 定义方法时,要做到三个明确
  • 方法要干什么? 对应我们的方法体。
  • 明确参数:我们要干这件事,需要什么材料。
  • 明确返回值类型:主要是明确方法操作完毕之后是否有数据返回,如果没有,写void;如果有,写对应的数据类型
  • 调用方法时的注意:
  • void类型的方法,直接调用即可
  • 非void类型的方法,推荐用变量接收调用

方法重载

  • 概念
    二同三不同二无关。
    同一个类中的同名方法;
    参数的个数、类型、顺序不同;
    与返回值无关,与形参的名称无关;
  • 作用
    针对于方法的编写者而言:相同功能的方法,只要起一个名字即可。
    针对于方法的使用者而言:相同功能的方法,也只要记忆一个名字就可以了。
  • 正确范例:
public class MethodDemo {
	public static void fn(int a) {
    	//方法体
    }
    public static void fn(int b) {
    	//方法体
    }
    public static int fn(double a) {
    	//方法体
    }
}

public class MethodDemo {
	public static float fn(int a) {
    	//方法体
    }
    public static int fn(int a , int b) {
    	//方法体
    }
}