【reading】【中文】 1.1 Essentials | 基本要素
Hello World
让我们来看看我们的第一个Java程序。运行时,下面的程序会将“Hello world!”打印到屏幕上。
对于像Python这样的语言来说,这可能看起来过于冗长。然而,这都是有原因的,我们将在接下来的几周内逐渐理解。需要注意的一些关键语法特点:
程序由一个类声明组成,使用关键字public class进行声明。在Java中,所有的代码都存在于类中。 运行的代码位于一个名为main的方法中,该方法声明为public static void main(String[] args)。 我们使用大括号{和}来表示代码段的开始和结束。 语句必须以分号结束。 这不是一本Java教材,所以我们不会详细讨论Java的语法。如果你需要参考资料,可以考虑Paul Hilfinger的免费电子书《A Java Reference》,或者如果你想要一本更传统的书,可以考虑Kathy Sierra和Bert Bates的《Head First Java》。
为了好玩,看看其他语言中的Hello World。
运行Java程序
执行Java程序最常见的方法是通过两个程序的顺序运行。第一个是Java编译器(javac),第二个是Java解释器(java)。
例如,要运行HelloWorld.java,我们会在终端中输入命令javac HelloWorld.java,然后输入命令java HelloWorld。结果会像这样:
上图中,$表示我们终端的命令提示符。你的命令提示符可能会更长。
你可能会注意到,我们在编译时包含了'.java',但在解释时没有包含'.class'。这就是它的工作方式(TIJTWII)。
练习1.1.1.在你的计算机上创建一个名为HelloWorld.java的文件,并复制粘贴上面的程序。尝试运行javac HelloWorld.java命令。看起来好像什么都没有发生。
然而,如果你查看目录,你会发现一个名为HelloWorld.class的新文件被创建了。我们稍后会讨论这是什么。
现在尝试输入java HelloWorld命令。你应该在终端上看到“Hello World!”被打印出来。
只是为了好玩。尝试使用像Notepad、TextEdit、Sublime、vim或你喜欢的任何文本编辑器打开HelloWorld.class。你会看到很多只有Java解释器才能理解的垃圾代码。这是Java字节码,我们在课程中不会讨论它。
变量和循环
下面的程序将打印出从0到9的整数。
当我们运行这个程序时,我们会看到:
这个程序的一些有趣特点可能会引起你的注意:
我们必须在使用变量之前声明它,并给它一个类型! 我们的循环定义包含在大括号{}中,被测试的布尔表达式包含在括号()中。 我们的打印语句只是System.out.print,而不是System.out.println。这意味着我们不应该包含换行符(回车)。 我们的打印语句在数字后面添加了一个空格。这样可以确保数字之间不会重叠。尝试删除空格看看会发生什么。 当我们运行它时,我们的提示符会出现在与数字同一行上(如果你愿意,你可以在下一个练习中修复这个问题)。 在这些特点中,最重要的特点是变量有一个声明的类型。我们稍后会回到这个问题,但首先,我们来做一个练习。
练习1.1.2.修改HelloNumbers,使其打印出从0到9的累加和。例如,你的输出应该以0 1 3 6 10...开始,以45结束。
此外,如果你有审美的追求,可以修改程序,使其在最后打印一个新行。
Gradescope
本课程的作业是通过一个名为gradescope的网站进行评分的。如果你正在参加与本课程配套的加利福尼亚大学课程,你将使用这个网站提交作业以获得成绩。如果你只是为了好玩,你可以使用gradescope来检查你的作业。要注册,请使用入口代码93PK75。有关gradescope和如何提交作业的更多信息,请参见gradescope指南(链接稍后提供)。
静态类型
Java最重要的特点之一是所有的变量和表达式都有所谓的静态类型。Java变量只能包含该类型的值,而且类型一旦确定就不能改变。
Java编译器的一个关键特点是它执行静态类型检查。例如,假设我们有下面的程序:
编译这个程序,我们会看到:
$ 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中,我们可以说System.out.println(5 + " ");。但在Python中,我们不能像上面那样说print(5 + "horse")。为什么会这样?
考虑下面这两个Java语句:
和
这两个语句中,第一个会成功;第二个会给出一个编译错误。由于Java是强类型的,如果你告诉它h是一个字符串,它可以连接这些元素并给你一个字符串。但是当h是一个整数时,它不能连接一个数字和一个字符串并给你一个数字。
Python不限制类型,它无法假设你想要的类型。x = 5 + "horse"应该是一个数字吗?一个字符串?Python不知道。所以它会报错。
在这种情况下,System.out.println(5 + "horse");,Java将参数解释为字符串连接,并打印出"5horse"作为结果。或者更有用的是,System.out.println(5 + " ");将在你的"5"后面打印一个空格。
System.out.println(5 + "10");会打印什么?510还是15?System.out.println(5 + 10);呢?
在Java中定义函数
在像Python这样的语言中,函数可以在任何地方声明,甚至在函数外部。例如,下面的代码声明了一个返回两个参数中较大值的函数,并使用这个函数计算并打印出8和10中较大的数:
由于所有的Java代码都是类的一部分,所以我们必须定义函数,使它们属于某个类。作为类的一部分的函数通常被称为“方法”。我们将在整个课程中交替使用这两个术语。与上面的代码相对应的Java程序如下所示:
这里的新语法是我们使用关键字public static声明了我们的方法,这是Python的def关键字的一个非常粗略的类比。我们将在下一章中看到其他声明方法的方式。
这里给出的Java代码确实看起来更冗长!你可能会认为这种编程语言会减慢你的速度,事实上,在短期内确实会减慢你的速度。把所有的东西都想象成我们还不理解的安全设备。当我们构建小型程序时,所有这些东西似乎都是多余的。然而,当我们开始构建大型程序时,我们会开始欣赏到所有额外的复杂性。
作为类比,使用Python编程有点像Dan Osman在Lover's Leap上进行自由攀岩。速度可能很快,但危险。相比之下,Java更像在这个视频中使用绳索、头盔等。
代码风格、注释、Javadoc
代码可以以许多方式变得美观。它可以简洁。它可以巧妙。它可以高效。初学者最不重视的代码方面之一是代码风格。当你作为初学者编程时,你通常只关注让它工作,而不考虑再次查看它或在很长一段时间内维护它。
在这门课程中,我们将努力保持我们的代码可读性。良好的编码风格的一些最重要特点是:
一致的风格(间距、变量命名、大括号风格等) 大小(行不宽,源文件不太长) 描述性命名(变量、函数、类),例如使用year或getUserName这样的变量或函数名称,而不是x或f。 避免重复的代码:你几乎不应该有两个几乎相同但除了一些更改之外的重要代码块。 适当的注释。Java中的行注释使用//分隔符。块(也称为多行注释)注释使用/和/。 黄金法则是:编写你的代码,使陌生人能够轻松理解。
这是课程的官方代码风格指南。值得一看!
通常情况下,我们愿意承担轻微的性能损失,只是为了让我们的代码更简单易懂。我们将在后面的章节中举例说明。
注释
我们鼓励你编写自解释的代码,即通过选择易于理解的变量名和函数名来知道发生了什么。然而,这并不总是足够的。例如,如果你正在实现一个复杂的算法,你可能需要添加注释来描述你的代码。你使用注释应该审慎。通过经验和接触他人的代码,你会对何时适合使用注释有一个感觉。
一个特殊的注意事项是,几乎所有的方法和大多数的类都应该使用所谓的Javadoc格式的注释进行描述。在Javadoc注释中,块注释以额外的星号开始,例如/**,注释通常(但不总是)包含描述性的标签。我们不会在这本教材中讨论这些标签,但可以参考上面的链接了解它们的工作原理。
作为一个没有标签的示例:
广泛使用的javadoc工具可以用来生成代码的HTML描述。我们将在后面的章节中看到示例。
接下来做什么 在每章的最后,将提供链接,让你知道可以使用到目前为止所学的材料完成哪些练习,按照应完成的顺序列出。
Homework 0
Lab 1b
Lab 1
Discussion 1