Hello World
让我们看看我们的第一个Java程序。 运行下面的程序打印“Hello world!” 到屏幕。
public class HelloWorld {
public static void main(String[] args) {
System.out.println("Hello world!");
}
}
一些关键的语法特征需要注意:
- 该程序由一个类声明组成,该声明使用关键字
public class
声明。 在Java中,所有代码都存在于类中。 - 运行的代码在一个名为
main
的方法内, 该方法声明为public static void main(String[] args)
。 - 用花括号
{
和}
来表示代码段的开头和结尾。 - 语句必须以分号结束。
运行一个程序
执行Java程序最常用的方法是通过一系列程序运行它。 第一个是Java编译器,或者是javac
。 第二个是Java解释器,或java
。
例如,要运行HelloWorld.java,我们将命令javac HelloWorld.java输入到终端中,然后输入命令java HelloWorld。 结果看起来像这样:
$ javac HelloWorld.java
$ java HelloWorld
Hello World!
在上图中,$表示终端的命令提示符。
您可能会注意到我们在编译时包含’.java’,但在解释时我们不包含’.class’。 这就是它的方式(TIJTWII)。
变量和循环
下面的程序将打印出0到9之间的整数。
public class HelloNumbers {
public static void main(String[] args) {
int x = 0;
while (x < 10) {
System.out.print(x + " ");
x = x + 1;
}
}
}
当我们运行这个程序时,我们看到:
$ javac HelloNumbers.java
$ java HelloNumbers
$ 0 1 2 3 4 5 6 7 8 9
这个程序的一些有趣特性可能会让你大吃一惊:
- 变量x必须在使用之前声明,并且必须给出一个类型。
- 循环定义包含在花括号内,并且测试的布尔表达式包含在括号内。
- print语句只是
System.out.print
而不是System.out.println
。这意味着我们不应该包含换行符(返回)。 - print语句在空格中添加了一个数字。这可以确保数字不会相互碰撞。尝试删除空间以查看会发生什么。
- 当我们运行它时,我们的提示最终与数字相同。
在这些特征中,最重要的是变量具有声明的类型。
静态类型
Java最重要的特性之一是所有变量和表达式都具有所谓的静态类型。Java变量可以包含该类型的值,并且只包含该类型。此外,变量的类型永远不会改变。
Java编译器的一个关键特性是它执行静态类型检查。 例如,假设我们有以下程序:
public class HelloNumbers {
public static void main(String[] args) {
int x = 0;
while (x < 10) {
System.out.print(x + " ");
x = x + 1;
}
x = "horse";
}
}
编译这个程序,我们看到:
$ javac HelloNumbers.java
HelloNumbers.java:9: error: incompatible types: String cannot be converted to int
x = "horse";
^
1 error
编译器甚至在运行之前就拒绝该程序。这是一个大问题,因为这意味着在世界上运行这个程序的人不会遇到类型错误!
这与Python等动态类型语言形成对比,用户可以在执行期间遇到类型错误!
除了提供额外的错误检查之外,静态类型还让程序员确切地知道他或她正在使用哪种对象。 我们将在未来几周看到这是多么重要。 这是我个人最喜欢的Java功能之一。
总而言之,静态类型具有以下优点:
- 编译器确保所有类型都兼容,使程序员更容易调试代码。
- 由于代码保证没有类型错误,因此编译程序的用户永远不会遇到类型错误。 例如,Android应用程序是用Java编写的,并且通常仅作为.class文件分发,即以编译格式分发。 因此,由于类型错误,这些应用程序永远不会崩溃,因为它们已经被编译器检查过了。
- 每个变量,参数和函数都有一个声明的类型,使程序员更容易理解和推理代码。
定义函数
由于所有Java代码都是类的一部分,因此我们必须定义函数,使它们属于某个类。 属于类的函数通常称为“方法”。 我们将在整个课程中互换使用这些术语。Java程序如下:
public class LargerDemo {
public static int larger(int x, int y) {
if (x > y) {
return x;
}
return y;
}
public static void main(String[] args) {
System.out.println(larger(8, 10));
}
}
这里的新语法是我们使用关键字public static声明我们的方法,这是Python的def关键字的一个非常粗略的模拟。 我们将在下一章中看到声明方法的其他方法。
代码风格,注解,Javadoc
代码在很多方面都很漂亮。它可以简洁。它可以很聪明。它可以很有效率。新手代码中最不受重视的一个方面是代码风格。 当你作为一个新手编程时,你通常会一心想要让它工作,而不必再考虑它或者长时间保持它。
在本课程中,我们将努力保持代码的可读性。 良好编码风格的一些最重要的特征是:
- 一致的风格(间距,可变命名,支撑样式等)
- 大小(不太宽的行,源文件不太长)
- 描述性命名(变量,函数,类),例如 名称为year或
getUserName
而不是x或f的变量或函数。 - 避免重复代码:除了一些更改之外,您几乎不应该有两个几乎完全相同的代码块。
- 适当的注释。 Java中的行注释使用//分隔符。 块(又名多行注释)注释使用/* 和 */。
黄金法则是:编写代码,以便陌生人易于理解。
我们鼓励您编写自我记录的代码,即通过选择变量名称和函数名称,以便于确切地知道发生了什么。 但是,这并不总是足够的。例如,如果要实现复杂算法,则可能需要添加注释来描述代码。您对评论的使用应该是明智的。 通过经验和对他人代码的接触,您会感受到评论最合适的时候。
一个特别的注意事项是,您所有的方法和几乎所有的类都应该用一个注释来描述,使用所谓的Javadoc格式。在Javadoc注释中,块注释以一个额外的星号开始,例如/**,注释通常(但不总是)包含描述性标记。我们不会在这本教科书中讨论这些标签,但是请参阅上面的链接来了解它们是如何工作的。
作为没有标签的示例:
public class LargerDemo {
/** Returns the larger of x and y. */
public static int larger(int x, int y) {
if (x > y) {
return x;
}
return y;
}
public static void main(String[] args) {
System.out.println(larger(8, 10));
}
}
广泛使用的javadoc工具可用于生成代码的HTML描述。 我们将在后面的章节中看到示例。