Java-函数【方法】

58 阅读10分钟

一、函数入门

1.1 概述

  • 函数是完成指定功能的一个代码块,可以通过函数的名字重复使用

1.2 函数的构成

  • 函数分为两部分

    • 函数的声明

      • {}外部的内容是方法的声明的部分
    • 函数的实现

      • {}中的内容是方法的实现部分
      • 称为方法体

1.3 函数的语法

public static 返回值类型 函数名(形参列表) {
    方法体
}
  • public static

    • Java关键字表示访问范围和存储位置
  • 返回值类型

    • 方法运行结束时候得到的数据的类型
  • 函数名

    • 函数的名字,需要是一个合法的标识符
  • (形参列表)

    • 表明运行需要哪些数据支撑

    • 计算三角形周长

      • 需要边长
    • 计算圆的面积

      • 需要半径
    • 形参就是声明了各种变量。没有赋值,用户调用函数时候传入真正的数据【实参】

  • 方法体

    • 这个函数具体的功能

1.4 函数的调用

  • 通过函数名字来调用对应的函数

    • 有时候需要传入实参【如果方法声明了形参的时候】

二、函数的参数

2.1 概述

  • 参与函数运行的数据称为参数

  • 分为:

    • 形式参数

      • 形参
    • 实际参数

      • 实参

2.2 形参

  • 方法声明部分小括号中定义的变量

    • 没有赋值
  • 告诉方法调用者,这个方法运行起来需要哪些类型和数量的数据

package com.shine.function;
​
public class Demo04 {
    public static void main(String[] args) {
        
    }
    
    /**
     *  自我介绍的方法
     * @param name  姓名
     * @param age   年龄
     * @param address   地址
     */
    public static void show(String name,int age,String address) {
        
    }
    
    public static void show(String name,int age,String address,String school) {
        
    }
    
    public static void show(String name,int age,String address,String school,String subject) {
        
    }
    
    public static void show(String name,int age,String address,String school,String subject,String info) {
        
    }
    
}

2.3 实参

  • 函数运行时候实际使用的数据,这个数据是用户调用函数时候放入括号中的

    • 相当于给形参完成赋值操作
  • 实参的数量、类型、顺序必须和声明的形参保持一致

package com.shine.function;
​
public class Demo05 {
    public static void main(String[] args) {
        // judgeTriangle(3, 4); 数量不匹配
        judgeTriangle(3, 4, 5);
        // judgeTriangle(3, 4, "⑤");    类型不匹配
        
    }
    
    public static void judgeTriangle(double a,double b,double c) {
        
    }
    // judgeTriangle(double,int)
    // judgeTriangle(int,double)
    // judgeTriangle(double,double) 
    // judgeTriangle(double,double,double) 
    
}

练习

  • 编写方法,输出固定的内容:滕王阁序
  • 编写方法,传入三角形三条边长,输出能否构成三角形
  • 编写方法,传入一个起始年份和一个结束年份,输出这个区间的闰年
  • 编写方法,传入身高和体重,输出BMI是否正常
package com.shine.function;
​
public class Demo06 {
    public static void main(String[] args) {
        /**
         *  - 编写方法,输出固定的内容:滕王阁序
            - 编写方法,传入三角形三条边长,输出能否构成三角形
            - 编写方法,传入一个起始年份和一个结束年份,输出这个区间的闰年
            - 编写方法,传入身高和体重,输出BMI是否正常
         */
        
        printTeng();
        judgeTriangle(3, 4, 5);
        judgeTriangle(3, 4, 55);
        
        printYear(1000, 2000);
        
        judgeBMI(1.78, 88);
        judgeBMI(1.88, 88);
    }
    
    /**
     *  输出滕王阁序
     *      内容固定,不需要参数
     *      仅仅是输出,不需要返回值
     */
    public static void printTeng() {
        System.out.println("滕王阁序");
    }
    
