1. 什么是方法(method)
- 方法就是一个代码片段. 类似于 C 语言中的 “函数”
2. 方法定义语法
// 方法定义
public static 方法返回值 方法名称([参数类型 形参 ...]){
方法体代码;
[return 返回值];
}
// 方法调用
返回值变量 = 方法名称(实参...);
返回值的重要性:
- 避免在方法内直接输出,在调用时定义一个变量接收返回值;
- 为了支持链式表达式:可以将当前函数的返回值 作为另一个函数的参数 ,或者在另一个函数中进行运算。(一个很好的例子 计算 1! + 2! + 3! + 4! + 5!,见另一博客)。
- 代码示例: 实现一个方法实现两个整数相加。
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 中没有 “函数声明” 这样的概念。
3.方法调用的执行过程
基本规则:
- 定义方法的时候, 不执行只有调用的时候才执行。
- 当方法被调用的时候, 会将实参赋值给形参。
- 参数传递完毕后, 就会到方法体中执行代码。
- 当方法执行完毕之后(遇到 return 语句), 回到方法调用位置继续往下执行。
- 一个方法可被多次调用。
4. 实参和形参的关系
方法定义时的参数称为 “形参”, 方法调用时的参数称为 “实参”。
例:交换两个变量的值。
public class TestDemo {
public static void main(String[] args) {
int a=10;
int b=20;
swap(a,b);//a,b 为实参
System.out.println("a="+a+", b="+b);
}
public static void swap(int x,int y){
// x,y为形参
int t=x;
x=y;
y=t;
}
}
//运行结果:
a=10, b=20
- 方法swap()用来交换两个变量的值,但是通过运行发现交换未成功。
原因分析:
- 对于基础类型来说, 形参相当于实参的拷贝。即 传值调用, 对 x 和 y 的修改, 不影响 a 和 b的值。
- 在java中栈上的地址是拿不到的,只有将数据放到堆上才能完成这项工作。
解决方法:传引用类型参数 (例如数组来解决这个问题)
public class TestDemo {
public static void main(String[] args) {
int[] arr ={
10,20};
//java当中的数组是引用类型,可想象成是一个指针
//引用实际上就是一个变量 用来存储地址
//{10,20}这种数组本身就是一个对象,它在堆上
System.out.println("交换前a,b的值分别为:"+arr[0]+" "+arr[1]);
swap(arr);
System.out.println("交换后a,b的值分别为:"+arr[0]+" "+arr[1]);
}
public static void swap(int[] arr1){
int t=arr1[0];
arr1[0]=arr1[1];
arr1[1]=t;
}
}
//运行结果:
交换前a,b的值分别为:10 20
交换后a,b的值分别为:20 10
注:
- swap(arr):arr是实参;
- swap(int[] arr1):arr1 是形参:
- 调用swap方法时,将arr的内容拷贝到arr1上,此时相当于arr与arr1同时指向堆上的{10,20},这个数组,所以通过 改动 arr1 能直接影响 arr, 通过arr去访问0 ,1 下标会发现内容的变化。
5.方法的重载
- 众所周知,方法调用时类型要匹配,并且不能有两个同名的方法
- sum(int x,int y) 是实现两个int类型的加法,若要实现1.0 +1.5,是不允许的,此时需写两个方法实现不同类型的加法:sumInt(int x,int y) ,sumDouble(double x,double y),这样一个个起名过于麻烦,此时我们可以用到方法的 重载。
如下:
public class TestDemo {
public static void main(String[] args) {
System.out.println("1+2="+sum(1,2));
System.out.println("1.0+2.0="+sum(1.0,2.0));
}
public static int sum(int x,int y){
return x+y;
}
public static double sum(double x,double y){
return x+y;
}
}
运行结果:
1+2=3
1.0+2.0=3.0
什么是重载?
用一个函数同时兼容多种参数的情况。
需满足三种要求(针对同一个类):
- 方法名相同
- 方法的参数不同(参数个数或者参数类型)
- 方法的返回值类型不影响重载
例:可变参数编程:
public static void main(String[] args) {
System.out.println(sum(1,2));
System.out.println(sum(1,2,3,4));
}
//可变参数编程,传过来的数据可以看成是一个数组
//局限性:int... arr传过来的数据一定都是相同的类型
public static int sum(int... arr){
int ret=0;
for (int x:arr){
ret +=x;
}
return ret;
}
}
//运行结果:
3
10