Java语言是一个出生二十几年已经成熟的编程语言了,常年霸占编程语言排行榜前三,那么现在我来告诉你该如何学习Java这门语言
那么,你想用Java编程吗?太好了,你来对地方了。在Java系列提供了一个自导介绍Java编程,从最基本的开始,并覆盖所有你需要知道要成为一个高效的Java开发人员的核心概念。这个系列是技术性的,有大量的代码示例可以帮助您在我们学习的过程中掌握概念。我假设你已经有一些编程经验,只是没有 Java。
第一篇文章介绍了 Java 平台并解释了其三个版本之间的区别:Java SE、Java EE 和 Java ME。您还将了解Java 虚拟机 (JVM)在部署 Java 应用程序中的作用。我将帮助您在您的系统上设置Java 开发工具包 (JDK),以便你可以开发和运行 Java 程序,并且我将帮助你开始了解典型 Java 应用程序的体系结构。最后,你将学习如何编译和运行一个简单的 Java 应用程序。
你可以将 Java 视为一种通用的、面向对象的语言,它看起来很像 C 和 C++,但它更易于使用并且可以让您创建更健壮的程序。不幸的是,这个定义并没有让你深入了解 Java。2000 年,Sun Microsystems(Java 平台的创始人)是这样描述 Java 的:
Java 是一种简单、面向对象、精通网络、解释型、健壮、安全、架构中立、可移植、高性能、多线程、动态计算机语言。
让我们分别考虑这些定义中的每一个。
从零开始学Java如何快速就业
Java 最初是在 C 和 C++ 之后建模的,去掉了一些可能令人困惑的特性。指针、多重实现继承和运算符重载是一些不属于 Java 的 C/C++ 特性。C/C++ 中没有强制要求但对 Java 必不可少的功能是垃圾收集工具,它可以自动回收对象和数组。
Java面向对象的重点使开发人员可以通过调整 Java 来解决问题,而不是强迫我们操纵问题以满足语言约束。这与 C 等结构化语言不同。例如,Java 让您专注于储蓄账户对象,而 C 要求您分别考虑储蓄账户状态(如余额)和行为(如存款和取款)。
Java丰富的网络库可以轻松应对 HTTP(超文本传输协议)和 FTP(文件传输协议)等传输控制协议/互联网协议 (TCP/IP) 网络协议,并简化了建立网络连接的任务。此外,Java 程序可以通过统一资源定位器 (URL) 访问 TCP/IP 网络上的对象,就像从本地文件系统访问对象一样轻松。
在运行时,Java 程序通过虚拟机(它是假设平台的软件表示)和相关的执行环境在底层平台(如 Windows 或 Linux)上间接执行。虚拟机通过解释将 Java 程序的字节码(指令和相关数据)转换为特定于平台的指令。解释是弄清楚字节码指令的含义,然后选择等效的“罐头”特定于平台的指令来执行的行为。然后虚拟机执行那些特定于平台的指令。
解释使调试有缺陷的 Java 程序变得更容易,因为在运行时可以获得更多的编译时信息。解释还可以将 Java 程序各部分之间的链接步骤延迟到运行时,从而加快开发速度。
Java 程序必须可靠,因为它们用于消费者和关键任务应用程序,从蓝光播放器到车辆导航或空中控制系统。有助于使 Java 健壮的语言特性包括声明、编译时和运行时的重复类型检查(以防止版本不匹配问题)、具有自动边界检查的真实数组以及省略指针。(请参阅“基本 Java 语言特性”以开始使用 Java 语言类型、文字、变量等。)
Java 健壮性的另一个方面是循环必须由布尔表达式而不是整数表达式控制,其中 0 为假和非零值是真的。例如,Java 不允许 C 风格的循环,例如while (x) x++;因为循环可能不会在预期的地方结束。相反,您必须明确提供一个布尔表达式,例如while (x != 10) x++;(这意味着循环将运行直到x等于 10)。
Java 程序用于联网/分布式环境。由于 Java 程序可以迁移到网络的各种平台并在其上执行,因此保护这些平台免受可能传播病毒、窃取信用卡信息或执行其他恶意行为的恶意代码的侵害非常重要。支持健壮性的 Java 语言特性(例如省略指针)与安全特性一起使用,例如 Java 沙箱安全模型和公钥加密。这些功能共同防止病毒和其他危险代码对毫无戒心的平台造成严重破坏。
理论上,Java 是安全的。在实践中,已经检测到并利用了各种安全漏洞。因此,当时的 Sun Microsystems 和 Oracle 现在继续发布安全更新。
网络连接具有基于各种微处理器和操作系统的不同架构的平台。您不能指望 Java 生成特定于平台的指令并使这些指令被作为网络一部分的各种平台“理解”。相反,Java 生成独立于平台的字节码指令,每个平台都可以轻松解释这些指令(通过其 JVM 的实现)。
架构中立有助于可移植性。然而,Java 的可移植性不仅仅是平台无关的字节码指令。考虑整数类型大小不能变化。例如,32 位整数类型必须始终有符号并占用 32 位,无论 32 位整数在哪里处理(例如,具有 16 位寄存器的平台、具有 32 位寄存器的平台或平台64 位寄存器)。Java 的库也有助于可移植性。必要时,它们提供以最可移植的方式将 Java 代码与特定于平台的功能连接起来的类型。
口译产生的性能水平通常绰绰有余。对于非常高性能的应用场景,Java 使用即时编译,它分析解释的字节码指令序列并将经常解释的指令序列编译为特定于平台的指令。随后尝试解释这些字节码指令序列会导致执行等效的特定于平台的指令,从而提高性能。
为了提高必须同时完成多项任务的程序的性能,Java 支持线程执行的概念。例如,在等待来自网络连接的输入时管理图形用户界面 (GUI) 的程序使用另一个线程来执行等待,而不是对这两个任务使用默认的 GUI 线程。这使 GUI 保持响应。Java 的同步原语允许线程在不破坏数据的情况下安全地在它们之间进行数据通信。
因为程序代码和库之间的互连是在运行时动态发生的,所以没有必要显式地链接它们。因此,当程序或其库之一发生发展时(例如,为了修复错误或改进性能),开发人员只需要分发更新的程序或库。尽管动态行为会在发生版本更改时减少分发的代码,但这种分发策略也可能导致版本冲突。例如,开发人员从库中删除类类型,或重命名它。当公司分发更新的库时,依赖于类类型的现有程序将失败。为了大大减少这个问题,Java 支持一种接口类型,这就像两方之间的合同。
解开这个定义会告诉我们很多关于 Java 的知识。最重要的是,它揭示了 Java 既是一种语言也是一种平台。在本教程的后面部分,您将了解有关 Java 平台组件的更多信息,即 Java 虚拟机和 Java 执行环境。
Sun Microsystems 于 1995 年 5 月发布了 Java 1.0 软件开发工具包 (JDK)。第一个 JDK 用于开发桌面应用程序和小程序,随后 Java 演变为包含企业服务器和移动设备编程。将所有必需的库存储在单个 JDK 中会使 JDK 太大而无法分发,特别是因为 1990 年代的分发受到小尺寸 CD 和缓慢网络速度的限制。由于大多数开发人员不需要每一个 API(桌面应用程序开发人员几乎不需要访问企业 Java API),Sun 将 Java 分为三个主要版本。这些最终被称为 Java SE、Java EE 和 Java ME:
Java Platform, Standard Edition (Java SE)
是用于开发客户端应用程序(在桌面上运行)和小程序(在 Web 浏览器中运行)的 Java 平台。请注意,出于安全原因,不再正式支持小程序。Java Platform, Enterprise Edition (Java EE )
是建立在 Java SE 之上的 Java 平台,专门用于开发面向企业的服务器应用程序。服务器端应用程序包括Java servlets,它们是类似于小应用程序但在服务器而不是客户端上运行的 Java 程序。Servlet 符合Java Servlet API。Java Platform, Micro Edition (Java ME)
也是建立在 Java SE 之上的。它是用于开发MIDlets(运行在移动信息设备上的 Java 程序)和Xlets(运行在嵌入式设备上的 Java 程序)的 Java 平台。Java SE 是 Java 的基础平台,也是 Java 101 系列的重点。代码示例将基于撰写本文时最新的 Java 版本
Java 既是一种编程语言,也是运行已编译 Java 代码的平台。该平台主要由JVM组成,但也包括支持JVM在底层(原生)平台上执行的执行环境。JVM 包括几个用于加载、验证和执行 Java 代码的组件。图 1 显示了 Java 程序如何在该平台上执行。
图 1. Java 应用程序的体系结构:JVM 提供了一个类加载器、一个字节码验证器和一个解释器/即时编译器,用于加载、验证和执行类文件。
在图的顶部是一系列程序类文件,其中一个被表示为主类文件。Java 程序至少包含主类文件,它是要加载、验证和执行的第一个类文件。
JVM 将类加载委托给它的类加载器组件。类加载器从各种来源加载类文件,例如文件系统、网络和存档文件。它们将 JVM 与类加载的复杂性隔离开来。
加载的类文件存储在内存中并表示为从Class类创建的对象。加载后,字节码验证器会验证各种字节码指令,以确保它们有效且不会危及安全性。
如果类文件的字节码无效,JVM 将终止。否则,它的解释器组件一次解释一条指令的字节码。解释识别字节码指令并执行等效的本机指令。
一些字节码指令序列比其他的更频繁地执行。当解释器检测到这种情况时,JVM 的即时 (JIT) 编译器会将字节码序列编译为本机代码以加快执行速度。
在执行期间,解释器通常会遇到执行另一个类文件的字节码(属于程序或库)的请求。发生这种情况时,类加载器加载类文件,字节码验证器在执行之前验证加载的类文件的字节码。同样在执行期间,字节码指令可能会请求 JVM 打开文件、在屏幕上显示某些内容、发出声音或执行其他需要与本机平台合作的任务。JVM 通过使用其 Java 本机接口 (JNI) 桥接技术与本机平台交互以执行任务来进行响应。
Java 包括一个大型的类文件运行时库,用于存储已编译的类和其他类型。我将其称为标准类库。您将Class在整个 Java 101 系列中遇到标准类库类型
Java 平台作为Java 运行时环境 (JRE)分发,其中包含 JVM、标准类库和一些其他项目。您将需要 JRE 和 JDK 才能开发和运行 Java 程序。从 Oracle下载的JDK包括 JRE 和开始使用 Java 开发、调试和监视应用程序所需的基本开发工具。
JDK 可用于 32 位/64 位 Linux、64 位 Mac OS X、64 位 Solaris SPARC、64 位 Solaris 和 32 位/64 位 Windows 平台。
下载并安装JDK后,你应该更新PATH环境变量以引用bin安装目录的JDK子目录,以便你可以从文件系统中的任何目录执行JDK工具。如果你需要更新说明,PATH可以在此处找到它们。(请注意,我的示例基于将命令行与命令行 Java 工具结合使用,但如果你愿意,也可以使用Java IDE。)
将你的JAVA_HOME环境变量指向JDK 的安装目录,可以启用您随后可能安装的任何依赖于 Java 的外部软件来定位您的 JDK 安装。
JDK安装目录包含各种文件和子目录,包括以下三个重要的子目录:
一旦安装了 JDK 并配置了开发环境,就可以编写第一个 Java 应用程序了。
Oracle 的Java 平台标准版 (Java SE)页面提供对最新 Java 版本的大量在线 Java SE 文档的访问。本文档包括所有标准类库类型的 API 参考。API 参考由 JDK 的javadoc工具生成。
一个应用是最低限度地实现为声明一个单个类main()方法,如下所示:
class X { public static void main(String[] args) { } }
将类视为声明方法和数据项存储位置的占位符。类声明以保留字开头class
,后跟一个强制性名称,由 表示X
,实际名称的占位符(例如,Account
)。名称后面是方法体和数据项存储位置;正文由左大括号( {)
和右大括号( })
字符分隔。
将方法视为处理输入并返回输出的命名代码块。main()
接收String
描述其输入的对象数组;该数组名为args
。每个对象标识一个string
,一个双引号字符序列(在本例中)表示一个命令行参数,例如作为其参数之一传递给应用程序的文件名。main()
不返回输出,因此它被分配了void
保留字作为其返回类型。
我的选择没有什么特别之处args
。你可以将这个数组命名为Args
、arguments
、 甚至something_else
。然而,args
通常使用。
此外,main()
的标头已分配public
,static
以便java应用程序启动器可以调用它。在这个方法头之后是一段代码;与类主体一样,方法主体由大括号字符分隔。
这是你main()
编写第一个 Java 应用程序所需的关于类和方法(尤其是)的全部知识。在以后的文章中,您将了解有关这些语言特性(以及字符串、数组、返回类型等)的更多信息。
通过展示一个输出著名的"hello, world"
消息的程序来介绍一种计算机语言是传统的做法。你可以在清单 1 中看到这一点。
class HelloWorld { public static void main(String[] args) { System.out.println("hello, world"); } }
应用程序的类名为HelloWorld
。它的main()方法执行System.out.println("hello, world")
;将" hello, world"
字符串的内容发送到标准输出流,通常是命令行。
将清单 1 存储在名为HelloWorld.java
. 然后,在命令行中,执行以下命令来编译此源文件:
javac HelloWorld.java
请注意,javac
需要.java
文件扩展名;否则,它会生成一条错误消息。如果源代码编译没有错误,您应该HelloWorld.class
在当前目录中观察。
HelloWorld.class
包含等效于HelloWorld.java
. 要通过java应用程序启动器工具运行此类文件,请执行以下命令:
java HelloWorld
请注意,java
不允许你包含.class
文件扩展名;如果你这样做,它将生成一条错误消息。
假设你已正确编写程序,您应该观察到以下输出:
hello, world
如果你看到此输出,恭喜你自己:你刚刚编译并运行了您的第一个 Java 应用程序!在本系列的其余部分将有更多示例。
我们可以通过个性化应用程序来改进清单 1。例如,我们可能想要输出hello, Java
而不是hello, world.
清单 2 增强了原始程序:
class HelloWorld { public static void main(String[] args) { System.out.println("hello, " + args[0]); } }
清单2周缩短"hello, world"到"hello, "
并追加+ args[0]
加入 args数组的第一个串到消息。然后输出结果。
"hello, " + args[0]
是一个表达式,它将args数组第一个元素中的字符串附加到hello,
。
编译清单 2 ( javac HelloWorld.java) 并使用单个命令行参数运行应用程序,如下所示:
java HelloWorld Java
你应该观察到以下输出:
hello, Java
现在假设你在HelloWorld没有任何命令行参数的情况下执行,如java HelloWorld. 在这种情况下,你会收到一个异常:
Exception in thread "main" java.lang.ArrayIndexOutOfBoundsException: Index 0 out of bounds for length 0 at HelloWorld.main(HelloWorld.java:5)
你看到的是一条错误消息,指的是代码中的异常情况。具体来说,因为没有命令行参数,args[0]所以不包含任何内容。尝试访问args[0]不存在的字符串是非法的。
在你开发 Java 应用程序时,你会遇到许多这样的消息。与其被吓倒,不如将这些消息视为纠正问题的提示。
Java SE 9 引入了 Java shell ( jshell) 作为 Java 编译器 ( javac) 和 Java 应用程序启动器 ( java) 工具的替代品。这个交互式工具对于学习 Java 语言和 API 以及制作 Java 代码原型非常方便。
使用jshell,你不必编写完整的应用程序、编译它,然后运行它只是为了尝试语言功能或 API。相反,你可以输入然后立即执行一个片段(一行或多行 Java 代码),然后观察结果。
以下是jshell从命令行执行的方法:
C:\temp>jshell
该工具以序言文本和提示进行响应:
| Welcome to JShell -- Version 12 | For an introduction type: /help intro jshell>
然后,你可以在提示符下输入代码片段或命令。要将命令与代码段区分开来,你必须在命令名称之前使用正斜杠 ( /) 字符。例如,试着看看当你输入时会发生什么 /help。
在清单 1 中,您看到了一个经典的 HelloWorld应用程序。这是 jshell等效的:
jshell> System.out.println("hello, world") hello, world jshell>
在这种情况下,我们所要做的就是指定System.out.println(“hello, world”.) (在这种情况下 我们不需要分号 [ ;] 终止符。)只要我们按下 Enter,就会jshell执行代码并显示输出。
当我们准备退出时jshell,我们只需/exit在提示符下键入,然后按Enter 即可。Java shell 将立即返回操作系统命令提示符。
关于jshell,还有很多东西要学习
关于Java开发如何学习怎么学习Java开发学习路线
我们在本教程中涵盖了很多内容。您已经了解到 Java 是一种语言和平台,并且有三个版本的 Java。您知道 JVM 如何执行 Java 类文件。您已经了解了 JRE 和 JDK 之间的区别,以及如何在您的系统上设置 JDK。您已经深入了解了 Java 应用程序的体系结构,并了解了如何使用javac和java以及较新的jshell实用程序编译源代码和执行类文件 。
虽然 Java 是一种面向对象的语言,但并非它的所有功能都是面向对象的。在下一个教程中,你将学习如何在 Java 程序中使用标识符、类型、文字和变量。你还将了解为什么以及如何记录您的代码,并且你将看到 Java 对 Unicode 的支持如何影响源代码和编译。
学习Java语言之前你必须得了解Java是一门怎样的语言,自己到底是喜欢这门语言还是单纯的感兴趣。如果你想学习这门语言不妨看看我的这份学习路线,也提供了一些学习资料从零开始学Java如何快速就业