    /**
     *  传入三角形三条边长,输出能否构成三角形
     * @param a 边长a
     * @param b 边长b
     * @param c 边长c
     */
    public static void judgeTriangle(double a,double b,double c) {
        if ((a+b>c) && (a+c>b) && (b+c>a)) {
            System.out.println("可以构成三角形");
        } else {
            System.out.println("NO可以构成三角形");
        }
    }
    
    /**
     *  传入一个起始年份和一个结束年份,输出这个区间的闰年
     * @param start 起始年份
     * @param end   结束年份
     */
    public static void printYear(int start,int end) {
        for (int i = start; i <= end; i++) {
            if ((i%400==0) || (i%100!=0 && i%4==0)) {
                System.out.println(i);
            }
        }
    } 
    
    /**
     *  传入身高和体重,输出BMI是否正常
     * @param height    体重,KG
     * @param weight    身高,M
     */
    public static void judgeBMI(double height,double weight) {
        double bmi = weight / (height*height);
        if (bmi<20) {
            System.out.println("偏瘦");
        } else if (bmi>25) {
            System.out.println("偏胖");
        } else {
            System.out.println("正常");
        }
    }
    
}

三、返回值和返回值类型【重点】

3.1 概述

  • 有些函数运行之后会产生一个结果

    • 查询得到的名字、年龄、信息
    • 计算得到的周长、面积、位置
    • ... ...
  • 这些结果在后期还需要再次使用,需要把这个结果记录下来,后续使用

  • 可以在方法的声明添加返回值类型

  • 可以在方法体中添加返回值return data

public static 返回值类型 方法名(参数列表){
    方法体
    return 数据;
}
​
注意:
    1、如果方法声明部分有返回值类型,方法必须有返回值return 数据
    2、返回的数据的类型需要和声明的类型兼容

3.2 返回值

  • 方法运行结束时候得到的数据

3.3 返回值类型

  • 方法运行结束时候得到的数据的类型

3.4 案例

算术运算

package com.shine.function02;
​
public class Demo02 {
    public static void main(String[] args) {
        // 定义函数,计算两个整数的和,返回结果,并打印。
        // 声明变量result
        int result = 0;
        
        // 把计算得到的数据存入result
        result = add(33, 66);
        
        System.out.println(result);
        
        // 直接输出方法运行的返回值,适合只使用一次的场景
        System.out.println(add(33, 55));
        
    }
    
    /**
     *  计算两个整数相加
     * @param a 整数a
     * @param b 整数b
     * @return  相加的结果
     */
    public static int add(int a,int b) {    // add(int,int)
        int sum = a+b;
        return sum;
    }
    
}

练习题02

package com.shine.function02;
​
public class Demo03 {
    public static void main(String[] args) {
        /**
            - 编写方法,传入三角形三条边长,返回周长【面积】
            - 编写方法,传入一个年份,输出是否闰年
            - 编写方法,传入身高和体重,返回BMI
            - 模拟查询,根据关键字查询得到结果并返回
            - 编写方法,传入2个数字,返回较大的哪个
            - 编写方法,传入2个数字,返回这些数字的平均值
         */
    }
    
    /**
     *  计算周长
     * @param a 边长a
     * @param b 边长b
     * @param c 边长c
     * @return  周长,-1表示无法构成三角形
     */
    public static double calculatePerimeter(double a,double b,double c) {
        double perimeter;
        // 判定能否构成三角形
        if ((a+b>c) && (a+c>b) && (b+c>a)) {
            perimeter = a + b + c;
            //return a+b+c;
        } else {
            perimeter = -1;
            //return -1;    // 如果不能构成三角形,返回一个不存在的数据
        }
        return perimeter;
    }
    
    /**
     *  判定年份是否闰年
     * @param year  年份
     * @return      是否闰年
     */
    public static boolean judgeYear(int year) {
        // 闰年条件
        if ((year%400==0) || (year%100!=0 && year%4==0)) {
            // 如果满足条件返回true,方法结束
            return true;
        }
        // 不满足条件执行返回false
        return false;
    }
    
