方法
大约 3 分钟
方法
方法是一种语法结构,它可以把一段代码封装成一个功能,以便重复调用
- 方法申明了具体的返回值类型,内部必须使用
return返回对应类型的数据 - 形参列表可以有多个,甚至可以没有; 如果有多个形参,多个形参必须用“,”隔开,且不能给初始化值
- 如果方法不需要返回数据,返回值类型必须申明成
void(无返回值申明), 此时方法内部不可以使用return返回数据 - 方法如果没有形参列表,调用的时候则不能传入参数值,否则会报错
- 方法在类中的位置放前放后无所谓,但一个方法不能定义在另一个方法里面
public class TestSum {
public static void main(String []args) {
int res = sumBoth(1,99);
System.out.println(res);
sayHello();
System.out.println(sum(9));
// 100 Hello! 45
}
// 计算两个数的和
public static int sumBoth (int a, int b){
return a + b;
}
// 计算0-n数的和
public static int sum (int n){
int res = 0;
for(int i = 1; i <= n; i++){
res += i;
}
return res;
}
public static void sayHello (){
System.out.println("Hello!");
}
}
方法在计算机中的执行原理
- 方法被调用时,是进入栈内存中运行。
- 栈特点:先进后出,保证一个调用方法用完另一个方法后可以回来。
public class DemoMethod {
public static void main(String[] args) {
study();
}
public static void study(){
eat();
System.out.println("study");
sleep();
}
public static void eat(){
System.out.println("eat");
}
public static void sleep(){
System.out.println("sleep");
}
}
┌────────────────────┐
│┌──────────────────┐│
││ DemoMethod.class ││
││ ││
││ main ││
││ study ││
││ eat ││
││ sleep ││
│└──────────────────┘│
│ 方法区 │
└────────────────────┘
----------------------------------------------------------------------------
│ │ │┌──────────────────┐│ │ │ │┌──────────────────┐│ │ │ │ │ │ │
│ │ ││ eat ││ │ │ ││ sleep ││ │ │ │ │ │ │
│ │ ││ ││ │ │ ││ ││ │ │ │ │ │ │
│ │ ││ out.pln("eat") ││ │ │ ││ out.pln("sleep") ││ │ │ │ │ │ │
│ │ │└──────────────────┘│ │ │ │└──────────────────┘│ │ │ │ │ │ │
│ │ │┌──────────────────┐│ │┌──────────────────┐│ │┌──────────────────┐│ │┌──────────────────┐│ │ │ │ │
│ │ ││ study ││ ││ study ││ ││ study ││ ││ study ││ │ │ │ │
│ │ ││ ││ ││ ││ ││ ││ ││ ││ │ │ │ │
│ │ ││ eat() ││ ││ eat() ││ ││ eat() ││ ││ eat() ││ │ │ │ │
│ │ ││ out.pln("study") ││ ││ out.pln("study") ││ ││ out.pln("study") ││ ││ out.pln("study") ││ │ │ │ │
│ │ ││ sleep() ││ ││ sleep() ││ ││ sleep() ││ ││ sleep() ││ │ │ │ │
│ │ │└──────────────────┘│ │└──────────────────┘│ │└──────────────────┘│ │└──────────────────┘│ │ │ │ │
│┌──────────────────┐│ │┌──────────────────┐│ │┌──────────────────┐│ │┌──────────────────┐│ │┌──────────────────┐│ │┌──────────────────┐│ │ │
││ main ││ ││ main ││ ││ main ││ ││ main ││ ││ main ││ ││ main ││ │ │
││ ││ ││ ││ ││ ││ ││ ││ ││ ││ ││ ││ │ │
││ study() ││ ││ study() ││ ││ study() ││ ││ study() ││ ││ study() ││ ││ study() ││ │ │
│└──────────────────┘│ │└──────────────────┘│ │└──────────────────┘│ │└──────────────────┘│ │└──────────────────┘│ │└──────────────────┘│ │ │
│ 栈内存 │ │ 栈内存 │ │ 栈内存 │ │ 栈内存 │ │ 栈内存 │ │ 栈内存 │ │ 栈内存 │
└────────────────────┘ └────────────────────┘ └────────────────────┘ └────────────────────┘ └────────────────────┘ └────────────────────┘ └────────────────────┘
参数传递机制
传参机制为值传递,在传输实参给方法的形参的时候,传输的是实参变量中存储的值的副本
- 实参:在方法内部定义的变量
- 形参:定义方法时“(…)”中所声明的参数
- 基本类型的参数传输存储的数据值
- 引用类型的参数传输存储的地址值
public class DemoMethod {
public static void main(String[] args) {
int a = 1;
int resInt = addInt(a);
System.out.println(a); // 1
System.out.println(resInt); // 2
int[] list = new int[]{11,12,13};
System.out.println(list[2]); // 13
changeArr(list);
System.out.println(list[2]); // 9
}
public static void changeArr(int[] arr){
arr[2] = 9;
}
public static int addInt(int n){
n++;
return n
}
}
方法重载
一个类中,出现多个方法的名称相同,但是它们的形参列表是不同的,那么这些方法就称为方法重载了
- 只要方法的名称相同、形参列表不同,那么它们就是方法重载了,其它的都不管(如:修饰符,返回值类型)
- 形参列表不同指的是:形参的个数、类型、顺序不同,不关心形参名称
public class DemoMethod {
public static void main(String[] args) {
sum(9); // 45
sum(2,4); // 6
sum(5.4,2.8); // 8.2
sum(new int[]{3,6,10,92}); // 111
}
// 0-n求和
public static int sum(int n){
int res = 0;
for(int i = 1; i <= n; i++){
res += i;
}
return res;
}
// 两数求和
public static int sum(int a, int b){
return a + b;
}
// 两数求和
public static double sum(double a, double b){
return a + b;
}
// 数组求和
public static int sum(int[] arr){
int res = 0;
for(int i = 0; i < arr.length; i++){
res += arr[i];
}
return res;
}
}
return 关键字
return; 可以用在无返回值的方法中,作用是:立即跳出并结束当前方法的执行
public class DemoMethod {
public static void main(String[] args) {
division(4,2); // 2
division(3,0); // 你的数据错误!
}
public static void division(int a, int b){
if(b == 0){
System.out.println("你的数据错误!");
return;
}
int res = a/b;
System.out.println("结果是:" + res);
}
}
