上课前一晚交:你必须在2月9日星期四晚上10:00之前完成阅读练习和Java家教练习。这些练习只根据完成情况评分,而不是根据正确性评分,如课程一般信息中所述。
阅读练习获得学分:右边是一个大的红色登录按钮。只有在你做阅读练习时登录,你才能获得学分。
课前交作业:你必须在2月10日星期五上午11:00课前完成习题集0第一部分。
目标
学习基本的Java语法和语义
从编写Python到编写Java的转变
Java集合
第一语言基础教程讨论了数组,数组是一系列对象或基本值的固定长度容器。Java为管理对象集合提供了许多更强大、更灵活的工具:Java集合框架。
列表、集和映射
Java列表类似于Python列表。列表包含零个或多个对象的有序集合,其中同一对象可能出现多次。我们可以在列表中添加和删除条目,这些条目将根据其内容进行增减。
6.031中的软件
安全,易于理解,易于更改
今天正确,在未知的未来正确。与未来的程序员,包括未来的你,进行清晰的沟通。旨在适应变化而不重写。
Java入门
接下来的几节链接到Java教程网站,让您快速掌握基础知识,并通过阅读练习检查您的理解。
在阅读了教程页面之后,在Eclipse中使用6.031的Java教程来练习所学内容。
本文和其他参考资料将经常向您介绍javaapi文档,其中描述了Java中内置的所有类。
语言基础
阅读语言基础。
在Java教程中,完成基本Java类别,以便用绿色复选标记完全选中它,如下所示:
然后回答一些关于Java的基础知识与Python的基础知识相比如何的问题来检查您的理解:
数字和字符串
如果您发现包装类的数量令人困惑,请不要担心。他们是。
在Java教程中,完成数字和字符串类别:
使用对象
读取对象(包括它下面的两页,创建对象和使用对象)。
你好,世界!
读你好世界!
您应该能够创建一个新的HelloWorldApp.java文件,输入该教程页面中的代码,编译并运行程序以查看HelloWorldApp!在控制台上。
快照图
快照图表示程序在运行时的内部状态—其堆栈(正在进行的方法及其局部变量)和堆(当前存在的对象)。
通过图片相互交谈(在课堂和团队会议上)
举例说明基本类型与对象类型、不可变值与不可变引用、指针别名、堆栈与堆、抽象与具体表示等概念。
帮助解释团队项目的设计(相互之间和TA之间)。
为后续课程中更丰富的设计符号铺平道路。例如,快照图在6.170中概括为对象模型。
虽然本课程中的图表使用java的例子,但是符号可以应用到任何现代编程语言,例如Python、JavaScript、C++、Ruby。
基本值
原语值由裸常量表示。传入箭头是对变量或对象字段中的值的引用。
对象值
对象值是按其类型标记的圆。当我们想显示更多的细节时,我们在里面写字段名,箭头指向它们的值。更详细地说,这些字段可以包括它们声明的类型。有些人喜欢写作 x:内景 而不是 int x,但两者都很好。
变异值与重新分配变量
快照图为我们提供了一种可视化更改变量和更改值之间区别的方法:
指定给变量或字段时,您正在更改变量的箭头指向的位置。你可以把它指向一个不同的值。
当您为可变值(如数组或列表)的内容赋值时,您正在更改该值内的引用。
重新分配和不可变值
例如,如果我们有一个 字符串 变量 s、 我们可以从 "“一个” 到 "ab”。
字符串 是一个例子 不变的 类型,其值一旦创建就永远不会更改的类型。不变性(对变化的免疫力)是本课程的一个主要设计原则,我们将在以后的阅读中详细讨论。
在快照图中,不可变对象(由其设计器设计为始终表示相同的值)由双边框表示,如 字符串 图中的对象。
可变值
相比之下, 字符串拼接 (另一个内置Java类)是 可变的 表示字符串的对象,并且它具有更改对象值的方法:
这两个快照图看起来非常不同,这是好的:可变性和不可变性之间的差异将在使代码免受bug攻击方面发挥重要作用。
不可变引用
Java还为我们提供了不可变的引用:只分配一次而从不重新分配的变量。要使引用不可变,请使用关键字final声明它:
如果Java编译器不确信最终变量在运行时只分配一次,那么它将产生一个编译器错误。final提供了对不可变引用的静态检查。
在快照图中,不可变的引用(final)由双箭头表示。这是一个id永远不会改变的对象(它不能被重新分配到不同的数字),但是它的年龄可以改变。
注意,我们可以有一个对可变值(例如:final StringBuilder sb)的不可变引用,即使我们指向同一个对象,它的值也可以更改。
我们还可以有一个对不可变值的可变引用(如字符串s),其中变量的值可以更改,因为它可以被重新指向不同的对象。
Java描述Python
int count=lst.size();count元素数count=len(lst)
第一条增加(e);将元素追加到末尾lst.append(e)
if(lst.isEmpty())…测试列表是否为空如果不是lst:。。。
在快照图中,我们表示 列表 作为索引绘制为字段的对象:
此列表 城市 可能代表从波士顿到波哥大的旅行á 去巴塞罗那。
A 地图 类似于 Python字典。 在Python中 钥匙 地图的 可散列的。Java有一个类似的需求,我们将在面对Java对象之间如何实现相等时讨论这个需求。
例子 地图 操作:
Java描述Python
put(key,val)添加映射键→ val映射[key]=val
get(key)获取键map[key]的值
containsKey(key)测试map中是否有key
删除映射del map[key]
在快照图中,我们表示 地图 作为包含键/值对的对象:
这个 海龟 地图包含 乌龟 分配给的对象 字符串 钥匙:鲍勃、巴克敏斯特和巴斯特。
集合是零个或多个唯一对象的无序集合。与数学集或Python集一样,与列表不同的是,对象不能在一个集中多次出现。要么进去要么出去。与映射的键一样,Python集中的对象必须是可哈希的,Java也有类似的要求。
集合操作示例:
Java描述Python
s1.包含(e)如果集合在s1中包含元素e,则进行测试
s1.所有(s2)测试s1⊇ s2 s1.发行人(s2)
s1>=s2
s1.removeAll(s2)从s1中删除s2 s1.difference\u update(s2)
s1-=s2
在快照图中,我们将集合表示为没有名称字段的对象:
这里我们有一组整数,没有特定的顺序:42、1024和-7。
直接常量
Python为创建列表提供了方便的语法:
lst=[“a”,“b”,“c”]
和地图:
map={“苹果”:5,“香蕉”:7}
Java没有。它确实为数组提供了文字语法:
String[]arr={“a”,“b”,“c”};
但这会创建一个数组,而不是一个列表。我们可以使用实用函数Arrays.asList从数组创建列表:
Arrays.asList(新字符串[]{“a”,“b”,“c”})
…或直接从论点:
Arrays.asList(“a”,“b”,“c”)
用Arrays.asList创建的列表有一个限制:它的长度是固定的。
泛型:声明列表、集合和映射变量
与Python集合类型不同,对于Java集合,我们可以限制集合中包含的对象的类型。添加项时,编译器可以执行静态检查,以确保只添加适当类型的项。然后,当我们取出一个项目时,我们可以保证它的类型是我们期望的类型。
以下是声明一些变量以保存集合的语法:
List城市;//字符串列表
Set数字;//一组整数
Map<String,Turtle>turtles;//带有字符串键和海龟值的映射
由于泛型的工作方式,我们无法创建基元类型的集合。例如,Set不起作用。但是,正如我们前面看到的,int有一个整数包装器,我们可以使用它(例如Setnumbers)。
为了更容易地使用这些包装器类型的集合,Java进行了一些自动转换。如果我们声明了Listsequence,那么下面的代码可以工作:
sequence.add(5); //在序列中加5
int second=sequence.get(1);//获取第二个元素
ArrayList和LinkedList:创建列表
我们很快就会看到,Java帮助我们区分类型的规范——它做什么以及实现——代码是什么?
List、Set和Map都是接口:它们定义了这些类型的工作方式,但不提供实现代码。有几个优点,但一个潜在的优点是,我们这些类型的用户可以在不同的情况下选择不同的实现。
下面是如何创建一些实际列表:
ListfirstNames=new ArrayList();
ListlastNames=new LinkedList();
如果左侧和右侧的泛型类型参数相同,Java可以推断出发生了什么,并为我们节省一些输入:
ListfirstNames=new ArrayList<>();
ListlastNames=new LinkedList<>();
ArrayList和LinkedList是List的两个实现。两者都提供List的所有操作,并且这些操作必须按照List的文档中所描述的方式工作。在本例中,名字和姓氏的行为方式相同;如果我们交换了使用ArrayList和LinkedList的代码,我们的代码就不会中断。
不幸的是,这种选择能力也是一种负担:我们不关心Python列表是如何工作的,为什么要关心Java列表是ArrayLists还是linkedlist?因为唯一的区别是性能,对于6.031我们没有。
如有疑问,请使用ArrayList。
哈希集和哈希映射:创建集和映射
HashSet是我们对集合的默认选择:
Setnumbers=新HashSet<>();
Java还通过TreeSet实现提供排序集。
对于映射,默认选择是HashMap:
Map<String,Turtle>turtles=new HashMap<>();
迭代
所以也许我们有:
Listcities=new ArrayList<>();
Setnumbers=新HashSet<>();
Map<String,Turtle>turtles=new HashMap<>();
一个非常常见的任务是遍历我们的城市/数字/海龟/等等。
在Python中:
for city in cities:
print city
for num in numbers:
print num
for key in turtles:
print “%s: %s” % (key, turtles[key]);
Java提供了类似的语法来迭代列表和集合中的项。
以下是Java:
for (String city : cities) {
System.out.println(city);
}
for (int num : numbers) {
System.out.println(num);
}
我们不能这样迭代映射本身,但我们可以像在Python中那样迭代键:
for (String key : turtles.keySet()) {
System.out.println(key + ": " + turtles.get(key));
}
在后台,这种for循环使用迭代器,这是一种我们将在后面的类中看到的设计模式。
使用索引迭代
如果您愿意,Java提供了不同的for循环,我们可以使用它的索引遍历列表:
For(int ii=0;ii<cities.size();(ii++){
System.out.println(cities.get(ii));
}
除非我们真的需要索引值ii,否则这段代码是冗长的,有更多的地方可以隐藏bug。避免。
Java API文档
上一节提供了许多指向类文档的链接,这些类是Java平台API的一部分。
API代表应用程序编程接口。如果你想编写一个与Facebook对话的应用程序,Facebook会发布一个API(事实上,对于不同的语言和框架,不止一个API),你可以针对它进行编程。javaapi是一组非常有用的工具,用于编程几乎所有的东西。
String是字符串的全名。我们可以使用“双引号”创建String类型的对象。
Integer和其他基本包装类。在大多数情况下,Java自动地在原语和包装(或“装箱”)类型之间进行转换。
List类似于Python列表,但在Python中,列表是语言的一部分。在Java中,列表是用…Java实现的!
java.util.Map类似于Python字典。
File表示磁盘上的文件。看看文件提供的方法:我们可以测试文件是否可读,删除文件,查看最后修改的时间…
FileReader允许我们读取文本文件。
BufferedReader让我们能够高效地读取文本,它还提供了一个非常有用的特性:一次读取一整行。
让我们仔细看看BufferedReader的文档。这里有许多与Java特性相关的东西我们还没有讨论!保持头脑清醒,专注于下面用粗体表示的事情。
页面顶部是BufferedReader的类层次结构和实现接口的列表。BufferedReader对象具有所有这些类型的所有方法(加上它自己的方法)可供使用。
接下来我们将看到直接子类,对于接口,实现类。例如,这可以帮助我们发现HashMap是Map的一个实现。
下一步:课程描述。有时这些描述有点迟钝,但这是你应该去了解一个类的第一个地方。
如果您想创建一个新的BufferedReader,首先要查看构造函数摘要。构造函数不是Java中获取新对象的唯一方法,但它们是最常见的方法。
下一步:方法摘要列出了我们可以在BufferedReader对象上调用的所有方法。
下面是每个方法和构造函数的详细描述。单击构造函数或方法以查看详细说明。这是理解方法的第一步。
每个详细描述包括:
方法签名:我们看到返回类型、方法名称和参数。我们也看到例外。目前,这些通常意味着该方法可能遇到的错误。
完整的描述。
参数:方法参数的描述。
以及方法返回内容的描述。
规格
这些详细说明是规范。它们允许我们使用诸如String、Map或BufferedReader之类的工具,而无需阅读或理解实现它们的代码。
阅读、写作、理解和分析规范将是我们在6.031中的第一个主要任务之一,从几节课开始。
阅读练习
此时你应该已经完成了上面的所有阅读练习。
要检查您的阅读练习状态,请参阅Omnivore上的classes/02 basic java。
完成阅读练习后,你就可以在每次班会开始时准备纳米测验了,并且必须在课前10点之前提交练习。
在这一点上,您还应该完成Java教程的以下级别:
与以下作者合作:Saman Amarasinghe、Adam Chlipala、Srini Devadas、Michael Ernst、Max Goldman、John Guttag、Daniel Jackson、Rob Miller、Martin Rinard和Armando Solar Lezama。本作品获得CC BY-SA 4.0许可。