    /**
     *  传入身高和体重,返回BMI
     * @param weight    体重KG
     * @param height    身高M
     * @return          BMI
     */
    public static double calculateBMI(double weight,double height) {
        return weight / (height*height);
    }
    
}

练习题03

package com.shine.function02;
​
public class Demo04 {
    public static void main(String[] args) {
        /**
            - 模拟查询,根据关键字查询得到结果并返回
            - 编写方法,传入2个数字,返回较大的哪个
            - 编写方法,传入2个数字,返回这些数字的平均值
            -编写方法,传入两个整数,计算a到b累加的结果
            -编写方法,传入两个整数,计算a的b次方
            -编写方法,传入一个整数,计算这个整数的阶乘
         */
        
    }
    
    /**
     *  根据关键字查询得到结果并返回
     * @param key
     * @return
     */
    public static String search(String key) {
        return "查询得到" + key + "相关的数据。。。";
    }
    
    /**
     *  传入2个数字,返回较大的哪个
     * @param a
     * @param b
     * @return
     */
    public static int max(int a,int b) {
        return a>b?a:b;
    }
    
    /**
     *  传入2个数字,返回这些数字的平均值
     * @param a
     * @param b
     * @return
     */
    public static double avg(double a,double b) {
        return (a+b)/2;
    }
    
    /**
     *  传入两个整数,计算a到b累加的结果
     * @param start
     * @param end
     * @return
     */
    public static int sum(int start,int end) {
        int sum = 0;
        for (int i = start; i <= end; i++) {
            sum += i;
        }
        return sum;
    }
    
}

3.5 注意事项

分支语句中的return

  • 在分支语句中必须保证能返回数据

    • 每一个分支中可能都是需要return的

方法中能否存在多个return

  • 但是最多执行一个return

    • 执行return相当于方法结束了,后面的代码无法继续执行
  • 当前分支return后面不能再书写代码

四、return关键字

4.1 概述

  • 结束方法
  • 结束方法 & 返回数据

4.2 结束方法&返回数据

  • 方法的声明部分有返回值类型的声明
public static int sum(int a,int b){
	return a+b;
}

4.3 结束方法

  • 如果方法的声明中返回值类型是void
  • 可以使用return结束方法【没有返回值】
package com.shine.function02;

public class Demo05 {
	public static void main(String[] args) {
		System.out.println("main方法开始...");
		
		show();
		
		System.out.println("main方法结束...");
		
	}
	
	public static void show() {
		System.out.println("\tshow方法开始...");
		
		for (int i = 0; i < 10; i++) {
			System.out.println("\t\t"+i);
			
			if (i == 6) {
				// break;	// 终止循环
				return;	// 结束show方法,方法中这一行之后的代码不再执行
			}
			
		}
		
		System.out.println("\tshow方法结束...");
	}
}

五、方法分类

5.1 根据返回值类型和参数列表

  • 无参数无返回值
  • 无参数有返回值
  • 有参数无返回值
  • 有参数有返回值

5.2 无参数无返回值

  • 提示、警告
  • 内容固定不变,不需要运算、查询等操作,没有返回值
	/**
	 *	无参数无返回值
	 *		提示、警告、、、
	 */
	public static void notice() {
		System.out.println("请站稳扶好,注意脚下安全,不要看手机。");
	}

5.3 无参数有返回值

  • 固定条件查询、计算
  • 无差别查询
	/**
	 * 	无参数有返回值
	 *		询所有信息
	 * @return
	 */
	public static String searchALl() {
		return "CPU:AMD R7 5800H,RAM:16GB...";
	}

5.4 有参数无返回值

  • 把数据消费掉

    • 一般是输出了
  • 增删改也有可能是没有返回值的

	/**
	 *	有参数无返回值
	 *		把数据消费了
	 * @param songName
	 */
	public static void playMusic(String songName) {
		System.out.println("马上播放:" + songName);
	}

