方法的定义

一个方法是一个一旦被调用,一堆代码就会开始运行的名字。而且方法被调用后,也可能返回特定的值,方法也可以通过接受参数的传递影响运行结果。我们可以把相同的逻辑放入一个方法中,这样我们每次想调用这堆代码的时候,只需要调用方法即可。方法可以让我们的代码只需编辑一次,就能被多次调用,省去我们复写相同逻辑的麻烦。

创建方法的方式:

public class MyClass {
    public static void myMethod() {
        // code to be executed
    }
}

一个方法必须要在类中被定义,public static void myMethod()就是一个方法,pubilc static 是修饰符,决定了该方法的访问类型,如果是public代表是公开的,如果是private就是私有的,修饰符会在类的章节详细介绍。void则是该方法的返回值的数据类型,代表不返回任何数值,也可以是int, String等等数据类型。myMethod是方法的名字,之后必须紧跟着圆括号(),代表这是方法,如果有参数需要传递,则需要将参数放入括号中。之后紧跟着尖括号,编辑运行的代码。我们可以在这个方法内加上打印Hello World的代码:

public static void myMethod() {
    System.out.println("Hello World!");
}

如果要调用方法,直接调用方法的名字,加上括号即可,一个方法可以被调用多次:

public static void main(String[] args) {
    myMethod(); 
    myMethod(); 
    myMethod(); 
}

以下是更详细的方法定义示意图,接下来我们来逐个讲解:

Image result for java method header figure

参数

有用的信息可以传入方法中,当做参数。参数需要被放在方法名之后的括号内,并且需要定义好参数类型和参数的名字:

public static void printOppositeNum(int num) {
    System.out.println(0 - num);
}

在上面的代码中,我们定义了一个打印相反数的方法。传输一个整数类型的参数,然后打印出相反数,以下是调用的方法:

printOppositeNum(10); // -10
printOppositeNum(-5); // 5

我们也可以给方法传入多个参数,每个参数之间需要用逗号隔开,比如下面的例子:

public static void printName(String firstName, String lastName) {
    System.out.println("Full name: " + firstName + " " + lastName);
}

在上面的printName方法中,我们定义两个参数firstName和lastName,他们的数据类型都是字符串。我们使用带参数方法的时候,也必须参数:

String str1 = "Wang", str2 = "Xiao";
printName(str1, str2);
printName("Wang", "Xiao");

在上面的调用方法中,我们第一次调用时,传入了两个变量,第二次调用时,直接在方法中传入数值,这两种方法都会打印出相同的值。调用方法多样性可以让我们更灵活的使用方法。

返回值

在之前的方法中,方法的修饰符都用了void,代表不返回任何数据。而如果要调用方法的时候返回数据,则可以把void换为特定的数据类型,可以是基础数据类型(bolean, int, double, …)或者类的名字(String…),并在程序内部使用 return 关键词,紧跟着要返回的数据:

public class Main { 
    public static int plus5(int num) {
        return num + 5;
    }
    public static void main(String[] args) {
        int newNum = plus5(5);
        System.out.println(newNum); // 10
    }
}

在上面的 plus5 方法中,我们传入一个整数,然后加上5,并返回新的整数。调用的时候,我们可以使用这个方法,给newNum赋值。有了方法,我们的程序可以十分灵活,再来看一个例子:

public class Main {
    public static boolean isEven(int num) {
        if(num % 2 == 0) {
            return true;
        }
        return false;
    }
    public static int sum(int num1, int num2) { 
        return num1 + num2;
    }
    public static void main(String[] args) { 
        int num = 7;
        if(isEven(num)) { 
            num = sum(num, 1);
        } else {
            num = sum(num, -1);
        }
        System.out.println(num); //6
     }
}

在以上的代码中,我们定义了两个方法,一个是 isEven 用来检测输入的参数是否是偶数,然后另一个方法 sum 需要两个整数参数,并返回这两个参数的和。在 main 函数中我们同时调用了这两个方法,如果num是偶数,就加1,否则就减1。

方法重载 Method Overloading

方法重载可以让我们使用相同的方法名,来处理不同的参数,比如下面这些方法:

