一、方法
方法的概念
类似于C语言中的“函数”,将多条语句打包成一个整体,可以重复使用
语法格式
//方法定义的语法格式
修饰符 返回值类型 方法名称([参数类型 形参 ...]){
方法体代码;
[return 返回值];
}
修饰符:限定方法谁可以用,初学可直接使用public static 搭配
返回值类型:如果方法有返回值,返回值类型必须和返回的实体类型一致;如果没有返回值,必须写成void
java中,方法必须写在类当中,没有方法声明一说,且方法不能嵌套定义
//计算1!+2!+3!+4!+5!
public class Method {
public static void main(String[] args) {
int sum = 0;
for(int i = 1;i <= 5;i++){
sum += fac(i);
}
System.out.println("sum = " + sum);
}
public static int fac(int n){
int ret = 1;
for(int i = 1;i <= n;i++){
ret *= i;
}
return ret;
}
}
实参和形参
方法调用时,传递的实参最终被方法的形参接收了;在Java中都是以值的方式接收的,C语言还可以传递指针。在方法中,形参修改之后,对实参没有任何影响。
//计算5!
public class Method {
public static void main(String[] args) {
fac(5);//5是实参,在方法调用时,形参n用来保存5
System.out.println(fac(5));
}
public static int fac(int n){ //n是形参
int ret = 1;
for(int i = 1;i <= n;i++){
ret *= i;
}
return ret;
}
}
二、重载
//求和
public class Method {
public static void main(String[] args) {
int a = 10;
int b = 20;
int ret = add(a, b);
System.out.println("ret = " + ret);
double a2 = 10.5;
double b2 = 20.5;
double ret2 = add(a2, b2);//编译出错,因为add方法中参数为int型,由double转为int会造成数据丢失
System.out.println("ret2 = " + ret2);
}
public static int add(int x, int y) {
return x + y;
}
}
编译出错,因为add方法中参数为int型,由double转为int会造成数据丢失。
为了解决这一问题,可以添加一个addDouble方法
public static double addDouble(double x, double y) {
return x + y;
}
缺点:需要不同的方法名,需要起名,头发会变少,所以有了重载
重载:一词多义。如果多个方法的方法名相同,参数列表不同,则称该方法被重载了。
//求和
public class Method {
public static void main(String[] args) {
add(1, 2); // 调用add(int, int)
add(1.5, 2.5); // 调用add(double, double)
}
public static int add(int x, int y) {
return x + y;
}
public static double add(double x, double y) {
return x + y;
}
}
注意:在类中,允许存在名字相同的方法---------必须构成方法重载;
参数列表(参数的个数、参数的类型、类型的次序)不同;
与返回值类型是否相同无关;
编译时,编译器会对实参类型进行推演,最终确定调用哪个方法。
三、递归
递归:一个方法直接或间接调用自己
递归的必要条件:1、将原问题划分成子问题,且子问题必须与原问题的解法相同;2、递归出口
递归的表现方式:1、问题本身是递归的;2、数据结构是递归的;3、概念是递归的
public class Method {
public static void main(String[] args) {
int n = 5;
int ret = fac(n);
System.out.println("5的阶乘: " + ret);
}
public static int fac(int n){
if(n == 1){
return 1;
}
return n *fac(n - 1);//调用fac()函数自身
}
}
运行结果
5的阶乘: 120