文章目录
【本节目标】
- 掌握方法的定义和使用
- 掌握方法传参
- 掌握方法重载
- 掌握方法递归
一、方法的概念
在程序编写时,我们难免会频繁地写同一段代码,如果每次都将这段代码重新实现一边,将大大增加代码的繁琐程度。在这种情况下,我们可以将这段代码封装成方法,每次要使用时就调用这个方法。
1.1 什么是方法?
方法就是一个代码片段,类似于 C语言中的函数。方法的存在也是模块化编程思想的体现:
- 能够模块化地组织代码
- 做到让代码被重复使用
- 让代码更好理解
- 直接调用现有方法,不必重复造轮子
1.2 方法的定义
public static int func(int n){
int x = 10;
return x;
}
/*
修饰符 返回值类型 方法名(形参...){
方法体代码;
return ;
}
*/
eg1: 实现一个方法,判断是否为闰年。
public static boolean isLeapYear(int year){
if((year%4==0&&year%100!=0) || year&400==0){
return true;
}
return false;
}
注意:
- 注意修饰符的搭配。
- 在java中,方法必须写在类当中。
- 方法不能嵌套定义。
- java 中不存在方法声明。
1.3 方法调用的执行过程
在 Java 的方法调用时,有一套基本的流程,由计算机来完成:
调用方法 -->传递参数 -->找到方法地址 -->执行被调用的方法 -->被调方法结束返回 -->回到主调方法继续向下执行
我们可以发现这套流程和C语言中的函数调用是基本一致的。
还有两点注意事项
- 调用方法时,不会执行方法的代码,调用时才会执行。
- 一个方法可以多次调用。
1.4 实参和形参的关系
Java 的形参和实参的关系与C语言中的也基本一致。
形参的名字可以随意取,对方法没有任何影响,形参只是方法在定义时需要借助的一个变量,用来保存方法在调用时传递过来的值。
public static int add(int a, int b){
return a+b;
}
int ans = add(2,3); // 2和3 是实参,调用时传给形参 a 和 b。
Java中实参的值永远是拷贝到形参中,形参和实参本质是内存中不同的地址。
我们学过 C语言的知道:可以在调用时将实参地址传给形参,这样可以直接通过地址找到内存中保存的数据,进而直接影响到实参。
但是在Java中,我们无法获取到栈区的地址。不存在取地址的操作。
1.5 没有返回值的方法
class Test{
public static void main(String[] args){
int a = 10;
int b = 20;
print(a,b);
}
// 这里 print 方法的返回类型是 void
// 这样的方法不用返回
public static void print(int a,int b){
System.out.println("x=" + x +" y=" y);
}
}
二、方法的重载
方法重载是一个全新的概念。
2.1 为什么需要方法重载?
public class test3 {
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);
System.out.println("ret2 = " + ret2);
}
public static int add(int x,int y){
return x + y;
}
}
// 对于上面的代码,直接执行时会报错:从double转换到int可能会有损失。
// double ret2 = add(a2,b2);
上面 ret2 参数类型和方法不匹配,不能使用add方法,我们可以用方法重载来解决
2.2 方法重载的概念
在自然语言中,一个词语如果有多重含义,那么就说这个方法重载了,在 JAVA 中方法也是可以重载的。
如果几个方法的名字相同,但是参数列表的个数或类型不同,就说这个方法重载了
public class test3 {
public static void main(String[] args) {
add(1, 2); // 调用add(int a,int b)
add(1.5, 2.5); // 调用add(double a,double b)
add(1.4, 2.4, 3.6); // 调用add(double a,double b,double c)
// 以上为重载的方法的三个不用形式
}
public static int add(int a,int b){
return a+b;
}
public static double add(double a,double b){
return a+b;
}
public static double add(double a,double b,double c){
return a+b+c;
}
}
注意:
- 方法名必须相同
- 参数列表必须不同(参数的个数不同,参数的类型不同)
- 与返回值的类型无关
- 重载只能出现在一个类或者由同一个类继承的类中
- 编译器在编译代码时,会对实参类型进行推演,根据结果确定调用哪个方法。