005-函数【方法】

005-函数【方法】

一、函数入门

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);
	}
	
}

七、作业题

基础题

1、编写方法,计算m只鸡和n只兔子腿的数量并返回
2、编写方法,判断一个年份是不是闰年
3、编写方法,在方法中输出NN【参数指定】乘法表
4、编写方法,输出2~~某个数N之内的素数
5、方法根据参数和返回值类型分为4种,分别写出他们的案例,需要详细注释
无参数,无返回值
无参数,有返回值
有参数,无返回值
有参数,有返回值

拓展题

1、编写方法,传入工资,计算纳税金额
2、编写方法,输出1~N斐波拉契数列
3、编写方法,模拟姓名打分工具,计算一个姓氏字符的分值【60~100】并返回【字符有Unicode数值】

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值