1.什么是方法?方法的意义?
1.做到代码被重复使用, 一份代码可以在多个位置使用。
2.配合注释让代码更好理解更简单3.直接调用现有方法开发, 不必重复造轮子。
回忆一个之前写过的代码: 计算 1! + 2! + 3! + 4! + 5!
public static void main(String[] args) { int sum = 0; for (int i = 1; i <= 5; i++) { int tmp = 1; for (int j = 1; j <= i; j++) { tmp *= j; } sum += tmp; } System.out.println("sum = " + sum); }
这个代码中使用双重循环, 比较容易写错.接下来我们可以使用方法来优化这个代码
public static void main(String[] args) { int sum = 0; for (int i = 1; i <= 5; i++) { sum += factor(i); } System.out.println("sum = " + sum); } //计算n的阶乘 public static int factor(int n) { int ret = 1; for (int i = 1; i <= n; i++) { ret *= i; } return ret; }
2.方法定义语句
基本语法
// 方法定义
public static 方法返回值 方法名称([参数类型 形参 ...]){
方法体代码;
[return 返回值];
}
// 方法调用
返回值变量 = 方法名称(实参...);
实现一个方法实现两个整数相加
public static void main(String[] args) { int a = 10; int b = 20; int ret = add(a,b); System.out.println("ret = "+ret); } private static int add(int x, int y) { return x + y; }
注意:
1. 方法定义时, 参数可以没有. 每个参数要指定类型
2. 方法定义时, 返回值也可以没有, 如果没有返回值, 则返回值类型应写成 void
3. 方法定义时的参数称为 "形参", 方法调用时的参数称为 "实参".
4. 方法的定义必须在类之中, 代码书写在调用位置的上方或者下方均可.
3.方法调用的执行过程
基本规则:
定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行.
当方法被调用的时候, 会将实参赋值给形参.
参数传递完毕后, 就会执行到方法体代码.
当方法执行完毕之后(遇到 return 语句), 就执行完毕, 回到方法调用位置继续往下执行
一个方法可以被多次调用.
示例:
计算两个整数相加
public static void main(String[] args) { int a = 10; int b = 20; System.out.println("第一次调用方法之前"); int ret = add(a, b); System.out.println("第一次调用方法之后"); System.out.println("ret = " + ret); System.out.println("第二次调用方法之前"); ret = add(30, 50); System.out.println("第二次调用方法之后"); System.out.println("ret = " + ret); } public static int add(int x, int y) { System.out.println("调用方法中!"); return x + y; }
4.实参和形参的关系
先说一下形参和实参的概念:
1.形参:
就是形式参数,用于定义方法的时候使用的参数,是用来接收调用者传递的参数的。
形参只有在方法被调用的时候,虚拟机才会分配内存单元,在方法调用结束之后便会释放所分配的内存单元。
因此,形参只在方法内部有效,所以针对引用对象的改动也无法影响到方法外。
2.实参:就是实际参数,用于调用时传递给方法的参数。
实参在传递给别的方法之前是要被预先赋值的。
注意:
在值传递调用过程中,只能把实参传递给形参,而不能把形参的值反向作用到实参上。在函数调用过程中,形参的值发生改变,而实参的值不会发生改变。
而在引用传递调用的机制中,实际上是将实参引用的地址传递给了形参,所以任何发生在形参上的改变也会发生在实参变量上。
交换俩个整形变量
public static void main(String[] args) { int a = 10; int b = 20; swap(a, b); System.out.println("a = " + a + " b = " + b); } public static void swap(int x, int y) { int tmp = x; x = y; y = tmp; }//运行结果
a = 10 b = 20
//代码, 没有完成数据的交换
对于基础类型来说, 形参相当于实参的拷贝. 即 传值调用
如果要交换基本类型的数据,需转换成数组,进行交换。
public static void main(String[] args) { int[] array = {10, 20}; System.out.println("转换之前:"); System.out.println(array[0] + " " + array[1]); swap(array); System.out.println("转换之前后:"); System.out.println(array[0] + " " + array[1]); } public static void swap(int[] array) { int tmp = array[0]; array[0] = array[1]; array[1] = tmp; return; }//运行结果
转换之前:
10 20
转换之前后:
20 10
5.没有返回值的方法
方法的返回值是可选的. 有些时候可以没有的.
代码示例:
public static void main(String[] args) { int a = 10; int b = 20; print(a, b); } public static void print(int x, int y) { System.out.println("x = " + x + " y = " + y); }