大道至简在本教程中,Java 语言的一些基本编程概念。我们从一些简单的程序开始,涉及变量、常量和基本数据类型,讲解控制台的读写操作,同时也会提及字符串格式化。
Java 简单示例
我们从一个非常简单的代码示例开始。以下代码需放入Simple.java文件中,此处命名很重要 ——Java 程序的公共类名必须与文件名一致。
// com/test/Hello.java
package com.test;
public class Hello {
public static void main(String[] args) {
System.out.println("This is Java");
}
}
Java 代码从一开始就有严格的组织规则:一个 Java 代码文件可以包含一个或多个类,但其中只能有一个类被声明为public。
包(Package)
package com.hello;
包用于将 Java 类按功能分组,类似于其他编程语言中的命名空间或模块。对于简单示例,包声明可以省略(此时会创建默认包),但本教程中所有示例都使用包。另一个要点是:目录结构必须与包名一致。例如,包名为com.test的源文件Hello.java必须放在com/test/目录下,且package语句必须是源文件的第一行。
类(Class)
public class Simple {
...
}
类是 Java 程序的基本构建块。public关键字表示该类可被无限制访问。上述代码是一个类定义,其主体以左花括号{开始,右花括号}结束。一个源文件中只能有一个public类。
此外,类名必须与文件名一致(如Hello.java对应类Hello),且类名通常以大写字母开头。
主方法(main method)
public static void main(String[] args) {
...
}
main是一个方法,用于启动程序,是每个控制台 Java 程序的入口点。方法是为完成特定任务而编写的代码块,能使程序更具模块化。
- static:静态方法,无需创建类的实例即可调用;
- void:表示方法不返回值;
- public:使主方法可被外部无限制访问。
控制台输出
System.out.println("This is Java");
在主方法中,该语句将字符串字面值"This is Java"打印到控制台。每条语句必须以分号;结尾。这是一个方法调用:调用System类的println方法,System类代表控制台应用的标准输入、输出和错误流。
执行程序
$ java Simple.java
This is Java
使用java工具执行程序(Java 11 及以上支持直接执行单个源文件)。
Java 控制台读取输入
第二个示例展示如何从控制台读取值:
// com/test/ReadLine.java
package com.test;
import java.util.Scanner;
public class ReadLine {
public static void main(String[] args) {
System.out.print("Write your name:");
Scanner sc = new Scanner(System.in);
String name = sc.nextLine();
System.out.println("Hello " + name);
}
}
程序会在终端显示提示,用户输入姓名后,值会被读取并打印回终端。
导入类(Import Class)
import java.util.Scanner;
Java 标准库中的类按包组织,Scanner类用于读取输入。使用import关键字导入类后,可直接使用类名(无需完整包名)。
打印提示
System.out.print("Write your name:");
print方法打印消息但不换行,用户可在消息后直接输入。
创建 Scanner 实例
Scanner sc = new Scanner(System.in);
使用new关键字创建Scanner对象,参数System.in表示从标准输入流(终端)读取数据。Scanner可解析基本类型和字符串。
读取输入
String name = sc.nextLine();
调用nextLine方法读取终端输入的一行内容,返回值存储在String类型的变量name中。
输出结果
System.out.println("Hello " + name);
使用+运算符拼接字符串和变量,打印结果。
$ java ReadLine.java
Write your name:John Doe
Hello John Doe
Java 命令行参数
Java 程序可接收命令行参数,参数在运行程序时跟随在程序名之后:
// com/test/CommandLineArgs.java
package com.test;
public class CommandLineArgs {
public static void main(String[] args) {
for (String arg : args) {
System.out.println(arg);
}
}
}
主方法参数
public static void main(String[] args)
主方法接收一个String数组args,用于存储命令行参数。数组是数据的集合,声明格式为类型[] 变量名。
遍历参数数组
for (String arg : args) {
System.out.println(arg);
}
使用增强型for循环遍历数组,依次打印每个参数。循环次数等于数组元素个数,每次循环将数组元素赋值给arg变量。
$ java CommandLineArgs.java 1 2 3 4 5
Java 变量
变量是存储数据的空间,包含名称和数据类型,数据类型决定了变量可存储的值(如整数、字符串、布尔值等)。Java 中,变量在使用前会被初始化为其类型的默认值。
// com/test/Variables.java
package com.test;
public class Variables {
public static void main(String[] args) {
String city = "New York";
String name = "Paul"; int age = 34;
String nationality = "American";
System.out.println(city);
System.out.println(name);
System.out.println(age);
System.out.println(nationality);
city = "London";
System.out.println(city);
}
}
- String city = "New York";:声明String类型变量city并初始化为"New York";
- String name = "Paul"; int age = 34;:可在同一行声明多个变量(建议每行一条语句以提高可读性);
- city = "London";:变量可重新赋值。
$ java Variables.java
New York
Paul
34
American
London
var 关键字(Java 10+)
对于有初始值的局部变量,可使用var关键字替代数据类型,编译器会从初始化值推断类型:
// com/test/VarKeyword.java
package com.zetcode;
public class VarKeyword {
public static void main(String[] args) {
var name = "John Doe";
var age = 34;
System.out.println(name + " is " + age + " years old");
}
}
var name = "John Doe";中,编译器推断name为String类型;var age = 34;中推断age为int类型。使用var时必须初始化变量。
Java 常量
常量与变量不同,其初始值不可修改,使用final关键字声明:
// com/test/Constants.java
package com.zetcode;
public class Constants {
public static void main(String[] args) {
final int WIDTH = 100;
final int HEIGHT = 150;
int var = 40;
var = 50;
// WIDTH = 110; // 编译错误:无法修改final变量
}
}
- final int WIDTH = 100;:声明常量WIDTH,约定常量名用大写字母;
- 若取消注释WIDTH = 110;,会报错:无法为final变量WIDTH赋值。
Java 字符串格式化
在编程中,从变量构建字符串是常见需求。Java 通过String.format方法实现字符串格式化(不支持动态语言的变量插值):
// com/zetcode/StringFormatting.java
package com.zetcode;
public class StringFormatting {
public static void main(String[] args) {
int age = 34;
String name = "William";
String output = String.format("%s is %d years old.", name, age);
System.out.println(output);
}
}
- %s:字符串占位符,对应name变量;
- %d:整数占位符,对应age变量。
$ java StringFormatting.java
William is 34 years old.