一、方法(类似其他语言的函数)
1.概述及举例
(1)简述:达成某一个目的前所做的一系列动作
(2)举例
例1:
去XXX地,怎么去?
自己开车,花钱打车去
其中:开车/打车就是方法
例2:
算数四则运算:加、减、乘、除各有各自的独特算法
Java方法是语句的集合,是解决一类问题的有序步骤组合
2.方法设计原则
(1)保持方法的原子性(一个方法只完成一个功能),有利于后期拓展。
(2)命名规范:前面文章有
3.方法组成及调用
(1)组成:以main方法为例
主(main)方法:又称入口,可以没有,但一个类中最多只有一个主方法!
static修饰符后面再讲,现在在该类下的方法修饰名统一为 public static!
(2)调用:
对象名.方法名(实参列表)
这里因为加了static,可以不用创建对象直接写出来,后面再讲static
当方法返回一个值的时候,方法调用通常被当作一个值
如果方法返回值是void,方法调用一定是一条语句
System.out.println("请输入数字");
4.拓展
(1)值传递(Java是值传递)
在调用函数时,将实际参数复制一份传递到函数中,这样在函数中如果对参数进行修改,就不会影响到实际参数
(2)引用传递
将实际参数的地址传递到函数中,那么在函数中对参数进行修改,将会影响到实际参数
5.练习
以上章猜数游戏为例改造代码:
其简单流程图如下
附上在线流程图链接
改完后的代码:
//1.生成随机数
System.out.println("随机数生成中");
int randomNum = newRandomNum();
System.out.println("随机数已生成");
//2.输入一共多少次机会
System.out.println("一共有多少次机会?");
int count = input();
while (count>0){
count--;
//3.输入数字
System.out.println("请猜数");
int input = input();
//4.判断
int result = judge(input, randomNum);
if (result == 1){
System.out.println("猜大了,你还有"+count+"次");
}else if (result == 2){
System.out.println("猜小了,你还有"+count+"次");
}else{
System.out.println("猜对了,随机数是"+randomNum);
break;
}
if (count == 0){
System.out.println("已无次数,游戏结束");
}
}
方法:
/**
* 该方法用来生成随机数
* @return 随机数
*/
public static int newRandomNum(){
//创建Random对象,用于生成随机数
Random random = new Random();
int num = random.nextInt(101);
return num;
}
/**
* 该方法用于接收键盘输入的数据并返回
* @return 输入的数
*/
public static int input(){
//创建扫描器对象,用于接收输入的数据
Scanner scanner = new Scanner(System.in);
System.out.println("请输入数字");
int input = scanner.nextInt();
return input;
}
/**
* 此方法用来返回判断结果
* @param guess 输入的数字
* @param random 随机数
* @return 判断结果
*/
public static int judge(int guess,int random){
if (guess > random){
//猜大了
return 1;
}else if (guess < random){
//"猜小了"
return 2;
}else {
//"猜对了"
return 3;
}
}
二、方法的重载
1.重载的必要性
简单讲一个例子,求和(int,double这两种类型数求和)
public class Method03 {
public static void main(String[] args) {
int sum = add(1,2,3);
System.out.println(sum);
}
//以下都是平平无奇的求和方法
public static int add(int a,int b,int c){
return a+b+c;
}
}
我写了一个简单的三数求和方法,三个数是int类型,这样求和没有问题。
问题:
如果我要将求和数变为4个甚至n个呢?
或者将三个数其中一个或多个变成double或者其他类型的数据呢?
如果是多种类型数据,输入的顺序是不是又有要求了?
要怎么解决,再写add02,add03,add0n多种方法再重新调用吗?
对此Java提供了一种便捷方案,即方法重载
public class Method03 {
public static void main(String[] args) {
int sum = add(1,2,3);
System.out.println(sum);
double sum31 = add(1,5,4.1);
double sum32 = add(1,4.1,5);
double sum33 = add(5,1,4.1);
double sum34 = add(5,4.1,1);
System.out.println(sum31);
System.out.println(sum32);
System.out.println(sum33);
System.out.println(sum34);
}
public static int add(int a,int b,int c){
return a+b+c;
}
public static int add(int a,int b,int c,int d){
return a+b+c;
}
public static double add(double a,double b,double c){
return a+b+c;
}
}
通过上述问题会发现,随着要求的不断变化,参数列表可能会有0个到多个,如果仅靠重载将所有可能会出现的参数列表依次写出来就会浪费大量的精力,还会导致代码可读性变差(变成一坨喽~)
对此,jdk1.5开始,Java支持传递同一类型的可变参数给一个方法!
使用:在方法的声明中在指定参数类型后加一个省略号(...)
注意:一个方法中只能指定一个可变参数,它必须是方法的最后一个参数,任何普通参数必须在可变参数前声明!
double sum41 = add(1.1,1.2,1.3,1.4,1.5);
double sum42 = add(1,2,3,4,5,6,7,8,9,10,11);
System.out.println(sum41);
System.out.println(sum42);
public static double add(double ... nums){
double sum = 0;
for (int i = 0; i < nums.length; i++) {
sum += nums[i];
}
return sum;
}
2.重载的规则(俩必须一随便)
(1)方法名称必须相同
(2)参数列表必须不同(参数个数,参数类型,参数排列顺序等)
(3)返回类型可以相同也可以不同
注意:仅靠返回值类型不同不足以成为方法的重载
三、递归(谨慎使用)
1.概述:A方法调用A方法
2.作用:
用来解决一些复杂问题,将一些大型复杂问题像剥大蒜一样转化为与原问题相似的较小问题。
3.结构:
(1)递归头:什么时候不调用自身,没头则死(没有头就会死循环)
(2)递归体:什么时候调用自身
4.案例
public static void main(String[] args) {
//典型阶乘
final int factorial = factorial(5);
System.out.println(factorial);
}
public static int factorial(int n){
if (n == 1){
return 1;
}else{
return n*factorial(n-1);
}
}