Java学习1—对Java的初步认识

我觉得学习最有效的一个方法之一就是——“带着问题去学习”,那我们就带着问题来学习Java吧。

 

问题1:Java为了满足什么需求出现的?

 

Oak语言的吉祥物,和语言最开始只是太阳微系统(Sun MicroSystems)公司在1990年12月开始研究的一个内部项目。太阳微系统公司的一个叫做帕特里克?诺顿的工程师被公司自己开发的C++和C语言编译器搞得焦头烂额,因为其中的API极其难用。帕特里克决定改用NeXT,同时他也获得了研究公司的一个叫做“Stealth计划”的项目的机会。“Stealth计划”后来改名为“Green计划”,詹姆斯?高斯林和麦克?舍林丹也加入了帕特里克的工作小组。他们和其他几个工程师一起在加利福尼亚州门罗帕克市沙丘路的一个小工作室裡面研究开发新技术,瞄准下一代智能家电(如微波炉)的程序设计,升阳公司预料未来科技将在家用电器领域大显身手。团队最初考虑使用C++语言,但是很多成员包括升阳的首席科学家比尔?乔伊,发现C++和可用的API在某些方面存在很大问题。工作小组使用的是内嵌类型平台,可以用的资源极其有限。很多成员发现C++太复杂以至很多开发者经常错误使用。他们发现C++缺少垃圾回收系统,还有可移植的安全性、分布程序设计、和多线程功能。最后,他们想要一种易于移植到各种设备上的平台。根据可用的资金,比尔?乔伊决定开发一种集C语言和Mesa语言大成的新语言,在一份报告上,乔伊把它叫做“未来”,他提议升阳公司的工程师应该在C++的基础上,开发一种面向对象的环境。最初,高斯林试图修改和扩展C++的功能,他自己称这种新语言为C++ ++ --,但是后来他放弃了。他将要创造出一种全新的语言,被他命名为“Oak”(橡树),以他的办公室外的橡树命名。

 

Oak就是Java的前身,目标设定在家用电器等小型系統的编程语言,来解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失败之时,随着互联网的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak,在1995年5月以“Java”的名称正式发布了。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。

 

Java编程语言的风格十分接近C++语言。继承了C++ 语言面向对象技术的核心,Java舍弃了C++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间。在Java SE 1.5版本中Java又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。

 

问题2:Java经过哪几个革命性的发展阶段?

 

早期的Java

 

Oak语言的吉祥物,和语言最开始只是太阳微系统(Sun MicroSystems)公司在1990年12月开始研究的一个内部项目。太阳微系统公司的一个叫做帕特里克?诺顿的工程师被公司自己开发的C++和C语言编译器搞得焦头烂额,因为其中的API极其难用。帕特里克决定改用NeXT,同时他也获得了研究公司的一个叫做“Stealth计划”的项目的机会。

“Stealth计划”后来改名为“Green计划”,詹姆斯?高斯林和麦克?舍林丹也加入了帕特里克的工作小组。他们和其他几个工程师一起在加利福尼亚州门罗帕克市沙丘路的一个小工作室裡面研究开发新技术,瞄准下一代智能家电(如微波炉)的程序设计,升阳公司预料未来科技将在家用电器领域大显身手。团队最初考虑使用C++语言,但是很多成员包括升阳的首席科学家比尔?乔伊,发现C++和可用的API在某些方面存在很大问题。

 

工作小组使用的是内嵌类型平台,可以用的资源极其有限。很多成员发现C++太复杂以至很多开发者经常错误使用。他们发现C++缺少垃圾回收系统,还有可移植的安全性、分布程序设计、和多线程功能。最后,他们想要一种易于移植到各种设备上的平台。

 

根据可用的资金,比尔?乔伊决定开发一种集C语言和Mesa语言大成的新语言,在一份报告上,乔伊把它叫做“未来”,他提议升阳公司的工程师应该在C++的基础上,开发一种面向对象的环境。最初,高斯林试图修改和扩展C++的功能,他自己称这种新语言为C++ ++ --,但是后来他放弃了。他将要创造出一种全新的语言,被他命名为“Oak”(橡树),以他的办公室外的橡树命名。

 

