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数值】