方法的定义
一般情况下,定义一个方法包含以下语法:
修饰符 返回值类型 方法名(参数类型 参数名){
...
方法体
...
return 返回值;
}
方法包含一个方法头和一个方法体。下面是一个方法的所有部分:
- 修饰符:修饰符,这是可选的,告诉编译器如何调用该方法。定义了该方法的访问类型。
- 返回值类型 :方法可能会返回值。returnValueType 是方法返回值的数据类型。有些方法执行所需的操作,但没有返回值。在这种情况下,returnValueType 是关键字void。
- 方法名:是方法的实际名称。方法名和参数表共同构成方法签名。
- 参数类型:参数像是一个占位符。当方法被调用时,传递值给参数。这个值被称为实参或变量。参数列表是指方法的参数类型、顺序和参数的个数。参数是可选的,方法可以不包含任何参数。
- 方法体:方法体包含具体的语句,定义该方法的功能。
package com.xdl.java;
public class TestMethod {
public static void main(String[] args) {
// 定义分数
int score = 78;
// 调用void方法
// printGrade(score);
// 调用有返回值的方法
char s = getGrade(score);
System.out.println(s);
}
// void:没有返回值类型
public static void printGrade(double score) {
if (score < 0 || score > 100) {
System.out.println("成绩输入错误!");
return;
}
if (score >= 90.0) {
System.out.println('A');
} else if (score >= 60.0) {
System.out.println('B');
} else {
System.out.println('C');
}
}
// 带返回值的类型的方法
public static char getGrade(double score) {
if (score >= 90.0) {
return 'A';
} else if (score >= 60.0) {
return 'B';
} else {
return 'C';
}
}
}
方法调用
Java 支持两种调用方法的方式,根据方法是否返回值来选择。
当程序调用一个方法时,程序的控制权交给了被调用的方法。当被调用方法的返回语句执行或者到达方法体闭括号时候交还控制权给程序。
当方法返回一个值的时候,方法调用通常被当做一个值。
package com.xdl.java.method;
public class TestCallMethod {
public static void main(String[] args) {
int n = 5;
int m = 2;
System.out.println("before main\t:n=" + n + ",m=" + m);
swap(n, m);
System.out.println("end main\t:n=" + n + ",m=" + m);
}
// 交换2个数
public static void swap(int n, int m) {
System.out.println("before swap\t: n=" + n + ",m=" + m);
int tmp = n;
n = m;
m = tmp;
System.out.println("end swap\t:n=" + n + ",m=" + m);
}
}
传递两个参数调用swap方法。有趣的是,方法被调用后,实参的值并没有改变。
方法的重载
- 方法重载(overloading),指方法名相同,但参数不同(参数个数不同,参数类型不同,顺序不同)
- 便于记忆,便于使用
package com.xdl.java.method;
public class TestOverload {
public static void main(String[] args) {
// Java编译器会根据实参列表,寻找最匹配的方法进行调用
System.out.println("3和8的最大值:" + max(3, 8));
System.out.println("3.0和8.0最大的:" + max(3.0, 8.0));
}
// 返回谁比较大,比较的是int类型
public static int max(int num1, int num2) {
int result;
if (num1 > num2) {
result = num1;
} else {
result = num2;
}
return result;
}
// 返回谁比较大,比较的是double类型
public static double max(double num1, double num2) {
double result;
if (num1 > num2) {
result = num1;
} else {
result = num2;
}
return result;
}
// 返回谁比较大,比较的是double类型
public static double max(double num1, double num2, double num3) {
return max(max(num1, num2), num3);
}
}
如果你调用max方法时传递的是int型参数,则 int型参数的max方法就会被调用;
如果传递的是double型参数,则double类型的max方法体会被调用,这叫做方法重载;
就是说一个类的两个方法拥有相同的名字,但是有不同的参数列表。
Java编译器根据方法签名判断哪个方法应该被调用。
方法重载可以让程序更清晰易读。执行密切相关任务的方法应该使用相同的名字。
重载的方法必须拥有不同的参数列表。你不能仅仅依据修饰符或者返回类型的不同来重载方法。
方法的递归
方法调用自身,递归必须有结束条件
package com.xdl.java.method;
public class TestRecursive {
public static void main(String[] args) {
System.out.println("4的阶乘:" + fact(4));
}
// 计算一个阶乘
public static long fact(int n) {
if (n == 0) {
return 1;
}
return n * fact(n - 1);
}
}