[Day10] CH07:站在巨人的肩膀上——方法

先来公布一下昨天的解答吧,应该画一下图就知道为什麽要这样了,这里就不再说明,因为今天要讲解一个新的概念。

import java.util.Scanner;

public class Triangle {
    public static void main(String[] argvs){
        Scanner sc = new Scanner(System.in);
        System.out.println("Please enter the edge of triangle.");
        int n = sc.nextInt();
        for(int i = 1 ; i <= n ; i++){
            for(int j = 1 ; j <= n-i ; j++){
                System.out.print(" ");
            }
            for(int j = 1 ; j <= (2*i-1) ; j++){
                System.out.print("*");
            }
            System.out.println();
        }
        sc.close();
    }
}

在处里一个大问题时,我们会将大问题切割成一个个小问题依依解决,这个做法称为 Divide and Conquer。在撰写程序的时候也是如此,我们会将程序包装成一个个「方法」(method),帮助我们模组化程序,这有助於我们设计和维护大型程序。

不知道你有没有想过,为什麽写程序前一定要打这两行呢:

public class CodeName {
    public static void main(String[] argvs){
    }
}

今天会让大家了解第二行代表的意思,第一行则还需要再等等。

main 是一个方法,从名字可知他是一个主要的方法,每一个程序一定都会有一个 main 方法。当你用 Java 命令执行 Java 虚拟机器(JVM)时,JVM 会试着呼叫你所指定之类别的 main 方法。

除了 main 方法,我们还可以自己写很多方法,写法如下:

存取叙述 static 传回值型态 方法名称(参数列){
    statement;
    return 运算式;
}
  • 存取叙述:

    • public(公开):可以在任何地方呼叫
    • private(私人):只可以在同一个类别下使用
  • static 这我们之後会再详细说明。

  • 传回值型态:就如同之前介绍过的资料型态,你想要你的方法回传是什麽型态,若不需回传则传回值型态为 void。

  • 方法名称:就和我们取变数名称一样,要取可读性高的名字。

  • 参数列:此方法的传入值,可以不只一个,若无则为空。

  • return 运算式:此方法要回传的值,void 没有此项。

看完上面的说明,你可能还是雾沙沙,那我们直接来看范例吧!

public class Maximum {
    public static void main(String[] args){
        int num1 = 5;
        int num2 = 7;
        int num3 = 4;
        myPrint();
        System.out.println(maxNum(num1, num2, num3));
    }

    public static void myPrint(){
        System.out.print("The maximum number is: ");
    }
    public static int maxNum(int a, int b, int c){
        if(a > b){
            if(a > c){
                return a;
            }
            else{
                return c;
            }
        }
        else{
            if(b > c){
                return b;
            }
            else{
                return c;
            }
        }
    }
}

先看到第一个方法 myPrint(),他没有参数列,且他是一个回传值为空的方法,所以使用 void,且不需要 return。第二个方法是 maxNum(),他有三个传入值,且他的回传型态是 int,传回三数的最大值。

若我们今天呼叫的方法在别的类别里,就需要在方法前加上类别名称:类别名称.方法名称。像是之前有使用过的 sc.nextInt(),就是使用 Scanner 类别里的 nextInt() 方法,其实你早就认识他了,还有很多方法都很常使用,多多了解可以站在巨人的肩膀上写出更厉害的程序。

方法多载(method overloading)

同一个类别中可以宣告多个同名的方法,只要这些参数列不同即可,以刚刚的例子来说,我可以宣告一个同名的 maxNum(),但因为参数列只有两个,所以程序还是可以判断你呼叫的是哪一个方法。

public class Maximum {
    public static void main(String[] args){
        int num1 = 5;
        int num2 = 7;
        int num3 = 4;
        myPrint();
        System.out.println(maxNum(num1, num2, num3));
        System.out.println(maxNum(num1, maxNum(num2, num3)));
    }

    public static void myPrint(){
        System.out.print("The maximum number is: ");
    }
    public static int maxNum(int a, int b, int c){
        if(a > b){
            if(a > c){
                return a;
            }
            else{
                return c;
            }
        }
        else{
            if(b > c){
                return b;
            }
            else{
                return c;
            }
        }
    }

    public static int maxNum(int a, int b){
        if(a > b){
            return a;
        }
        else{
            return b;
        }
    }
}

今天的东西比较抽象一点,但这还只是个开始(什麽!?),我们快要踏进物件导向的魔爪里了,大家加油!


<<:  30天轻松学会unity自制游戏-伤害敌人

>>:  食谱搜寻系统开赛罗~~

Day 07 - Spring Boot 常用依赖

正如Day 04 - Spring Boot 的前世今生所说,Spring Boot 为了简化设定提...

[Day 30] 使用ChromeDriver来做单元测试(三)

同时开启多个浏览器 有时候可能需要多个浏览器来进行测试, 譬如说用多个浏览器来测试WebSocket...

[DAY 22] 试题反映理论

试题反映理论 在试题反映理论(Item Response Theory, IRT)中 能用作因素来解...

推论 & 聚合( Inference and Aggregation)

-聚合功能 分区(Partitioning) 对数据或数据库进行分区是指将数据集分成多个部分并分别...

Day 23: 174. Dungeon Game

Day 23: 174. Dungeon Game Tag:每月挑战(2021.10.02) Sou...