cnTIL

https://lovelacelee.github.io/cnTIL

This project is maintained by lovelacelee

命令行程序

有了数据类型,数据运算前置知识,了解完函数式编程的流程控制,就能完成基本命令行程序了。

输入输出

入门级的输出:

System.out.println();//带换行
System.out.print();//不带换行的输出 ==C的printf==Python的print()

格式化输出, 详细的格式化参数请参考JDK文档java.util.Formatter

public class Main {
    public static void main(String[] args) {
        double d = 3.1415926;
        System.out.printf("%.2f\n", d); // 显示两位小数3.14
        System.out.printf("%.4f\n", d); // 显示4位小数3.1416
    }
}

控制台输入

import java.util.Scanner;//依赖Scanner才能实现

public class Main {
    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in); // 创建Scanner对象
        System.out.print("Input your name: "); // 打印提示
        String name = scanner.nextLine(); // 读取一行输入并获取字符串
        System.out.print("Input your age: "); // 打印提示
        int age = scanner.nextInt(); // 读取一行输入并获取整数
        System.out.printf("Hi, %s, you are %d\n", name, age); // 格式化输出
    }
}

条件控制

IF ELSE

这与C语言完全一致,Nothing to note.

Swich

旧写法与C一致,新语法如下->可以简化写法,如果有多条语句,需要用{}括起来。不要写break语句,因为新语法只会执行匹配的语句,没有穿透效应。

public class Main {
    public static void main(String[] args) {
        String fruit = "apple";
        switch (fruit) {
        case "apple" -> System.out.println("Selected apple");
        case "pear" -> System.out.println("Selected pear");
        case "mango" -> {
            System.out.println("Selected mango");
            System.out.println("Good choice!");
        }
        default -> System.out.println("No fruit selected");
        }
    }
}

switch语句返回值

public class Main {
    public static void main(String[] args) {
        String fruit = "orange";
        int opt = switch (fruit) {
            case "apple" -> 1;
            case "pear", "mango" -> 2;
            default -> {
                int code = fruit.hashCode();
                yield code; // switch语句返回值
            }
        };
        System.out.println("opt = " + opt);
    }
}

循环

While

While和Do While语法与C完全一致

For

for each循环

public class Main {
    public static void main(String[] args) {
        int[] ns = { 1, 4, 9, 16, 25 };
        for (int n : ns) {
            System.out.println(n);
        }
    }
}

和for循环相比,for each循环的变量n不再是计数器,而是直接对应到数组的每个元素。for each循环的写法也更简洁。但是,for each循环无法指定遍历顺序,也无法获取数组的索引。

除了数组外,for each循环能够遍历所有“可迭代”的数据类型,包括后面会介绍的List、Map等。

Break and Continue

All as same as C programming language, nothing to tell.

参数解析

Java程序的入口是main方法,而main方法可以接受一个命令行参数,它是一个String[]数组。

这个命令行参数由JVM接收用户输入并传给main方法:

public class Main {
    public static void main(String[] args) {
        for (String arg : args) {
            System.out.println(arg);
            
            if ("-version".equals(arg)) {
                System.out.println("v 1.0");
                break;
            }
        }
    }
}

这太无用了,深知C语言里自己解析和使用命令行参数是多么的无助(Eggache)

Java里命令行参数解析一般用Apache的Common-CLI

1.下载common-cli 2.包引入 我们只需要其中的两个 jar 文件: commons-cli-1.4.jar:类文件,将它加入到 CLASSPATH 后就能使用了。 commons-cli-1.4-javadoc.jar:API 文档(JavaDoc),用浏览器访问。

Commons-CLI 使用 Commons-CLI 中的类位于 org.apache.commons.cli 包,相关的类有:

命令行参数解析分为 3 个阶段,分别是 定义、解析、询问 阶段。