跳至主要內容

方法

Emilia Zhen大约 3 分钟Java

方法

方法是一种语法结构,它可以把一段代码封装成一个功能,以便重复调用

  • 方法申明了具体的返回值类型,内部必须使用 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);
  }
}