本篇博客主要介绍Java中方法的基本用法,方法重载,重点需要掌握方法中实参和形参的关系。
方法就是把一段{ }代码抽出来的片段,即一个代码片段,类似于C语言当中的“函数”。
方法存在的意义:
1.当代码规模比较复杂时,能模块化组织代码。
2.做到代码被重复使用, 一份代码可以在多个位置使用。
3.让代码更好理解更简单。
4.直接调用现有方法开发, 不必重复造轮子。
基本语法:
方法定义:
public static 方法返回值 方法名称([参数类型 形参 …]){
方法体代码;
[return 返回值];
}
方法调用 :
返回值变量 = 方法名称(实参…);
该方法是否有返回值,要看这个方法它的作用或者功能是什么
比如:求某几个数(int)的和 => 我现在调用这个方法就是想知道这几个数的和是多少,当然需要有返回值告知调用者返回值是多少。
实现一个方法,接受任意一个正整数,输出每一位的数字是几 =>n传入任意一个正整数,就能输出每一位数字,不需要返回值。
代码示例:用一个方法实现两个整数相加
public class Test {
public static void main(String[] args) {
int a = 10;
int b = 20;
// 方法调用
int ret = add(a,b);
System.out.println(ret);
}
// 方法定义
//add方法接收两个整型参数,返回a + b的和
public static int add(int a,int b){
return a + b;
}
}
//运行结果
30
注意事项:
1.方法定义时,参数可以没有,如果有参数,则每个参数要指定类型。
2.方法定义时,返回值也可以没有,若没有返回值,则返回值类型应用void。
3.方法定义时的参数称为 “形参”, 方法调用时的参数称为 “实参”。
4.方法的定义必须在类之中,主方法之外, 代码书写在调用位置的上方或者下方均可。
5.Java 中没有 “函数声明” 这样的概念,只有方法的名称和参数,没有具体实现这样是不可以的。
基本规则:
1.定义方法的时候, 不会执行方法的代码. 只有调用的时候才会执行。
2.当方法被调用的时候, 会将实参赋值给形参。
3.参数传递完毕后, 就会执行到方法体代码。
4.当方法执行完毕之后(遇到 return 语句), 就执行完毕, 回到方法调用位置继续往下执行。
5.一个方法可以被多次调用。
示例:
public class Blog {
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("调用方法中 x = " + x + " y = " + y);
return x + y;
}
}
//运行结果
第一次调用方法之前
调用方法中 x = 10 y = 20
第一次调用方法之后
ret = 30
第二次调用方法之前
调用方法中 x = 30 y = 50
第二次调用方法之后
ret = 80
在Java中,方法的参数传递只有值传递,所谓的值传递就是把实参的值拷贝一份给形参,对实参没有任何影响。
示例:
public class Blog {
public static void main(String[] args) {
//x和y是主方法中的x和y,实参
int x = 10;
int y = 20;
//调用swap方法时,将x的值10和y的值20拿出来复制一份传递给a和b
swap(x,y);
System.out.println("x = " + x + ",y = " + y);
}
//调用swap时,就有实参到形参的传递,将实参的值拷贝一份赋值给形参
//swap-x = main-x = 10;swap-y = main-y = 20
private static void swap(int x, int y) {
System.out.println("调用swap方法中");
//交换的都是swap-x和swap-y对main-x和main-y不造成任何影响
int temp = x;
x = y;
y = temp;
System.out.println("x = " + x + ",y = " + y);
}
}
//运行结果
调用swap方法中
x = 20,y = 10
x = 10,y = 20
在方法外部交换两个局部变量的场景在Java中压根就不存在
解决这个问题需要引入引用数据类型(数组或对象)
注意:
方法的返回值可有可无,没有返回值的方法使用void声明,在没有返回值的方法中,仍然可以使用return;表示提前结束方法的调用。
public class MethodTest {
public static void main(String[] args) {
printNum(100);
}
//传入一个num,输出第一个从1-num的3的倍数
public static void printNum(int num){
for (int i = 1; i <= num; i++) {
if (i % 3 == 0){
System.out.println(i);
//直接终止本次方法的调用,返回调用处继续执行
return;
}
}
}
}
//运行结果
3
同一个方法名字, 提供不同版本的实现, 称为 方法重载
方法重载发生在“同一个类中”,定义了若干个方法名称相同,参数列表不同(参数的类型或者个数不同)的一组方法,与返回值无关
示例:
public static int add(int x, int y) {
return x + y;
}
public static double add(double x, double y) {
return x + y;
}
以上方法的功能为计算不同类型参数的和,功能相同,只是参数列表不同,构成重载。
针对同一个类:
方法名相同
方法的参数不同(参数个数或者参数类型)
方法的返回值类型不影响重载
示例:
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;
}
以上的三个方法只有参数类型,或者参数的个数不同,所要实现的功能都是相同的,都是计算参数的和,使用同一个名字,提供不同版本的实现,构成方法重载。
//编译错误,以下两个方法不构成方法重载,是发生了方法重复
public static void m4(int a,int b){}
public static void m4(int b,int a){}
//以下两个方法不构成重载,只是返回值类型不同
public static int add(int x, int y) {
return x + y;
}
public static double add(int x, int y) {
return x + y;
}