就像很多开发新技术的秘密工程一样,工作小组没日没夜地工作到了1992年的夏天,他们能够演示新平台的一部分了,包括Green操作系统,Oak的程序设计语言,类库及其硬件。最初的尝试是面向一种类PDA设备,被命名为Star7,这种设备有鲜艳的图形界面和被称为“Duke”的智能代理来帮助用户。1992年12月3日,这台设备进行了展示。

 

同年11月,Green计划被转化成了“FirstPerson有限公司”,一个升阳公司的全资子公司,团队也被重新安排到了帕洛阿尔托。FirstPerson团队对建造一种高度互动的设备感兴趣,当时代华纳发布了一个关于电视机顶盒的征求提议书时(Request for proposal),FirstPerson改变了他们的目标,作为对征求意见书的响应, 提出了一个机顶盒平台的提议。但是有线电视业界觉得FirstPerson的平台给予用户过多的控制权,因此FirstPerson的投标败给了SGI。与3DO公司的另外一笔关于机顶盒的交易也没有成功,由于他们的平台不能在电视工业产生任何效益,公司被并回升阳公司。

 

Java和互联网

 

1994年6月、7月间,在经历了一场历时三天的脑力激盪的讨论后,约翰?盖吉、詹姆斯?高斯林、比尔?乔伊、帕特里克?诺顿、韦恩?罗斯因和埃里克?斯库米,团队决定再一次改变了努力的目标,这次他们决定将该技术应用于万维网。他们认为随着Mosaic浏览器的到来,因特网正在向同样的高度互动的远景演变,而这一远景正是他们在有线电视网中看到的。作为原型,帕特里克?诺顿写了一个小型万维网浏览器,WebRunner,后来改名为HotJava。

 

Java和「Java」

 

由于商标搜索显示,Oak已被一家显卡制造商注册。于是同年,Oak被改名为Java。当使用十六进制编辑器打开由Java源代码编译出的二进制文件(.class文件)的话,最前面的32位将显示为CA FE BA BE,即词组“CAFE BABE”(咖啡屋宝贝)。

 

Java和浏览器

 

1994年10月,HotJava和Java平台为公司高层进行演示。1994年,Java 1.0a版本已经可以提供下載,但是Java和HotJava浏览器的第一次公开发布却是在1995年3月23日SunWorld大会上进行的。升阳公司的科学指导约翰?盖吉宣告Java技术。这个发布是与网景公司的执行副总裁马克?安德森的惊人发布一起进行的,宣布网景将在其浏览器中包含对Java的支持。1996年1月,升阳公司成立了Java业务集团,专门开发Java技术。

 

Java近况

 

