Day09——方法、重载、可变参数、递归
方法
1、方法的定义
Java的方法,一段用来完成特定功能的代码片段(或者说实现某个功能的语句块的集合),一般包含于类或对象中。
设计方法的时候,最好保持方法的原子性,就是一个方法只完成1个功能,这样利于我们后期的扩展。
定义一个方法包含以下语法:
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
-
修饰符:定义了该方法的访问类型,一般有public、static等。
-
返回值类型 :方法可能会返回值,一般有int,double、bool等。有些方法执行所需的操作,但没有返回值,在这种情况下,返回值类型是关键字void。
-
方法名:是方法的实际名称。即,调用该方法时所需的名称。
-
参数类型::参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参 数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
- 形式参数:在方法被调用时用于接收外界输入数据的参数。
- 实参:调用方法时实际传给方法的数据。
-
方法体:方法体包含具体的语句,定义该方法的功能。
2、方法调用
调用方法:对象名.方法名(实参列表),即【例1】第2行。
调用格式:
int num = max(30,40);//有返回值类型的调用
System.out.println("Hello World");//void类型的调用
【例1】用java方法比较两个数大小,并输出大的数
public static void main(String[] args) { //main方法
int num = max(10,20); //调用max方法
System.out.println(num);
}
public static int max(int a,int b){ //max方法
if(a<b){
a = b;
} //把两数中,较大的赋值给a
return a; //返回a的值
}
Java只有值传递
为什么说 Java 只有值传递
3、方法的重载
【例1】中的max方法仅仅适用于int型数据。但如果比较两个浮点类型数据呢?
此时就需要方法重载,创建另一个有相同方法名称、但参数不同的方法,即,在【例1】中创建一个新的max方法public static double max( double a , double b){}。
方法重载:一个类中,有两个名称一样的方法,但两个方法的参数列表不同。Java编译器根据方法签名判断哪个方法应该被调用。
- 参数列表:参数的个数、类型(int、double等)、排列顺序等。
可变参数
参数的个数不同时,对应的参数列表不同、其方法也不同,因此为了避免重复多次方法重载,JDK 1.5 开始,Java支持可变参数作为方法的参数。
可变参数的类型确定、数量不限;一个方法中只能指定一个可变参数,且必须是方法的最后一个参数。可变参数常与数组同时使用。
【例2】
public static void main(String args[]) {
// 调用可变参数的方法
printMax(34, 3, 3, 2, 56.5);
printMax(new double[]{1, 2, 3});
}
public static void printMax( double... numbers) {//...numbers即为可变参数
if (numbers.length == 0) {
System.out.println("No argument passed");
return;
}
double result = numbers[0];
for (int i = 1; i < numbers.length; i++){
if (numbers[i] > result) {
result = numbers[i];
}//11~15行,遍历比较,并将大值赋值给result
}
System.out.println("The max value is " + result);
}
递归
递归是一种常见的解决问题的方法,即把问题逐渐简单化。递归的基本思想就是“自己调用自己”。
利用递归可以用简单的程序来解决一些复杂的问题。它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,大大地减少了程序的代码量。(与之相对,递归带来大量的函数调用,即占用大量内存空间)
递归结构包括两个部分:
- 递归头。什么时候不调用自己方法,即递归的结束条件
- 递归体。什么时候需要调用自己方法,即自己调用自己。
【例3】计算10的阶乘
public static void main(String[] args) {
System.out.println(f(5));
}
public static int f(int n){
if(n==1){
return 1;
}else{
return n*f(n-1);
}
}
能不用递归就不用递归,递归都可以用迭代来代替。