Java 程序长什么样
上一篇你已经让 Java 跑起来了。现在来看看代码本身究竟由什么构成。Java 严格而明确:每个程序都必须遵循一个固定的结构,而且在任何一行代码执行之前,编译器就会检查这个结构。
下面是最小的完整 Java 程序。运行它:
只为了打印一行字,就要写这么多词,而且和 Python 或 JavaScript 不同,其中任何一个都不能省。每个部分都是必需的,所以值得弄清楚它们各自的作用。我们从外到内把它拆开来看。
一切都在类里
Java 没有漂浮在文件顶层的“散装”代码。所有代码都位于一个类中,类用 class 关键字加一个名字来声明:
public class Main {
// everything goes in here
}
开头的 { 和与之匹配的 } 标出了类的主体。Main 这个名字由你来定,但有一条重要规则:在普通的 .java 文件中,public 类的名字必须与文件名完全一致。 public class Main 应该放在 Main.java 里。大小写写错,编译器就会拒绝构建。
你会在“类”这一章学到类到底是什么。现在,先把 public class Main { ... } 当作包裹代码的必要外壳。
main 方法是起跑线
运行 Java 程序时,运行时会寻找一个特定的方法来开始执行:
public static void main(String[] args) {
// your code starts here
}
这个签名没有商量的余地。每个词都有自己的作用:
public:运行时可以从类的外部访问它。static:不用先创建这个类的对象就能运行。void:执行完毕时不返回任何东西。main:运行时要寻找的确切名字。String[] args:传给程序的所有命令行参数组成的数组。
只要有一个词不对,比如把 static 写成 Static,把 String[] args 写成 String args,你的代码可能仍然能编译,但启动时会失败,报错 Error: Main method not found in class Main。看到这条消息,几乎总是这一行有拼写错误。
语句以分号结尾
语句是一条完整的指令。在 Java 中,每条语句都以分号 ; 结尾。编译器靠分号判断一条指令在哪里结束、下一条从哪里开始,换行对它来说无关紧要。
因为换行会被忽略,这三条语句写在同一行也能运行,只是没人这样写 Java:
int score = 90; score = score + 5; System.out.println(score);
忘了写分号,编译器会在程序运行之前就拦住你:
int score = 90
System.out.println(score);
error: ';' expected
int score = 90
^
漏写分号是初学者最常遇到的编译错误。当编译器指向某一行时,也要检查它上面那一行,真正漏写的地方往往在那里。
代码块和花括号
花括号 { } 把语句组织成一个代码块。类的主体是代码块,方法的主体是代码块,if 或循环的主体也是代码块。代码块可以嵌套在代码块里:
注意它和语句的区别:开启一个代码块的行以 { 结尾,而不是分号;方法、类、if 或循环的右花括号 } 后面也不加分号。把这两者搞混,是早期的经典错误:
public static void main(String[] args) {
System.out.println("hi");
}; // <- this semicolon is unnecessary (and after a class/method, wrong)
示例中的缩进纯粹是给人看的。Java 会忽略它,但一致的缩进能让你和其他人分清哪个 { 对应哪个 }。让编辑器自动缩进,花括号就会替你对齐。
Java 区分大小写
Java 把大写和小写视为完全不同的字符。score、Score 和 SCORE 是三个不同的名字。关键字和内置名称也是一样:
如果你写成 system.out.println(小写 s),或者声明了 String Name 却试图使用 name,编译器都会拒绝。下面是初学者经常写错大小写的几个名字:
System:大写S。system.out.println(...)无法编译。String:大写S。它是一个类,和小写的基本类型不同。void、int、public、static:全部小写。它们是关键字。
大多数“cannot find symbol”错误都源于大小写写错。错误信息甚至会告诉你它找不到哪个符号,把它的大小写和你输入的对照一下就行。
把各部分组合起来
下面是一个稍大一点的程序,用到了本页的所有内容:一个类、main 方法、几条语句、一个嵌套的代码块,以及一致的大小写:
从上往下读:类包裹着一切,main 是执行开始的地方,每条指令都以 ; 结尾,if 的主体组成了自己的代码块,每个内置名称的大小写都是正确的。这基本上就是你将要编写的每个 Java 程序的骨架。
下一篇:注释
现在你已经能读懂 Java 文件的结构了。接下来要加的是写给人看的说明,也就是编译器完全忽略的文字。下一篇讲注释:// 单行注释、/* */ 块注释,以及注释什么时候才真正值得写进代码里。
常见问题
Java 程序的基本语法是什么?
每个 Java 程序都位于一个类中,程序从签名严格为 public static void main(String[] args) 的方法开始执行。语句以分号结尾,代码块用花括号 { } 组织起来。一个最小的程序是 public class Main { public static void main(String[] args) { System.out.println("Hi"); } }。
为什么 Java 需要 public static void main(String[] args)?
这是 Java 运行时要寻找的确切入口。public 让运行时可以从外部调用它,static 表示不用先创建对象就能运行,void 表示它不返回任何东西,String[] args 接收命令行参数。改动任何一个词,哪怕只是大小写,程序都能编译,但无法启动,并报错 Error: Main method not found。
所有 Java 语句都需要分号吗?
每条语句都以分号结尾:变量声明、赋值、方法调用。但以代码块结尾的行(if、for、while、类或方法的头部)以 { 结尾,而且这些代码块的右花括号 } 后面也不加分号。忘记写分号,是 Java 初学者最常见的编译错误。