在流行几年之后,Java在浏览器中的地位被逐步侵蚀。它在简单交互性动画方面的用途已经完全被Adobe公司的Flash排挤,2005年Java倾向只被用于雅虎游戏那样的更为复杂的应用程序Java同时遭受到来自微软的反对,他们决定在新版本的Internet Explorer和Windows中不再附带Java平台。与此相反。在万维网的服务器端和手持设备上,Java变得更加流行。很多网站在後端使用JSP和其他的Java技术。在桌面系统上,独立的Java程序还是相对少见,这是因为Java平台的运行开销较大,而许多人的电脑上没有安装Java,由于网络带宽在以前较小,下载Java曾经是个耗时的事情。但是随着计算机计算能力、网络带宽在10年中取得了很大的进步,同时虚拟机和编译器的质量得到了提高,许多应用程序得到了广泛的使用,包括:NetBeans、Eclipse等。(插曲:Java与.NET之争的根源,有兴趣的可以看看:http://pwcrab.blog.163.com/blog/static/169903822200710264936567/

 

问题3:Java适用哪些场景?

 

从以上的Java介绍可以看出,当今的JAVA三大平台是如何发展过来的。

JavaME(J2ME)(Java 2 Platform Micro Edition,java平台微型版)

JavaSE(J2SE)(Java2 Platform Standard Edition,java平台标准版)

JavaEE(J2EE)(Java 2 Platform,Enterprise Edition,java平台企业版)

(附加小插曲:1998年12月,SUN公司发布了JDK1.2,开始使用“Java 2” 这一名称,目前我们已经很少使用JDK1.1版本,所以我们所说的Java都是指Java2。)

 

J2ME

 

全称是Java 2 Mobile Environment就是在移动设备(如手机,PDA)上用Java开发程序的环境。所以从事的工作就是开发手机软件。一些网络公司就可能需要针对手机开发软件,如QQ手机版中,有很大一部分都是Java的。(当然,也有一部分其他的)。另外再补充一点就是,J2ME是Java1.2那个时代的叫法,现在一般都统一称为Java ME,现在java已经到1.6版了。塞班盛行期间,手机游戏打开的初始页面会出现一个Java的标识,那就是J2ME开发的手机游戏了。不过当今的手机端手机基本被iOS和Android完全取代了,可幸的是,Android是基于Java开发的手机操作系统。

 

J2SE

 

J2SE(java 2 标准版)的定位在客户端,主要用于桌面应用软件的编程,在桌面系统上,独立的Java程序还是相对少见,这是因为Java平台的运行开销较大,而许多人的电脑上没有安装Java,由于网络带宽在以前较小,下载Java曾经是个耗时的事情。但是随着计算机计算能力、网络带宽在10年中取得了很大的进步,同时虚拟机和编译器的质量得到了提高,许多应用程序得到了广泛的使用。

 

J2EE

 

J2EE适用于创建服务器应用程序和服务的Java 2平台企业版。J2EE是一种利用Java 2平台来简化企业解决方案的开发、部署和管理相关的复杂问题的体系结构。J2EE技术的基础就是核心Java平台或Java 2平台的标准版,J2EE不仅巩固了标准版中的许多优点,例如"编写一次、随处运行"的特性、方便存取数据库的JDBC API、CORBA技术以及能够在Internet应用中保护数据的安全模式等等,同时还提供了对 EJB(Enterprise JavaBeans)、Java Servlets API、JSP(Java Server Pages)以及XML技术的全面支持。其最终目的就是成为一个能够使企业开发者大幅缩短投放市场时间的体系结构。结合现在的环境,可想而知J2EE的发展趋势。

我觉得许多新手口中所说的Java指的就是J2EE,那也难怪,在Java三大平台里,发展最好的就是J2EE。这也是接下来学习Java的主要方向。

 

问题4:与其他编程语言相比,JAVA自身有哪些优点与缺点?

 

优点:

 

1、使用面向对象程序设计

2、跨平台

3、内建的对计算机网络的支持

4、被设计成安全地执行远端代码

5、易于使用,并借鉴以前那些面向对象语言(如C++)的长处

 

缺点:

 

相比其他编程语言,运行速度是致命的打击,不过随即版本的改善,现在已经相对快速很多了。

 

执行Java应用程式必须安装Java Runtime Environment(JRE),JRE内部有一个Java虚拟机(Java Virtual Machine,JVM)以及一些标准的类库(Class Library)。通过JVM的虚拟机才能在电脑系统执行Java应用程序(Java Application),这与.Net Framework的情况一样,所以电脑上没有安装JVM,那么这些程序将不能够执行。

 

实现跨平台性的方法是大多数编译器在进行Java语言程序的编码时候会生成一个用字节码(Bytecode)写成的“半成品”,这个“半成品”会在Java虚拟机(解释层)的帮助下运行,虚拟机会把它转换成当前所处硬件平台的原始代码。之后,Java虚拟机会打开标准库,进行数据(图片、线程和网络)的存取工作。主要注意的是,尽管已经存在一个进行代码翻译的解释层,有些时候Java的字节码代码还是会被JIT编译器进行二次编译。

 

有些编译器,比如GCJ,可以自动生成原始代码而不需要解释层。但是这些编译器所生成的代码只能应用于特定平台。并且GCJ目前只支持部分的Java API。

 

升阳对于Java的许可是“全兼容的”,这也导致了微软和升阳关于微软的程序不支持RMI和JNI接口、并且增加特性为己所用的法律争端。升阳最终赢得了官司,获得了大约两千万美元的赔偿,法院强制要求微软执行升阳公司关于Java的许可要求。作为回应,微软不再在Windows系统中捆绑Java,最新的Windows版本,Windows Vista和Internet Explorer 7.0版本也不再提供对于Java应用程序和控件的支持。但是升阳公司和其他使用Java运行时系统的公司对于微软的操作对用户提供无偿的第三方插件和程序支持。

 

Java语言使用解释层最初是为了轻巧性。所以这些程序的运行效率比C语言和C++要低很多,用户也对此颇有微词。很多最近的调查显示Java的程序运行速度比几年前要高出许多,有些同样功能的程序的效率甚至超过了C++和C语言编写的程序。

 

Java语言在最开始应用的时候是没有解释层的,所有需要编译的代码都直接转换成机器的原始代码。这样做的后果就是获得了最佳的性能,但是程序臃肿异常。从JIT技术开始,Java的程序都经过一次转换之后才变成机器码。很多老牌的第三方虚拟机都使用一种叫做“动态编译”的技术,也就是说虚拟机实时监测和分析程序的运行行为,同时选择性地对程序所需要的部分进行编译和优化。所有这些技术都改善了代码的运行速度,但是又不会让程序的体积变得失常。

 

程序的轻便性事实上是软件编写很难达到的一个目标,Java虽然成功地实现了“一次编译,到处运行”,但是由于平台和平台之间的差异,所编写的程序在转换代码的时候难免会出现微小的、不可察觉的错误和意外。有些程序员对此非常头疼,他们嘲笑Java的程序不是“一次编译,到处运行”,而是“一次编译,到处调试”。

 

平台无关性让Java在服务器端软件领域非常成功。很多服务器端软件都使用Java或相关技术建立。

 
问题5:什么是JIT?

 

笼统的讲,JIT(just in time,即时编译技术)是Java执行的加速器。

 

百度百科

 

JIT Compiler(Just-in-timeCompiler) 即时编译

 

最早的Java建置方案是由一套转译程式(interpreter),将每个Java指令都转译成对等的微处理器指令,并根据转译后的指令先后次序依序执行,由于一个Java指令可能被转译成十几或数十几个对等的微处理器指令,这种模式执行的速度相当缓慢。

 

针对这个问题,业界首先开发出JIT(just in time)编译器。当Java执行runtime环境时,每遇到一个新的类别(class:类别是Java程式中的功能群组),JIT编译器在此时就会针对这个类别进行编译(compile)作业。经过编译后的程式,被优化成相当精简的原生型指令码(native code),这种程式的执行速度相当快。花费少许的编译时间来节省稍后相当长的执行时间,JIT这种设计的确增加不少效率,但是它并未达到最顶尖的效能,因为某些极少执行到的Java指令在编译时所额外花费的时间可能比转译器在执行时的时间还长,针对这些指令而言,整体花费的时间并没有减少。

 

基于对JIT的经验,业界发展出动态编译器(dynamiccompiler),动态编译器仅针对较常被执行的程式码进行编译,其余部分仍使用转译程式来执行。也就是说,动态编译器会研判是否要编译每个类别。动态编译器拥有两项利器:一是转译器,另一则是JIT,它透过智慧机制针对每个类别进行分析,然后决定使用这两种利器的哪一种来达到最佳化的效果。动态编译器针对程式的特性或者是让程式执行几个循环,再根据结果决定是否编译这段程式码。这个决定不见得绝对正确,但从统计数字来看,这个判断的机制正确的机会相当高。事实上,动态编译器会根据「历史资料」做决策,所以程式执行的时间愈长,判断正确的机率就愈高。以整个结果来看,动态编译器产生的程式码执行的速度超越以前的JIT技术,平均速度可提高至50%。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值