public int sum(int num1, int num2) {
    ...
}
public float sum(float num1, float num2) {
    ...
}
public double sum(double num1, double num2) {
    ...
}

我们来看以下的例子:

public int sum(int num1, int num2) {
    return num1 + num2;
}
public double sum(double num1, double num2) {
    return num1 + num2;
}
public static void main(String[] args) {
    System.out.println(sum(1, 2)); // 3
    System.out.println(sum(1.1, 2.4)); // 3.5
}

在上面的代码中,我们使用了不同参数,而方法会根据参数的类型调用不同的方法,第一个sum调用的是第一个sum方法,返回的是int,而第二个返回的则是double。使用方法重载,我们不需要为相同的逻辑创建不同的方法,只需要根据不同参数类型,定义另一个相同的方法名即可。

修饰符

关于方法的修饰符(public, private, final, static),在后面类和面对对象编程的章节中,我们会详细介绍,这里简单了解 static 一下即可。

static 修饰符可以让方法的适用范围变为全局,不需要通过具体的实例(实例是一个类的具体对象)来使用此方法。上面的例子中我们都是使用全局方法,如果没有static修饰符,我们则需要创建实例来调用方法:

public class Calculator {
    public sum2(int num1, int num2) {
        return num1 + num2;
    }
    public static void main(String[] args) { 
        Calculator calculator = new Calculator();
        System.out.println(calculator.sum2(1, 2)); 
    }
}

有用的方法

现在我们已经学会创建自己的方法,并使用他们。在Java中,有很多内置的函数供我们使用,我们也可以直接调用这些函数简便我们的代码编辑。

String

String是字符串类,其中有很多很多常用的函数:

  • trim() – 将前导或尾随的空格移除
  • toCharArray() – 转换成支付数组
  • substring(index, length) – 取一个子串,第一个参数是子串开始的位置,第二个参数是子串结束的指数
  • replace(s1, s2) – 把字符串中的s1变为s2
String str = "  Hello World    ";
str = str.trim(); // "Hello World"
str = str.replace("World", "Enoch"); // "Hello Enoch"
str = str.substring(6, 11); // "Enoch"
char[] charArray = str.toCharArray(); // ['E', 'n', 'o', 'c', 'h']

Math

Math是一个经常被使用的用来进行数学运算的类,以下是常用的函数:

  • min(num1, num2) – 得到两个数之间的较小数
  • sqrt(n) – 计算出n的平方根
  • pow(num, n) – 计算出num的n次方
  • floor(float) – 将浮点数变为最近的一个整数
double num1 = 14, num2 = 9.345;
double minNum = Math.min(num1, num2); // 9.345
minNum = Math.floor(minNum); // 9.0
minNum = Math.sqrt(minNum); // 3.0
minNum = Math.pow(minNum, 3); // 27.0

Arrays

Arrays, Collections, List是经常被使用操作数组的类,这个类在java.util包中,所以我们想要调用时,必须在文件的最上面加上以下的import导入此类:

import java.util.Arrays;
import java.util.List;
import java.util.Collections;
public class Main {
    ...
}

以下是常用的一些函数:

  • sort() – 将数组排序
  • toString() – 将数组变为已读的字符串
  • asList – 将数组转换成列表
  • reverse(array) – 将数组中的元素反转
Integer[] array = {5, 7, 6, 3, 4, 2, 1};
Arrays.sort(array); 
System.out.println(Arrays.toString(array)); // {1, 2, 3, 4, 5, 6, 7}
List<Integer> arrayList = Arrays.asList(array);
Collections.reverse(arrayList);
System.out.println(arrayList); // [7, 6, 5, 4, 3, 1]

实践练习

创建一个自己的方法sumList(array1, array2),参数必须是两个长度相同的数组,然后在方法中将这两个数组的元素依次相加,返回一个含有相加元素的新数组含有参数。以下是调用此方法的效果:

int[] array1 = {1, 5, 8, 9};
int[] array2 = {2, 4, 8, 1}; 
int[] sumArray = sumArray(array1, array2); // {3, 9, 16, 10}

References