在本章
1996年Java的第一个版本产生了令人难以置信的兴奋,不仅在计算机出版社,而且在纽约时报,华盛顿邮报和商业周刊等主流媒体上。 Java是第一个也是唯一一个在国家公共广播上有十分钟故事的编程语言。 仅为使用特定计算机语言的产品设立了100,000,000美元的风险投资基金。 我希望您将在本章中找到Java的简史。
在本书的第一版中,我的合作者Gary Cornell和我有这篇关于Java的文章:
“作为一种计算机语言,Java的炒作过度了:Java无疑是一种很好的编程语言。 毫无疑问,它是严肃的程序员可以使用的更好的语言之一。 我们认为它可能是一种很棒的编程语言,但它可能为时已晚。 一旦语言出现在现场,就会出现与现有代码兼容的丑陋现实。“
我们的编辑从最初开发Java的Sun Microsystems公司的一位非常高的人那里得到了很多篇幅。 Java语言有很多很好的功能,我们将在本章后面详细介绍。 它有一定的瑕疵,由于兼容性要求,该语言的一些新增功能并不像原始功能那样优雅。
但是,正如我们在第一版中已经说过的那样,Java从来就不仅仅是一种语言。 有很多编程语言,但很少有很多东西引起轰动。 Java是一个完整的平台,具有包含大量可重用代码的庞大库,以及提供跨操作系统的安全性,可移植性和自动垃圾收集等服务的执行环境。
作为程序员,您将需要一种语法令人愉快且语义可理解的语言(即不是C ++)。 与其他几种优秀语言一样,Java也符合要求。 有些语言为您提供了可移植性,垃圾收集等功能,但它们没有太多的库,如果您想要花哨的图形或网络或数据库访问,则会强迫您自己推送。 嗯,Java拥有一切 - 一种优秀的语言,一个高质量的执行环境和一个庞大的库。 这种组合使得Java成为众多程序员不可抗拒的主张。
Java的作者写了一篇有影响力的白皮书,解释了他们的设计目标和成就。 他们还发布了一个较短的概述,其中包含以下11个流行语:
在以下小节中,您将找到摘要(摘自白皮书),Java设计者对每个流行语的看法,以及基于我对当前Java版本的经验的评论。
注意
白皮书能够在
www.oracle.com/technetwork/java/langenv-140151.html
找到。你也能找到11个流行语的概览在http://horstmann.com/corejava/javaan-overview/7Gosling.pdf
我们希望构建一个可以轻松编程的系统,无需进行大量深奥的培训,并且利用了当今的标准实践。 因此,即使我们发现C++不合适,我们也尽可能地将Java设计为与C++紧密相关,以使系统更易于理解。 Java省略了许多很少使用,知之甚少,令人困惑的C++特性,根据我们的经验,这些特性带来了更多的悲伤而不是收益。
实际上,Java的语法是C++语法的清理版本。 不需要头文件,指针算法(甚至指针语法),结构,联合,运算符重载,虚拟基类等。 (有关Java和C++之间差异的更多信息,请参阅整篇文章中的C++注释。)然而,设计人员并没有尝试修复C++的所有笨拙功能。 例如,switch语句的语法在Java中没有改变。 如果你了解C++,你会发现很容易转换到Java语法。
在Java发布时,C++实际上并不是最常用的编程语言。 许多开发人员使用Visual Basic及其拖放式编程环境。 这些开发人员并没有发现Java简单。 Java开发环境花了几年才赶上。 如今,Java开发环境远远领先于大多数其他编程语言。
简单的另一个方面是小。 Java的目标之一是支持构建可在小型机器上独立运行的软件。 基本解释器和类支持的大小约为40K; 基本的标准库和线程支持(本质上是一个自包含的微内核)增加了另外175K
这是当时的一项伟大成就。 当然,库已经发展到了很大的比例。 现在有一个单独的Java Micro Edition,它有一个更小的库,适用于嵌入式设备。
简单地说,面向对象设计是一种编程技术,它专注于数据对象以及这些对象的接口。 为了与木工类比,“面向对象”的木匠主要关心的是他正在建造的椅子,其次是用于制造它的工具; 一个“非面向对象”的木匠会主要考虑他的工具。 Java的面向对象工具本质上是C++的工具。
在开发Java时,面向对象已经非常成熟。 Java的面向对象特性与C++的特性相当。 Java和C++之间的主要区别在于多重继承,Java已经用简单的接口概念取而代之。 与C++相比,Java具有更丰富的运行时自检查(在第5章中讨论)。
Java有一个广泛的例程库,用于处理HTTP和FTP等TCP / IP协议。 Java应用程序可以通过URL打开和访问网络,与访问本地文件系统时相同。
如今,人们认为这是理所当然的 - 但在1995年,从C++或Visual Basic程序连接到Web服务器是一项重大任务。
Java旨在编写必须以各种方式可靠的程序。 Java非常重视早期检查可能的问题,稍后进行动态(运行时)检查,并消除容易出错的情况。。。。 Java和C / C ++之间最大的区别在于Java有一个指针模型,可以消除覆盖内存和破坏数据的可能性。
Java编译器检测到许多其他语言仅在运行时出现的问题。 至于第二点,任何花费数小时寻找由指针错误引起的内存损坏的人都会对Java的这方面感到非常满意。
Java旨在用于网络/分布式环境。 为此,很多重点都放在了安全上。 Java可以构建无病毒,无篡改的系统。
从一开始,Java就被设计成不可能进行某些类型的攻击,其中包括:
最初,Java对下载代码的态度是“带上它!”不受信任的代码是在沙盒环境中执行的,它不会影响主机系统。 用户确信没有任何不好的事情发生,因为Java代码,无论它来自哪里,都无法逃离沙箱。
但是,Java的安全模型很复杂。 在第一版Java Development Kit发布后不久,普林斯顿大学的一组安全专家发现了一些微不足道的错误,这些错误导致不受信任的代码攻击主机系统。
最初,安全漏洞很快得到修复。 不幸的是,随着时间的推移,黑客非常善于发现安全架构实施中的细微缺陷。 Sun,然后是甲骨文,在跟上错误修复方面遇到了困难。
经过多次引人注目的攻击后,浏览器厂商和甲骨文变得越来越谨慎。 Java浏览器插件不再信任远程代码,除非它经过数字签名且用户已同意执行。
注意
即使事后看来,Java安全模型并不像最初设想的那样成功,但Java远远超过了它的时代。 Microsoft的竞争代码传递机制仅依靠数字签名来实现安全性。 显然这还不够:正如微软自己产品的任何用户都可以确认的那样,来自知名厂商的程序会崩溃并造成损害。
编译器生成与体系结构无关的目标文件格式。 在存在Java运行时系统的情况下,编译的代码可在许多处理器上执行。 Java编译器通过生成与特定计算机体系结构无关的字节码指令来实现此目的。 相反,它们的设计既易于在任何机器上进行解释,又易于在运行时转换为本机机器代码。
为“虚拟机”生成代码当时并不是一个新想法。 Lisp,Smalltalk和Pascal等编程语言已经使用了这种技术多年。
当然,解释虚拟机指令比全速运行机器指令要慢。 但是,虚拟机可以选择将最常执行的字节码序列转换为机器代码 - 一个称为即时编译的过程。
Java虚拟机还有另一个优点。 它增加了安全性,因为它可以检查指令序列的行为。
与C和C++不同,规范中没有“依赖于实现”的方面。 指定原始数据类型的大小,以及对它们的算术行为。
例如,Java中的int始终是32位整数。 在C / C ++中,int可以表示16位整数,32位整数或编译器供应商喜欢的任何其他大小。 唯一的限制是int类型必须至少与short int一样多,并且不能包含比long int更多的字节。 具有固定大小的数字类型消除了主要的移植头痛。 二进制数据以固定格式存储和传输,消除了有关字节排序的混淆。 字符串以标准Unicode格式保存。
作为系统一部分的库定义了可移植接口。 例如,有一个抽象的Window类及其UNIX,Windows和Macintosh的实现。
Window类的例子可能选择不当。 正如任何曾经尝试过的人都知道的那样,实现一个在Windows,Macintosh和十种UNIX版本上看起来不错的用户界面是一种英勇的努力。 Java 1.0做出了巨大的努力,提供了一个简单的工具包,在许多平台上提供了通用的用户界面元素。 不幸的是,结果是一个库,通过大量的工作,可以在不同的系统上提供几乎不可接受的结果。 该初始用户界面工具包已被替换,并再次替换,跨平台的可移植性仍然是一个问题。
但是,对于与用户界面无关的所有内容,Java库可以让您以独立于平台的方式工作。 您可以使用文件,正则表达式,XML,日期和时间,数据库,网络连接,线程等,而无需担心底层操作系统。 您的程序不仅可移植,而且Java API的质量通常高于原生API。
Java解释器可以直接在已移植解释器的任何机器上执行Java字节码。 由于链接是一个更加渐进和轻量级的过程,因此开发过程可以更快速和更具探索性。
这是一个真正的延伸。 任何使用过Lisp,Smalltalk,Visual Basic,Python,R或Scala的人都知道“快速和探索性”的开发过程是什么。 你尝试了一些东西,然后你立即看到了结果。 在Java存在的前20年中,开发环境并未专注于该体验。 直到Java 9,jshell工具才支持快速和探索性编程。
虽然解释的字节码的性能通常绰绰有余,但有些情况下需要更高的性能。 字节码可以即时(在运行时)转换为运行应用程序的特定CPU的机器代码。
在Java的早期阶段,许多用户不同意性能“绰绰有余”的说法。然而,今天,即时编译器已经变得非常好,以至于它们与传统编译器竞争,在某些情况下 ,甚至超越他们,因为他们有更多的信息。 例如,即时编译器可以监视频繁执行的代码,并优化该代码以提高速度。 更复杂的优化是消除(或“内联”)函数调用。 即时编译器知道已加载哪些类。 它可以使用内联,基于当前加载的类集合,永远不会覆盖特定函数,并且可以在以后必要时撤消该优化。
多线程的好处是更好的交互式响应和实时行为。
如今,我们关心并发性,因为摩尔定律已经结束。 而不是更快的处理器,我们只是得到更多,我们必须让他们忙。 然而,当你看大多数编程语言时,他们会对这个问题表现出令人震惊的无视。
Java远远超过了它的时代。 它是支持并发编程的第一种主流语言。 从白皮书中可以看出,它的动机有点不同。 当时,多核处理器很奇特,但网络编程刚刚开始,处理器花了很多时间等待服务器的响应。 需要并发编程以确保用户界面不会冻结。
并发编程绝非易事,但Java做得非常好,可以管理。
在许多方面,Java是一种比C或C++更动态的语言。 它旨在适应不断变化的环境。 库可以自由添加新方法和实例变量,而不会对客户产生任何影响。 在Java中,查找运行时类型信息非常简单。
在需要将代码添加到正在运行的程序的情况下,这是一项重要功能。 一个主要的例子是从Internet下载以在浏览器中运行的代码。 在C或C++中,这确实是一个重大挑战,但Java设计人员非常了解动态语言,这使得开发正在运行的程序变得容易。 他们的成就是将这一功能引入主流编程语言。
在Java最初取得成功后不久,微软发布了一款名为J++的产品,其编程语言和虚拟机几乎与Java相同。 这项工作未能获得成功,微软采用了另一种名为C的语言,该语言与Java有许多相似之处,但在不同的虚拟机上运行。 本书不涉及J++或C#。
这里的想法很简单:用户将从Internet下载Java字节码并在自己的机器上运行它们。 在网页上工作的Java程序称为applet。 要使用applet,您只需要一个支持Java的Web浏览器,它将为您执行字节码。 您无需安装任何软件。 每当您访问包含applet的网页时,您都会获得该程序的最新版本。 最重要的是,由于虚拟机的安全性,您永远不必担心来自恶意代码的攻击。
将小程序插入网页非常类似于嵌入图像。 applet成为页面的一部分,文本围绕用于applet的空间流动。 关键是,这个形象还活着。 它响应用户命令,改变其外观,并在呈现applet的计算机和为其提供服务的计算机之间交换数据。
图1.1显示了显示分子结构的Jmol小程序。 通过使用鼠标,您可以旋转和缩放每个分子,以更好地了解其结构。 在发明applet的时候,这种直接操作无法通过网页实现 - 只有基本的JavaScript而且没有HTML画布。
图1.1 Jmol applet
当小程序首次出现时,他们创造了巨大的兴奋。 许多人认为applet的诱惑是Java令人惊讶的流行的原因。 然而,最初的兴奋很快变成了沮丧。 各种版本的Netscape和Internet Explorer浏览器都运行了不同版本的Java,其中一些版本严重过时。 这种令人遗憾的情况使得开发利用最新Java版本的applet变得越来越困难。 相反,Adobe的Flash技术在浏览器中实现动态效果变得流行。 后来,当Java受到严重的安全问题困扰时,浏览器和Java浏览器插件变得越来越严格。 如今,它需要技巧和奉献精神才能让applet在您的浏览器中运行。 例如,如果您访问Jmol网站http://jmol.sourceforge.net/demo/aminoacids/,您可能会遇到一条消息,叮嘱您配置浏览器以允许applet运行。
本节简要介绍了Java的发展历史。 它基于各种已发布的资料来源(最重要的是在1995年7月的SunWorld在线杂志上对Java创作者的采访)。
Java可以追溯到1991年,当时由Patrick Naughton和James Gosling(Sun Fellow和全能计算机向导)领导的一群Sun工程师想要设计一种可用于有线电视等消费设备的小型计算机语言转接器。 由于这些设备没有很多电源或内存,因此语言必须很小并且生成非常严格的代码。 此外,由于不同的制造商可能会选择不同的中央处理单元(CPU),因此语言不必与任何单一架构相关联。 该项目的代号为“绿色”。
对小型,紧凑和平台中立代码的要求促使团队设计了一种可移植语言,为虚拟机生成中间代码。
Sun人员来自UNIX背景,所以他们的语言基于C ++而不是Lisp,Smalltalk或Pascal。 但是,正如Gosling在采访中所说的那样,“一直以来,语言都是一种工具,而不是结束。”Gosling决定将他的语言称为“Oak”(大概是因为他喜欢看到窗外正方形的橡树。 在Sun)。 Sun的人们后来意识到Oak是现有计算机语言的名称,所以他们将名称改为Java。 结果证明这是一个灵感的选择。
1992年,绿色项目推出了第一款名为“* 7”的产品。它是一款极其智能的遥控器。 不幸的是,没有人有兴趣在Sun生产这种产品,绿色人必须找到其他方式推销他们的技术。 但是,没有一家标准的消费电子公司也对此感兴趣。 然后,该小组竞标一个项目,设计一个有线电视盒,可以应对新兴的有线电视服务,如视频点播。 他们没有得到合同。 (有趣的是,这家公司由同样的Jim Clark领导,他创办了Netscape–一家为Java带来巨大成功的公司。
Green项目(新名称为“First Person,Inc。”)花费了整个1993年和1994年的一半,寻找人们购买其技术。 找不到人。 (Patrick Naughton,该集团的创始人之一,最终完成大部分市场营销的人,声称已经积累了30万英里试图出售该技术。)第一人称于1994年解散。
虽然所有这些都在Sun发生,但互联网的万维网部分正在变得越来越大。 万维网的关键是浏览器将超文本页面翻译成屏幕。 1994年,大多数人使用Mosaic,这是一种非商业性的网络浏览器,于1993年在伊利诺伊大学的超级计算中心出来。(马赛克部分由Marc Andreessen作为工作研究项目的本科生编写,每小时6.85美元。 作为Netscape的联合创始人之一和技术总监,他继续成名。)
在SunWorld的采访中,Gosling说,在1994年中期,语言开发人员意识到“我们可以构建一个真正酷炫的浏览器。 它是客户端/服务器主流中为数不多的需要我们所做的一些奇怪事情的东西之一:架构中立,实时,可靠,安全问题,这些问题在工作站世界中并不是非常重要。 所以我们建立了一个浏览器。“
实际的浏览器由Patrick Naughton和Jonathan Payne构建,并演变为HotJava浏览器,旨在展示Java的强大功能。 浏览器能够在网页内执行Java代码。 这种“技术证明”于1995年5月23日在SunWorld '95上展出,并激发了今天持续的Java热潮。
Sun在1996年初发布了Java的第一个版本。人们很快意识到Java 1.0不会为严肃的应用程序开发而削减它。 当然,您可以使用Java 1.0创建一个紧张的文本小程序,在文本中随机移动文本。 但你甚至无法在Java 1.0中打印。 说实话,Java 1.0还没有准备好迎接黄金时段。 其后续版本1.1填补了最明显的空白,大大提高了反射能力,并为GUI编程添加了新的事件模型。 不过,它仍然相当有限。
1998年JavaOne会议的重大新闻是即将发布的Java 1.2,它将早期的toylike GUI和图形工具包替换为复杂的可扩展版本。 在1998年12月发布后的三天(!),Sun的营销部门将名称更改为吸引人的Java 2标准版软件开发套件1.2版。
除标准版外,还推出了另外两个版本:用于嵌入式设备(如手机)的Micro Edition和用于服务器端处理的企业版。 本书侧重于标准版。
标准版的1.3和1.4版本是对初始Java 2版本的逐步改进,标准库不断增长,性能提升,当然还有一些bug修复。 在此期间,关于Java applet和客户端应用程序的大量最初宣传已经减少,但Java成为服务器端应用程序的首选平台。
5.0版是自1.1版以来的第一个版本,它以重要的方式更新了Java语言。 (此版本最初编号为1.5,但在2004 JavaOne会议上版本号跳跃到5.0。)经过多年的研究,增加了泛型类型(大致相当于C ++模板) - 挑战是添加此功能而不需要 虚拟机中的更改。 其他一些有用的语言功能受到C#的启发:“for each”循环,自动装箱和注释。
版本6(没有.0后缀)于2006年底发布。同样,没有语言更改,但额外的性能改进和库增强。
随着数据中心越来越依赖商用硬件而不是专用服务器,Sun Microsystems陷入困境,并于2009年被Oracle收购.Java的开发已经停滞了很长时间。 2011年,Oracle发布了一个新版本,具有简单的增强功能,如Java 7。
2014年,随后发布了Java 8,近二十年来Java语言发生了最重大的变化。 Java 8采用“函数”编程风格,可以很容易地表达可以同时执行的计算。 所有编程语言都必须不断发展才能保持相关性,Java已经表现出了非凡的能力。
Java 9的主要功能可以追溯到2008年。那时,Java平台的首席工程师Mark Reinhold开始努力打破巨大的单片Java平台。 这是通过引入模块,提供特定功能的自包含代码单元来实现的。 设计和实现一个非常适合Java平台的模块系统花了十一年的时间,它是否也非常适合Java应用程序和库,还有待观察。 Java 9于2017年发布,具有我们在本书中介绍的其他吸引人的功能。
从2018年开始,Java版本每六个月发布一次,以便更快地引入功能。 某些版本(如Java 11)被指定为长期支持版本。
表1.1显示了Java语言和库的演变。 如您所见,应用程序编程接口(API)的大小已经大大增加。
表1.1 Java语言进化
版本 | 年份 | 新语言特性 | 类和接口的数量 |
---|---|---|---|
1.0 | 1996 | 语言本身 | 211 |
1.1 | 1997 | 内部类 | 477 |
1.2 | 1998 | strictfp修饰符 | 1524 |
1.3 | 2000 | None | 1840 |
1.4 | 2002 | 断言 | 2723 |
5.0 | 2004 | 泛型类,“for each”循环,可变参数,自动装箱,元数据(注解),枚举,静态引入 | 3279 |
6 | 2006 | None | 3793 |
7 | 2011 | 用string进行switch,钻石操作符(等号后面的泛型类只写<>),二进制字面值,异常处理增强 | 4024 |
8 | 2014 | lambda表达式,接口有默认方法,流和日期/时间库 | 4240 |
9 | 2017 | 模块,杂项语言和库增强 | 6005 |
本章最后列出了一些关于Java的常见误解。
Java是HTML的扩展。
Java是一种编程语言; HTML是一种描述网页结构的方法。 除了用于在网页上放置Java小程序的HTML扩展之外,它们没有任何共同之处。
我使用XML,所以我不需要Java。
Java是一种编程语言; XML是一种描述数据的方法。 您可以使用任何编程语言处理XML数据,但Java API包含对XML处理的出色支持。 此外,许多重要的XML工具都是用Java实现的。 有关更多信息,请参见第二卷。
Java是一种易于学习的编程语言。
没有像Java那样强大的编程语言。 你总是需要区分编写玩具程序的容易程度和认真工作的难度。 另外,请考虑本书中只有七章讨论Java语言。 这两卷的其余章节展示了如何使用Java库使语言工作。 Java库包含数千个类和接口以及数万个函数。 幸运的是,你不需要知道它们中的每一个,但你确实需要知道很多人使用Java来实现任何真实的东西。
Java将成为所有平台的通用编程语言。
这在理论上是可能的。 但在实践中,存在其他语言根深蒂固的领域。 Objective C及其后继者Swift将不会在iOS设备上被替换。 浏览器中发生的任何事情都由JavaScript控制。 Windows程序是用C ++或C#编写的。 Java在服务器端编程和跨平台客户端应用程序方面具有优势。
Java只是另一种编程语言。
Java是一种很好的编程语言; 大多数程序员更喜欢C,C ++或C#。 但是有数百种优秀的编程语言从未广泛流行,而具有明显缺陷的语言,如C ++和Visual Basic,已经取得了巨大的成功。
为什么? 编程语言的成功更多地取决于它周围的支持系统的效用,而不是其语法的优雅。 是否有适用于您需要实现的功能的有用,方便和标准的库? 是否有工具供应商可以构建出色的编程和调试环境? 语言和工具集是否与其他计算基础架构集成? Java是成功的,因为它的库使您可以轻松地执行诸如网络,Web应用程序和并发之类的操作。 Java减少指针错误这一事实是一个额外的好处,因此程序员似乎更有效地使用Java - 但这些因素并不是其成功的源泉。
Java是专有的,因此应该避免使用。
首次创建Java时,Sun向分销商和最终用户提供免费许可。 虽然Sun拥有对Java的最终控制权,但他们还涉及许多其他公司开发语言修订和新库的设计。 虚拟机和库的源代码一直是免费提供的,但仅用于检查,而不是用于修改和重新分发。 Java是“封闭源代码,但玩得很好”。
这种情况在2007年发生了巨大变化,当时Sun公布了未来版本的Java将以通用公共许可证(GPL)提供,这是Linux使用的相同开源许可证。 Oracle致力于保持Java开源。 美国药膏专利只有一种。 根据GPL,每个人都获得使用和修改Java的专利授权,但仅限于桌面和服务器平台。 如果要在嵌入式系统中使用Java,则需要使用不同的许可证,并且可能需要支付版税。 但是,这些专利将在未来十年内到期,届时Java将完全免费。
Java被解释,因此对于严肃的应用程序来说太慢了。
在Java的早期,语言被解释了。 如今,Java虚拟机使用即时编译器。 代码的“热点”在Java中的运行速度与在C ++中一样快,在某些情况下甚至更快。
所有Java程序都在网页中运行。
所有Java小程序都在Web浏览器中运行。 这是applet的定义 - 在浏览器中运行的Java程序。 但是大多数Java程序都是在Web浏览器之外运行的独立应用程序。 实际上,许多Java程序在Web服务器上运行并生成网页代码。
Java程序是一个主要的安全风险。
在Java的早期,有一些关于Java安全系统故障的广为人知的报告。 研究人员认为,在Java盔甲中找到缝隙并挑战applet安全模型的强度和复杂性是一项挑战。 他们发现的技术故障都很快得到纠正。 后来,有更严重的漏洞,Sun和后来的Oracle反应太慢了。 浏览器制造商通过默认停用Java来做出反应,甚至可能反应过度。 为了更好地考虑这一点,请考虑Windows可执行文件中导致真正悲痛的大量病毒攻击,但对受攻击平台的弱点的批评却令人惊讶。 即使在创建20年后,Java也比任何其他常用的执行平台更安全。
JavaScript是Java的简单版本。
JavaScript是一种可以在网页内部使用的脚本语言,由Netscape发明,最初称为LiveScript。 JavaScript的语法让人想起Java,语言的名称听起来很相似,但它们是无关的。 特别是,Java是强类型的 - 编译器捕获由类型滥用引起的许多错误。 在JavaScript中,只有在程序运行时才会发现这样的错误,这使得它们的消除变得更加费力。
使用Java,我可以用便宜的“Internet设备”替换我的台式计算机。
当Java首次发布时,有些人认为这将会发生。 公司生产了由Java驱动的网络计算机的原型,但是用户还没有准备好为没有本地存储的有限机器放弃功能强大且方便的桌面。 当今,世界已经发生了变化,对于绝大多数终端用户而言,重要的平台是手机或平板电脑。 这些设备中的大多数都是由Android平台控制的,Android平台是Java的衍生产品。 学习Java编程也可以帮助您进行Android编程。