5.5 有参数有返回值

  • 使用场景最多
  • 能替代上面三种情况
	/**
	 *	传入2个数字,返回这些数字的平均值
	 * @param a
	 * @param b
	 * @return
	 */
	public static double avg(double a,double b) {
		return (a+b)/2;
	}

六、方法多级调用

6.1 概述

  • 方法不能嵌套

    • 方法中不能书写其他的方法
  • 方法中可以调用其他方法

A方法中调用B方法
B方法中调用C方法
C方法中调用D方法
... ...

6.2 方法多级调用入门案例【掌握】

package com.shine.function;

public class Demo01 {
	public static void main(String[] args) {
		System.out.println("main方法开始...");
		show01();
		System.out.println("main方法结束...");
	}

	public static void show01() {
		System.out.println("\tshow01方法开始...");
		show02();
		System.out.println("\tshow01方法结束...");
	}
	
	public static void show02() {
		System.out.println("\t\tshow02方法开始...");
		show03();
		System.out.println("\t\tshow02方法结束...");
	}
	
	public static void show03() {
		System.out.println("\t\t\tshow03方法开始...");
		System.out.println("\t\t\t\tHelloWorld");
		System.out.println("\t\t\tshow03方法结束...");
	}
}

6.3 递归

  • 在方法中调用本方法称为方法递归

  • 递归是由风险的

    • 如果没有在合适的时候结束调用,可能造成无穷递归
    • 最终造成栈内存溢出错误
  • 递归需要再合适的时候结束调用,来解决具有某些规律的问题

package com.shine.function;

public class Demo02 {
	// 类中方法外,使用static修饰
	static int count = 0;
	
	public static void main(String[] args) {
		System.out.println("main方法开始...");
		show01();
		System.out.println("main方法结束...");
	}

	public static void show01() {
		count++;
		System.out.println("\tshow01方法开始..." + count);
		if (count < 10) {
			show01();	// 在方法中调用自己
		}
		System.out.println("\tshow01方法结束..." + count);
		count--;
	}
}

递归计算阶乘

package com.shine.function;

public class Demo03 {
	public static void main(String[] args) {
		/**
		 *	计算5!
		 *	5! = 5*4*3*2*1
		 *	   = 5 * 4!
		 *	   = 5 * 4 * 3!
		 *	   = 5 * 4 * 3 * 2!
		 *	   = 5 * 4 * 3 * 2 * 1!
		 *	   = 5 * 4 * 3 * 2 * 1
		 */
		
		int result = mul(5);
		System.out.println(result);
	}
	
	/**
	 * 	mul(5)
	 * 	5 * mul(4)
	 * 	5 * 4 * mul(3)
	 * 	5 * 4 * 3 * mul(2)
	 * 	5 * 4 * 3 * 2 * mul(1)
	 * @param n
	 * @return
	 */
	public static int mul(int n) {
		if (n == 1) {
			return 1;
		}
		return n * mul(n-1);
	}
	
}

斐波拉契数列

package com.shine.function;

public class Demo04 {
	public static void main(String[] args) {
		/**
		 * 	1	1	2	3	5	8	13	21	34	55...
		 * 	第一个、第二个	1
		 * 		f(1)=1、f(2)=1
		 * 	后面	前面两个相加
		 * 		f(3)=f(1) + f(2)
		 * 		f(4)=f(2) + f(3)
		 * 		f(5)=f(4) + f(3)
		 * 		... ...
		 */
		
		for (int i = 1; i <= 10; i++) {
			System.out.println(fib(i));
		}
		
	}
	
	/**
	 *	斐波拉契数列中的第N个数字
	 * @param n
	 * @return
	 */
	public static int fib(int n) {
		if (n==1 || n==2) {
			return 1;
		}
		return fib(n-1)+fib(n-2);
	}
	
}