发表时间:2022-03-24来源:网络
简单性
我们希望构建一个无须深奥的专业训练就可以进行编程的系统,并且要符合当今的标准惯例。因此,尽管我们发现C++不太适用,但在设计Java的时候还是尽可能地接近C++,以便系统更易于理解。Java剔除了C++中许多很少使用、难以理解、容易混淆地特性。在我们看来,这些特性带来地麻烦远远多于它们地好处。
的确,Java地语法是C++的一个“纯净”版本。这里没有头文件、指针运算(甚至指针语法)、结构、联合、操作符重载、虚基类等。然而,设计者并没有试图清除C++中所有不适当的特性。例如,switch语句的语法在Java中就没有改变。
“简单”的另一个方面是小。Java的目标之一是支持开发能够在小型机器上独立运行的软件。基本的解释器以及类支持大约仅为40KB,再加上基础的标准类库和线程的支持(基本上是一个自包含的微内核),大约需要增加175KB。
面向对象
简单地讲,面向对象设计是一种程序设计技术。它讲重点放在数据(即对象)和对象地接口上。用木匠打一个比方:一个“面向对象的“木匠始终首先关注的是所制作的椅子,其次才是所使用的工具;一个”非面向对象的“木匠主要考虑的是所用的工具。再本质上,Java的面向对象能力与C++是一样的。
开发Java时面向对象技术已经相当成熟。Java的面向对象特性与C++旗鼓相当。Java与C++的主要不同点在于多重继承,在Java中,取而代之的时简单的接口概念。与C++相比,Java提供了更丰富的运行时自省功能。
分布式
Java是一个丰富的例程库,用于处理像HTTP和FTP之类的TCP/IP协议。
Java应用程序能够通过URL打开和访问网络上的对象,其便捷程度就像访问本地文件一样。
健壮性
Java的设计目标之一在于使得Java编写的程序具有多方面的可靠性。Java非常强调进行早期的问题检测、后期动态的(运行时)检测,以及消除容易出错的情况————Java与C/C++最大的不同在于Java采用的指针模型可以消除重写内存和损坏数据的可能性。
Java编译器能够检测许多在其他语言中仅在运行时才能够检测出来的问题。至于第二点,对于曾经花费几个小时来检查由于指针bug而引起内存冲突的人来说,一定很喜欢Java的这一特性。
安全性
Java要适用于网路/分布式环境。为了实现这个目标,安全性颇受重视。使用Java可以构建防病毒、防篡改的系统。
从一开始 ,Java就设计成能够防范各种攻击,其中包括:
运行时堆栈溢出,这是蠕虫和病毒常用的攻击手段。破坏自己的进程空间之外的内存。未经授权读写文件。原先,Java对下载代码的态度是“尽管来吧!”。不可信代码在一个沙箱环境中运行,在这里它不会影响主系统。用户可以确信不会发生不好的事情,因为Java代码不论来自哪里,都不能脱离沙箱。
不过,Java的安全模型非常复杂,Java开发包(Java Development Kit,JDK)的第一版发布后不久,普林斯顿大学的一些安全专家就发现一些小bug会允许不可信的代码攻击主系统。
最初,安全bug可以快速修复。遗憾的是,经过一段时间之后,黑客已经很擅长找出安全体系结构实现中的小漏洞。Sun以及之后的Oracle为不断修复bug经历了一段很是艰难的日子。
遭遇多次高调攻击之后,浏览器开发商和Oracle开始越来越谨慎。Java浏览器插件不再信任远程代码,除非代码有数字签名而且用户同意执行这个代码。
注释:现在看来,尽管Java安全模型没有原先预想的那么成功,但Java在那个时代,确实相当超前。微软提供了一种与之竞争的代码交付机制,其安全性完全依赖于数字签名。显然这是不够的,因为微软自身产品的任何用户都可以证实,一些知名开发商的程序确实崩溃并对系统产生危害。
体系结构中立
编译器生成一个体系结构中立的目标文件格式,这是一种编译过的代码,只要Java运行时系统,这些编译后的代码可以i在许多处理器上运行。Java编译器通过生成与特定的计算机体系结构无关的字节码指令来实现这一特性。精心设计的字节码不仅可以很容易地在任何机器上解释执行,而且还可以动态地转换本地机器代码。
当时,为“虚拟机”生成代码并不是一个新思路。诸如Lisp、Smalltalk和Pascal等编程语言多年前就已经采用了这种技术。
当然,解释型虚拟机指令肯定会比全速运行机器指令慢很多。不过,虚拟机有一个选项,可以将执行最频繁的字节码序列转换成机器码,这一过程称为即时编译。
Java虚拟机还有一些其他优点。它可以检查指令序列的行为,从而增强其安全性。
可移植性
与C和C++不同,Java规范中没有“依赖具体实现”的地方。基本数据类型的大小以及有关运算的行为都有明确的说明。
例如,Java中的int永远为32位的整数,而在C/C++中,int可能是16位整数、32位整数,也可能是编译器开发商指定的任何其他大小。唯一的限制只是int的字节数不能低于short int,并且不能高于long int。在Java中,数值类型有固定的字节数,这消除了代码移植时一个令人头痛的主要问题。二进制数据以固定的格式进行存储和传输,消除了字节顺序的困扰。字符串则采用标准的Unicode格式存储。
解释型
Java解释器可以在任何移植了解释器的机器上直接执行Java字节码。由于连接是一个增量式且轻量级的过程,所以,开发过程也变得更加快捷,更加具有探索性。
高性能
尽管对解释后的字节码性能已经比较满意,但在有些场合下还需要更高的性能。字节码可以(在运行时)动态的转换成对应运行这个应用的特定CPU的机器码。
使用Java的头几年,许多用户不同意“对性能已经比较满意”的说法。不过,现在的即时编译器已经非常出色,可以与传统编译器相媲美,而且在某些情况下甚至超越了传统编译器,原因是它们有更多的可用信息。例如,即时编译器可以监控哪些代码频繁执行,并优化这些代码以提高速度。更为复杂的优化是消除函数调用(即“内联”)。即时编译器知道哪些类已经加载。基于当前加载的类集合,如果一个特定的函数不会被覆盖,就可以使用内联。必要时,以后还可以撤销这种优化。
多线程
多线程可以带来更快的交互响应和实时行为。
并发程序设计绝非易事,不过Java在这方面表现很出色,可以很好的管理这个工作。
动态性
从很多方面来看,Java与C或C++相比更加具有动态性。它能够适应不断发展的环境。库中可以自由的添加新方法和实例变量,而对客户端却没有任何影响。在Java中找出运行时类型信息十分简单。
当需要为正在运行的程序增加代码时,动态性将是一个非常重要的特性。一个很好的例子:从Internet下载代码,然后在浏览器上运行。如果使用C或C++,这确实难度很大,不过Java设计者很清楚动态语言可以很容易的实现运行程序的演进。最终,他们将这一特性引入这个主流程序设计语言中。
Java术语
术语名缩写解释Java Development Kit(Java开发工具包)JDK编写Java程序的程序员使用的软件Java Runtime Environment(Java运行时环境)JRE运行Java程序的用户使用的软件Server JRE(服务器JRE)——在服务器上运行Java程序的软件Standard Edition(标准版)SE用于桌面或简单服务器应用的Java平台Enterprise Edition(企业版)EE用于复杂服务器应用的Java平台Micro Edition(微型版)ME用于小型设备的Java平台Java FX——用于图形化用户界面的一个备选工具包,在Java11之前的某些Java SE发布版本中提供。OpenJDKJ2一个过时的术语,用于描述1998~2006年之间的Java版本Software Development Kit(软件开发工具包SDK一个过时的术语,用于描述1998~2006年之间的JDKUpdateuOracle公司的术语,表示Java 8 之前的bug修正版本NetBeans——Oracle公司的集成开发环境已经看到,JDK 是Java Development Kit的缩写。有点混乱的是:这个工具包的版本1.2~版本1.4被称为Java SDK。在某种场合下,还可以看到这个过时的术语。在Java10之前,还有一个术语是Java运行环境(JRE),它只包括虚拟机。这并不是开发人员想要的,只是专门为不需要编译器的用户提供。
接下来,你会看到大量的JavaSE,相对于JavaEE和JavaME,JavaSE是Java标准版。
Java2这种提法始于1998年。当时Sun公司的销售人员感觉以增加小数点后面数值的方式改变版本号并没有反映出JDK1.2的重大改进。但是,由于在发布之后才意识到这个问题,所以他们决定开发工具包的版本号仍然沿用1.2,接下来的版本是1.3、1.4和5.0。不过,Java平台被重新命名为Java2。因此,就有了Java2 Standard Edition Software Development Kit(Java2 标准版软件开发包)5.0版,即 J2SE SDK 5.0。
幸运的是,2006年版本号得到简化。Java标准版的下一个版本取名为 JavaSE 6 ,后来,又有了Java SE 7 和Java SE 8。
不过,”内部“版本号却分别是1.6.0、1.7.0和1.8.0。到了Java SE 9,这种混乱终于终结,版本号变为9,以及后来的9.0.1.(为什么没有使用9.0.0作为初始版本呢?为了保留一点兴奋感,版本号规范要求在主版本和第一次安全更新之间的短暂间隔中删除版本号末尾的零。)
在Java9之前,有32位和64位两个版本的Java开发工具包。现在Oracle公司不再开发32位版本。要使用 OracleSDK,你需要有一个64位的操作系统。
对于Linux,还可以在RPM文件和**.taz.gz文件**之间做出选择。我们建议使用后者,这样可以在你希望的任何位置直接解压缩这个压缩包。
下载JDK之后,需要安装这个开发工具包并明确要在哪里安装,后面还会需要这个信息。
在Windows上,启动安装程序,会询问你要在哪里安装JDK。最好不要接受路径名中包含空格的默认位置,如:C:\Program Files\Java\jdk-11.0.x。取出路径名中Program Files 部分就可以了。在Mac上,运行安装程序。这会把软件安装到/Library/Java/JavaVirtuaMachines/jdk-11.0.x.jdk/Contents/Home。用查找功能找到这个目录。在Linux上,只需要把 .tar.gz 文件解压缩到你选择的某个位置,如你在的主目录,或者 /opt 。如果从RPM文件安装,则要反复检查是否安装在 /usr/java/jdk-11.0.x 上。解释:安装目录用jdk表示。例如,谈到jdk/bin 目录时,是指 /opt/jdk-11.0.4/bin 或者 C:\Java\jdk-11.0.4\bin 目录。
在Windows或Linux上安装JDK时,还需要另外完成一个步骤:将jdk/bin 目录添加到可执行路径中——可执行路径是操作系统查找可执行文件时所遍历的目录列表。
在Linux中,需要在 ~/.bashrc 或 ~/.bash_profile 文件的最后增加这样一行:
export PATH=jdk/bin:$PATH # 一定要使用JDK的正确路径,如:/opt/jdk-11.0.4。在Windows10中,在 Windows Settings(Windows设置)的搜索栏中键入 environment(环境),选择 Edit environment variables for your account(编辑账户的环境变量,参图 2-1)。会出现一个Environment Variables(环境变量)对话框。(它可能隐藏在Windows设置对话框后面。如果实在找不到,可以同时按住Windows和R键打开Run(运行)对话框,从这个对话框运行 system.cpl,然后选择Advanced(高级)标签页,再点击Environment Variables(环境变量)按钮。)在User Variables(用户变量)列表中找到并选择一个名为Path的变量。点解Edit(编辑)按钮,再点击New(新建)按钮,增加一个变量,值为jdk\bin 目录(参考图2-2)。
保存所做的设置。之后新打开的所有命令提示窗口都会正确的路径。
可以按如下方式测试是否正确:打开一个终端窗口,键入(参考图2-3)




如果得到诸如”javac: command not found“(javac:命令未找到)或”The name specified is not recoginzed as an internal or external command,operable program or batch file“(指定名不是一个内部或外部命令、可执行的程序或批文件)的信息,就需要退回去反复检查你的安装。
提示: src.zip文件中包含了所有公共类库的源代码。要想获得更多的源代码(例如编译器、虚拟机、原生方法以及私有辅助类),请访问网站 http://openjdk.java.net。
文档包含一个压缩文件中,它是一个独立于JDK的压缩文件。可以直接从网站 **http://www.oracle.com/technetwork/java/javase/downloads**下载这个文档。步骤如下:
1、下载文档压缩文件。这个文件名为 jdk-11.0.x_doc-all.zip。2、解压缩这个文件,将 doc目录重命名为一个更有描述性的名字,如 javadoc。如果愿意,可以从命令行完成这个工作:jar xvf Downloads/jdk-11.0.x_doc-all.zip mv docs jdk-11-docs 3、在浏览器中导航到 jdk-11-docs/index.html,将这个页面增加到书签。还要安装的程序案例。可以从 http://hostmann.com/corejava 下载示例。这些程序打包在一个 zip文件 corejava.zip中。可以将程序解压缩到你的主目录。它们会放在目录 corejava中。如果愿意,可以从命令行完成这个工作:
jar xvf Downloads/corejava.zip如果以前有过使用 Microsoft Visual Studio等开发环境编程的经验,你可能会习惯于有一个内置文本编辑器、用于编译和启动程序的菜单以及调试工具的系统。JDK完全没有这些功能。所有工作都要在终端窗口中键入命令来完成。这听起来很麻烦,不过确实是一个基本技能。第一次安装Java时,你可能希望在安装开发环境之前检查Java的安装是否正确。另外,通过自己执行这些基本步骤,你可以更好的理解开发环境的后台工作。
不过,掌握了编译和运行Java程序的基本步骤之后,你可能就会希望使用专业的开发环境。
首先介绍比较难的方法:从命令行编译并运行Java程序。
1、打开一个终端窗口。
2、进入 corejava/v1ch02/Welcome目录(corejava是安装示例源代码的目录中,请参看2.1.3节的解释)。
3、键入下面的命令:
javac Welcome.java java Welcome然后,将会在终端窗口中看到图2-3 所示的输出。
祝贺你!你已经编译并运行了第一个Java程序。
那么,刚才发生了什么?javac程序是一个Java编译器,它将文件Welcome.java编译成Welcome.class。java 程序启动Java虚拟机,虚拟机执行编译器编译到类文件中得字节码。
Welcome程序非常简单,它只是向终端输出了一条信息。你可能想查看程序清单2-1的程序代码。
程序清单 2-1 Welcome/Welcome.java
上一节中,已经了解了如何从命令行编译和运行一个Java程序。这是一个很有用的排错技能,不过对于大多数日常工作来说,还是应当使用集成开发环境。这些环境非常强大,非常方便,不使用这些集成环境简直有些不合理。我们可以免费得到一些很棒的开发环境,如Eclpse、IntelliJ
IDEA 和 NetBeans。
首先从网站 http://eclipse.org/downloads 下载Eclipse。Eclipse 已经有面向 Linux、Mac OSX 和 Windows 版本。运行安装程序,并选择
“Ecplipse IDE for Java Developers”。
下面是用Eclipse编写的一般步骤:
启动Eclipse之后,从菜单选择File -> New -> Project。
从向导对话框中选择 Java Project(如图2-5所示)。
3.点击 Next 按钮,不选中“User default location”复选框。点击 Browse 导航到 corejava/v1ch02/Welcome目录(图2-6)。
4.点击 Finish 按钮。,这个工程已经创建完成了。
5.点击工程窗口左边窗格中的三角,知道找到Welcome.java 并双击这个文件。现在应该看到一个包含程序代码的窗格(如图2-7所示)。
6.用鼠标右键点击左侧窗格中的工程名(Welcome),选择 Run -> Run As -> Java Application。程序输出会显示在控制台窗格中。
之前假定这个程序没有输入错误或 bug (毕竟,这段代码只有几行)。为了说明问题,假设在代码中不小心出现了录入错误(或者甚至语法错误)。试着讲原来的程序修改一下,让它包含一些录入错误,例如,将 String 的大小写弄错:
注意 string 下面的波浪线。点击源代码下标签页中的 Problems ,展开小三角,直到看到一个错误信息指出有一个未知的 string 类型(见图2-8)。点击这个错误信息。光标会移到编辑窗格中相应的代码行,可以在这里纠正错误。利用这个特性可以快速地修正错误。
提示:通常,Eclipse 错误报告会伴有一个灯泡图标。点击这个图标可以得到解决这个错误地建议方案列表。

Java 9 引入了另一种使用Java地方法。JShell 程序提供了一个”读取—计算—打印循环“(Read-Evaluate-Print Loop,REPL)。键入一个Java表达式;JShell 会评估你地输入,打印结果,等待你的下一个输入。
要启动 JShell ,只需要在终端窗口键入 jshell(参加图2-9)。
JShell 首先向你显示一个问候语,后面是一个提示符:
| Welcome to JShell -- Version 9.0.1 | For an introduction type: /help intro jshell>现在键入一个表达式,如下:
"Core Java".lenght()JShell 会回应一个结果——在这里就是字符串”Core Java“ 中的字符个数。
$1 ==> 9注意,你并没有键入 System.out.println。JShell 会自动打印你输入的每一个表达式的值。输出中的 $1表示这个结果可以用于将来的计算。例如,如果你键入:
5 * $1 - 3
就会得到:
如果需要多次使用一个变量,可以给它指定一个容易记忆的名字。不过,一定要遵循 Java 语法,需要同时指定类型和变量名。例如:
jshell> int answer = 6 * 7 answer ==> 42另一个有用的特性是”tab 补全“。如果键入:
Math.然后再按一次Tab键。你会得到可以在 generator变量上调用的所有方法的一个列表(参见图 2-9):
现在键入 l,然后再按一次 Tab 键。方法名会自动补全为 log,现在你会得到一个比较小的列表:
jshell> Math.log log( log10( log1p(接下来你可以手工填入其余的部分:
jshell> Math.log10(0.001) $3 ==> -3.0要重复运行一个命令,可以连续按 ⬆ 键,直到看到想要重新运行或编辑的命令行。可以用 ⬅ 和 ➡ 键移动命令行中的光标位置,然后增加或删除字符。编辑完命令后再按回车。例如,把命令行中的0.001替换为1000,然后按回车:
jshell> Math.log10(1000) $4 ==> 3.0JShell 会让Java语言和类库的学习变得轻松而有趣,他不要求你启动一个庞大的开发环境,不会让你再为 public static void main 而困扰。
注释: 根据Java语言规范,main方法必须声明为public(Java语言规范是描述Java语言的官方文档。可以从网站http://docs.oracle.com/javase/specs)上阅读或下载。
不过,当main方法不是public时,有些版本的Java 解释器也可以执行Java应用程序。一个程序员报告了这个bug。如果感兴趣的话,可以在网站http://bugs.java.com/bugdatabase/index.jsp 上输入bug号码 4252539 查看。1999年这个bug被标记为”关闭,不予修复。“(Closed,Will not be fixed.)Sun公司的一个工程师解释说:Java虚拟机规范(在 http://docs.oracle.com/javase/specs/jvms/se8/html) 并没有强制要求main方法一定是公有的(public),并且”修复了这个bug有可能带来其他的隐患“。好在,这个问题最终得到了解决。在Java 1.4 及以后的版本中强制main方法必须是public。
从上面这段话可以发现几个有趣的方面。一方面,让质量保证工程师关于bug报告做出决定不仅让人生疑,也让他们自己很头疼,因为他们的工作量大,并且工程师对Java的所有细节也未必了解得很清楚。另一方面,Sun公司在Java开源很久以前就把bug报告及其解决方案放在网站上让所有人监督检查,这是一种非常了不起得举动。某些情况下,Sun公司甚至允许程序员为他们最厌恶得bug投票,并用投票结果来决定发布的下一个JDK版本将修复哪些bug。
C++ 注释: 作为一名 C++ 程序员,一定知道类的概念。Java 的类与 C++ 很相似,但有些差异还是会使人感到困惑。例如,Java 中的所有函数都是某个类的方法(标准术语将其称为方法,而不是成员函数)。因此,Java 中的main方法必须有一个外壳(shell)类。读者,有可能对 C++ 中的静态成员函数(static member function)十分熟悉。这些成员函数定义在类的内部,并且不对对象进行操作。Java 中的main方法必须是静态的。最后,与 C/C++ 一样。关键字 void表示这个方法没有返回值,所不同的是main方法没有为操作系统返回“退出码”。如果main方法正常退出,那么由 Java 应用程序的退出码为 0,表示成功地运行了程序。如果希望在终止程序时返回其他地退出码,那就需要使用Syetem.exit方法。
接下来研究一下代码:
{ System.out.println("We will not use 'Hello World!'"); }一对大括号表示方法体地开始与结束,在这个方法中只包含一条语句。与大多数程序设计语言一样,可以将 Java 语句看成是语言中的句子。在 Java 中,每个句子必须使用分号结束。特别需要说明,回车不是语句的结束标志,因此,如果需要可以将一条句子写在多行上。
在上面这个main方法体中只包含了一条语句,其功能是将一个文本行输出到控制台上。
在这里,我们使用 System.out对象并调用了它的 println()方法。注意,点号(.)用于调用方法。Java 使用通用语法是:object.method(parameters)这等价于函数调用。
在这个示例中,调用了 println()方法并传递给它一个字符串参数。这个方法将传递给它的字符串参数显示在控制台上。然后,终止这个输出行,使得每次调用println()方法都会在新的一行上显示输出。需要注意一点,Java 与 C/C++ 一样,都采用双引号界定字符串。
与其他程序设计语言中的函数一样,Java 中的方法可以没有参数,也可以有一个或多个参数(有的程序员把参数叫做实参)。即使一个方法没有参数,也需要使用空括号。例如,不带参数的println()方法只打印一个空行。使用下面的语句来调用:
System.out.println()
注释:System.out还有一个print()方法,它不在输出之后增加换行符。例如,System.out.print("Hello");打印“Hello”之后不换行,后面的输出紧跟在字母“o”之后。
程序清单 3-1 FirstSample/FirstSample.java
/** * This is the first sample program in Core Java Chapter 3 * @version 1.01 1997-03-22 * @author Gray Cornell */ public class FirstSample{ public static void main(String[] args){ System.out.println("We will not use 'Hello World!'"); } }**⚠警告:**在 Java中,/* */注释不能嵌套。也就是说,不能简单地把代码用/*和*/括起来作为注释,因为这段代码本身可能也包含一个*/界定符。
📖注释: Java 有一个能够表示任意精度的算术包,通常称为“大数”(big number)。虽然被称为大数,但它并不是一种基本 Java 类型,而是一个 Java 对象。

C++ 注释: 在 C 和 C++ 中,int和 long等类型的大小与目标平台相关。在 8086 这样的16位处理器上整数占2个字节;不过,在32位处理器(比如 Pentium 或 SPARC)上,整数则为4个字节。类似地,在32位处理器上long值为4字节,在64位处理器上则为8字节。由于存在这些差别,这对编写跨平台程序带来了很大难度。在 Java 中,所有地数值类型所占据的字节数与平台无关。
注意: Java 没有任何无符号(unsigned)形式的int、long、short或byte类型。
注释: 如果要使用不可能为负的整数值而且确实需要额外的一位(bit),也可以把有符号整数值解释为无符号数,但是要非常仔细。例如,一个byte值 b 可以不表示范围 -128~127,如果想表示0~255的范围,也可以存储在一个byte中。基于二进制算术运算的性质,只要不溢出,加法、减法和乘法都能正常计算。但对于其他运算,需要调用 Byte.toUnsignedInt(b)来得到一个0~255的int值,然后处理这个整数值,再把它转换回byte。Integer和Long类都提供了处理无符号除法和求余数的方法。
上一篇:开发java应用程序有哪些步骤
下一篇:JavaWeb学习总结(一)
皓盘云建最新版下载v9.0 安卓版
53.38MB |商务办公
ris云客移动销售系统最新版下载v1.1.25 安卓手机版
42.71M |商务办公
粤语翻译帮app下载v1.1.1 安卓版
60.01MB |生活服务
人生笔记app官方版下载v1.19.4 安卓版
125.88MB |系统工具
萝卜笔记app下载v1.1.6 安卓版
46.29MB |生活服务
贯联商户端app下载v6.1.8 安卓版
12.54MB |商务办公
jotmo笔记app下载v2.30.0 安卓版
50.06MB |系统工具
鑫钜出行共享汽车app下载v1.5.2
44.7M |生活服务
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-03-26
2022-02-15
2022-02-14