java方法
java的方法是用来完成某种功能的代码块。使用方法封装代码块,可以提高代码的可复用性,模块化,使用者无需知道代码的具体实现也能通过方法调用使用其提供的功能,简化了应用过程。
方法结构
一般一个方法的构成有如图几部分构成:
方法的基本构成如下面的例子:
程序案例:
public static int add(int a, int b){
return a +b;
}
方法构成 | 含义 |
---|---|
访问控制符 | private/protected/pubic/省略(不写) |
static关键字 | 可写(是否为静态方法,目前必备) |
返回类型 | 类型,和return的类型一致void(方法没有返回) |
方法名称 | 也是方法的入口,即内存中方法的地址。通过它可以找到我们要调用的方法在哪。例如: add() |
形参 | 形式上的参数,只是一个标记不是具体的值。例如: (int a, in b) a,b为形参 |
方法体 | 大括号的内容,大括号可以理解为方法的作用域,即大括号中定义的变量其它方法是访问不到的。 |
方法使用中常见错误 | 1. 方法体不能定义方法。2. 方法定义了返回类型,一定要有return 返回相应的类型。3. 方法中大括号不匹配。 |
方法参数
方法参数由定义和使用划分为形参(定义时)和实参(调用时)。
(1) 形参
形参即形式上的参数,在定义方法时虚拟的参数名称。例如下面例子中的a和b即为形式参数,名字是可以替换的,规范中建议方法的参数命名能够见名知意:
public static int add(int a , int b){
}
(2) 实参
实际是指在实际方法调用过程中的实际传入的参数,例如以下程序在调用过程中调用add方法中传入的4和6即为实际传入的参数是实参。
程序案例:
pubic static void main(String[] args){
int x = add(4, 6);
}
public static int add(int a , int b){
return a + b;
}
(3) 形参和实参的关系图
不定参数
为了简化多参数的传递方式,编译器提供了一种不定参数的方式,其底层会转换为数组形式。
public void func(类型 ... 形参名称){
//编译器再运行时将传入的实参,转换为数组执行
}
程序案例:
public static void func(int... a) {
for(int i = 0; i < a.length; i++) {
System.out.println(a[i] + "\t");
}
}
方法的调用
一旦方法定义好之后,方法则可以提供程序调用,常用的调用方式分为两种:
(1) 有返回值的方法:当作值使用。
程序案例:
pubic static void main(String[] args){
int x =add(4,6); //作为值返回给x
System.out.println(x);
System.out.println(99 + add(7,8)); //直接使用当作值用
}
(2) 无返回值方法: 做一行代码调用。
程序案例:
/**
* 打印0~100之间的所有偶数
*/
public static void print(){
for(int i=0; i <= 100; i+= 2){
System.out.print(i + "\t");
}
}
方法重载
如果同一个类中包含了两个或两个以上方法名相同、方法参数的个数、顺序或类型不同的方法,则称为方法的重载,也可称该方法被重载了。
方法重载的目的
方法重载的目的是在一个类(class范围)使用相同的方法名称,通过****参数类型或个数****不同复用方法名称,避免记录管理太多的方法名称。比如我们可以命名两个整数相加为add,如果是三个整数,四个整数相加呢?显然相同名称对于客户调用会容易很多。
方法重载的原理
编译器底层将方法名和参数类型重新组合命名为新的标识符,例如:add(int a, int b)转化为add_int_int, 将add(double a, int b)转换为 add_double_int, 也就是说编译器底层维护的方法名称依然是唯一的。
方法重载的几个必要条件
- 在同一个类中
- 方法名称完全相同
- 方法的参数类型或者数量不同(与返回值等无关)
程序案例:
public static int add(int a, int b) {
return a + b;
}
public static int add(int a, int b, int c) {
return a + b + c;
}
方法递归
概念
程序调用自身的编程技巧称为递归(recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间接调用自身的一种方法,它通常把一个大型复杂的问题层层转化为一个与原问题相似的规模较小的问题来求解,递归策略只需少量的程序就可描述出解题过程所需要的多次重复计算,大大地减少了程序的代码量。 简单讲就是我们常说的自己调用自己(实际上是调用和自己的形式相同但是参数不同的方法而已)。
递归流程
解决方法递归问题,一般流程如下:
-
找出递归的终止条件
-
找出解决问题的通项公式
程序案例:
计算一个整数的阶乘:
public static int f(int n) {
if (1 == n) {
return 1; //递归终止条件
}
return n *f(n - 1); //一般表达式(通项)
}
案例解析:
f(5) = 5 x f(4);
f(4) = 4 x f(3);
f(3) = 3 x f(2);
f(2) = 2 x f(1);
f(1) = 1;
当n == 1 的时候,获取到结果,将结果返回给f(2),依次向上返回直到f(5)就获得了结果。这恰巧是栈的调用方式,先压栈,到达f(1)时开始出栈。