方法
定义
方法就是一个代码片段. 类似于 C 语言中的 “函数”.
方法存在的意义(理解):
-是能够模块化的组织代码(当代码规模比较复杂的时候).
-做到代码被重复使用, 一份代码可以在多个位置使用.
-让代码更好理解更简单.
-直接调用现有方法开发, 不必重复造轮子
// 方法定义
public static 方法返回值 方法名称([参数类型 形参 ...]){
方法体代码;
[return 返回值];
}
// 方法调用
返回值变量 = 方法名称(实参...);
注意事项
-public 和 static 两个关键字在此处具有特定含义,
-方法定义时, 参数可以没有. 每个参数要指定类型
-方法定义时, 返回值也可以没有, 如果没有返回值, 则返回值类型应写成 void
-方法定义时的参数称为 “形参”, 方法调用时的参数称为 “实参”.
-方法的定义必须在类之中, 代码书写在调用位置的上方或者下方均可.
方法调用的执行过程
基本规则
- 定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行.
- 当方法被调用的时候, 会将实参赋值给形参.
- 参数传递完毕后, 就会执行到方法体代码.
- 当方法执行完毕之后(遇到 return 语句), 就执行完毕, 回到方法调用位置继续往下执行.
- 一个方法可以被多次调用.
形参和实参的关系
- 对于基础类型来说, 形参相当于实参的拷贝. 即 传值调用
- 传引用类型参数 (例如数组来解决这个问题)
class Test {
public static void main(String[] args) {
int[] arr = {10, 20};
swap(arr);
System.out.println("a = " + arr[0] + " b = " + arr[1]);
}
public static void swap(int[] arr) {
int tmp = arr[0];
arr[0] = arr[1];
arr[1] = tmp;
}
//传值调用,不改原来的值,也就是形参改变实参不变
//swap2-->"假交换"
public static void swap2(int x , int y){
int tmp = x;
x = y;
y = tmp;
}
}
// 运行结果 a = 20 b = 10
方法的重载
同一个方法名字, 提供不同版本的实现, 称为 方法重载
重载的规则
针对同一个类:
方法名相同
方法的参数不同(参数个数或者参数类型)
方法的返回值类型不影响重载.
方法的重写
如何定义重写:在Java程序中,类的继承关系可以产生一个子类,子类继承父类,它具备了父类所有的特征,继承了父类所有的方法和变量。子类可以定义新的特征,当子类需要修改父类的一些方法进行扩展,增大功能,程序设计者常常把这样的一种操作方法称为重写,也叫称为覆写或覆盖。
重写体现了Java优越性,重写是建立在继承关系上,它使语言结构更加丰富。在Java中的继承中,子类既可以隐藏和访问父类的方法,也可以覆盖继承父类的方法。在Java中覆盖继承父类的方法就是通过方法的重写来实现的。
所谓方法的重写是指子类中的方法与父类中继承的方法有完全相同的返回值类型、方法名、参数个数以及参数类型。这样,就可以实现对父类方法的覆盖。
重写与重载的区别
区别点 | 重载 | 重写(覆写) |
---|---|---|
英文 | Overloading | Overriding |
定义 | 方法名称相同,参数的类型或个数不同 | 方法名称、参数类型、返回值类型全部相同 |
权限 | 对权限没有要求 | 被重写的方法不能拥有更严格的权限 |
范围 | 发生在一个类中 | 发生在继承类中 |
方法的递归
一个方法在执行过程中调用自身, 就称为 “递归”.
递归相当于数学上的 “数学归纳法”, 有一个起始条件, 然后有一个递推公式.
//求斐波那契数列第 n 项-->例子
public static int fib(int n) {
if (n == 1 || n == 2) {
return 1;
}
return fib(n - 1) + fib(n - 2);
}
递归是一种重要的编程解决问题的方式. 有些问题天然就是使用递归方式定义的(例如斐波那契数列, 二叉树等), 此时使用递归来解就很容易.
有些问题使用递归和使用非递归(循环)都可以解决. 那么此时更推荐使用循环, 相比于递归, 非递归程序更加高效