什么是方法?
在编程中某段功能的代码可能频繁使用到,如果在每个位置都重新实现一遍,会有一些缺点,比如:
- 使程序变得繁琐
- 开发效率低下,做了大量重复性的工作
- 不利于维护,需要改动时,所有用到该段代码的位置都需要修改
- 不利于复用
因此,在编程中我们也可以将频繁使用的代码封装成“方法”(方法就是一个代码片段. 类似于 C 语言中的 “函数”),需要时直接拿来使用即可,避免了一遍一遍的累赘。
方法定义
方法语法格式:
修饰符 返回值类型 方法名称(参数类型 参数…){
方法体代码
【return 返回值】
}
//示例:
public int func(int num){
System.out.println(num);
return num;
}
注:
- 修饰符:比如public、private等。有多种类型,不同类型有不同意义(后续介绍)
- 返回值类型:如果方法有返回值,返回值类型必须要与返回的实体类型一致;如果没有返回值,则必须写成void
- 方法名称:小驼峰命名
- 参数列表:如果没有参数()内则不需要写;如果有参数,需要指定参数类型,多个参数之间用,隔开
- 方法体:写方法内部要执行的语句
- 特别说明:在Java中,方法必须写在类中;方法不能嵌套定义;没有方法声明的说法
实参和形参的关系
在Java中,实参的值永远都是拷贝到形参中(形参是实参的临时拷贝),形参和实参本质是两个实体
//用形参x、y来接收实参传递的10、20
public static int add(int x,int y){
return x+y;
}
public static void main(String[] args) {
int ret = add(10,20);
}
但是这样的写法会有一些问题,比如:
//交换a和b的值
public static void swap(int x,int y){
int tmp = x;
x = y;
y = tmp;
}
public static void main(String[] args) {
int a = 10;
int b = 20;
System.out.println(a); //10
System.out.println(b); //20
swap(a,b); //交换a和b的值
System.out.println(a); //10
System.out.println(b); //20
}
我们明明已经将a和b的值交换了,为什么打印初来的结果还是没有交换呢?
原因:
就像上面说的,实参a和形参x是完全不同的俩个实体,实参b和形参y也是俩个完全不同的实体。他们仅仅只是因为拷贝的原因值相同而已,再没有什么关系。在调用swap方法时,交换的是x和y的值。对main函数中的a和b没有影响。
解决:
对于基础类型来说,形参是实参的临时拷贝,即”传值调用“。
我们需要的是“传址调用”,但Java中没有指针的概念,所以我们需要用到引用类型,通过传递引用类型的参数来解决问题。
public static void swap(int[] arr){
int tmp = arr[0];
arr[0] = arr[1];
arr[1] = tmp;
}
public static void main(String[] args) {
int[] arr = {10,20};
System.out.println(arr.toString()); //打印原数组内容
swap(arr);
System.out.println(arr.toString()); //打印交换后的数组内容
}
没有返回值的方法
方法的返回值是可选的。有时可能没有,在没有返回值的时候就需要把返回值类型写为void
// 只需要打印a的值 不需要用到返回值
public static void print(int x){
System.out.println(x);
}
public static void main(String[] args) {
int a = 10;
print(a);
}
方法重载
对于同一个方法,我们根据不同的场景可能需要使用不同的参数列表,按照以往的知识,我们需要创建不同的方法来满足不同需求,这就意味着我们需要起不同的方法名,而取名字本来就是让人头疼的事情。那能否将所有的方法都使用一个方法命呢? 当然可以,这就是方法的重载。
//实现加法
public static void add(int x){
System.out.println(x);
}
public static void add(int x,int y){
System.out.println("x |" + "y");
}
public static void add(double x,double y){
System.out.println("x | " + "y");
}
注:
- 方法名必须相同
- 参数列表必须不同(即参数的个数不同、参数的类型不同、参数的次序不同)
- 与返回值类型是否相同无关
- 在方法调用时,编译器会对实参类型进行判断,根据判断的结果来确定调用哪个方法
方法签名
在同一个作用域中不能定义两个相同名称的标识符。比如:在一个方法中不能定义两个名字一样的变量。那为什么类中就可以定义方法名相同的方法(方法重载)呢? 这就是方法签名的缘故!
方法签名:即方法经过编译器编译修改之后最终的名字(具有唯一性),他与我们最开始对他的命名不同。而系统使用的方法名是方法签名,不是我们的命名。所以可以起相同名称的方法名。
方法签名的具体形成方式:方法全路径名+参数列表+返回值类型