Java中的方法就是一个代码片段类似与c语言中的函数,学习方法时可以结合c语言中的函数来理解。
方法的特点
- 能够模块化的组织代码。(当代码规模比较复杂的时候).
- 做到代码被重复使用, 一份代码可以在多个位置使用。
- 让代码更好理解更简单,使代码看起来更加简单明了。
- 直接调用现有方法开发, 不必重复造轮子。
方法的用法
基本语法
方法定义:
public static 方法返回值 方法名称([参数类型 形参 …]){
方法体代码;
[return 返回值];
}
方法调用:
返回值变量 = 方法名称(实参…);
代码示例:
下面定义方法及调用方法;
方法add实现计算两个数的和;
该方法是一个有返回值的方法,且返回值为整型。
class Test {
public static void main(String[] args) {
int a = 10;
int b = 20;
int ret = add(a, b); // 方法的调用
System.out.println("ret = " + ret);
}
// 方法的定义
public static int add(int x, int y) {
return x + y;
}
}
// 执行结果
ret = 30
注意:
- 方法定义时, 参数可以没有. 每个参数要指定类型。
- 方法定义时, 返回值也可以没有, 如果没有返回值, 则返回值类型应写成 void。
- 方法定义时的参数称为 “形参”, 方法调用时的参数称为 “实参”。
- 方法的定义必须在类之中, 代码书写在调用位置的上方或者下方均可。
- Java 中没有 “函数声明” 这样的概念。
- 定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行。
- 当方法被调用的时候, 会将实参赋值给形参。
- 参数传递完毕后, 就会执行到方法体代码。
- 当方法执行完毕之后(遇到 return 语句, 就执行完毕), 回到方法调用位置继续往下执行。
10.一个方法可以多次调用且互不干扰。
方法的重载
重载要解决的问题:
class Test {
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;
}
}
// 编译出错
Test.java:13: 错误: 不兼容的类型: 从double转换到int可能会有损失
double ret2 = add(a2, b2)
重载可以简单的理解为:同一个方法名字, 提供不同版本的实现, 称为方法重载。
重载的规则:
- 针对同一个类。
- 方法名相同。
- 方法的参数不同(参数个数或者参数类型)。
- 方法的返回值类型不影响重载。
代码示例:
public static int add(int x, int y) {
return x + y;
}
public static double add(double x, double y) {
return x + y;
}
public static double add(double x, double y, double z) {
return x + y + z;
}
}
注意:当两个方法的名称和参数都相同时,不构成重载。
class Test {
public static void main(String[] args) {
int a = 10;
int b = 20;
int ret = add(a, b);
System.out.println("ret = " + ret);
}
public static int add(int x, int y) {
return x + y;
}
public static double add(int x, int y) {
return x + y;
}
}
// 编译出错
Test.java:13: 错误: 已在类 Test中定义了方法 add(int,int)
public static double add(int x, int y) {
函数的递归
递归的含义:
一个方法在执行过程中调用自身, 就称为 “递归”。
递归的要点:
- 递归有一个趋近于终止的条件。
- 调用自己本身。
- 本质是将大问题化为小问题。
递归相当于数学上的 “数学归纳法”, 有一个起始条件, 然后有一个递推公式.
例如, 我们求 N!
起始条件: N = 1 的时候, N! 为 1. 这个起始条件相当于递归的结束条件.
递归公式: 求 N! , 直接不好求, 可以把问题转换成 N! => N * (N-1)!
思路图:
代码块:
public static int fac(int n) {
if(n==1) {
return 1;
}
return n*fac(n-1) ;
}
小结:
递归是一种重要的编程解决问题的方式.
有些问题天然就是使用递归方式定义的(例如斐波那契数列, 二叉树等), 此时使用递归来解就很容易.
有些问题使用递归和使用非递归(循环)都可以解决. 那么此时更推荐使用循环, 相比于递归, 非递归程序更加高效.