学习Java的第一天

来源:互联网 发布:ifconfig修改mac地址 编辑:程序博客网 时间:2024/04/30 14:54

Java第一天总结


经过老师最近的细心讲解,基本对Java有一个框架性的概念,同时觉得我的学习之路任重而道远啊!
首先在学好JavaSE的同时还要兼顾对C语言和其他一些语言基本了解(如C++、c#、.net、PHP、Javascript、Objective C、perl、Ruby、Python、Basic)
当然,对于Java EE和Java ME我们同样需要做非常详细的考究才能说正真懂得这门语言。

Java的历史

诞生背景

1957 至1959 年
FORTRAN、LISP 與 COBOL 是這時期誕生的程式語言,也是目前仍在使用的老一輩程式語言,這類的高階程式語言是為科學家、數學家與大型商業電腦所設計的,其主要的使用族群為大型超級電腦、AI 人工智慧與商業軟體。NASA 美國太空總署、信用卡與 ATM 自動櫃員機都用過這類的程式語言。

Cobol 的部分原始程式碼曾出現在電影《魔鬼終結者(Terminator)》中機械終結者的視覺螢幕中,做為其啟動使用的特效效果。


1970 年
PASCAL 於這一年由尼克勞斯·維爾特(Niklaus Wirth)所創造出來,同樣為高階程式語言,主要是針對程式教學結構與資料結構為主要發展目的,其商業版本在 1980 年代廣泛的被採用,特別是其洐生的物件導向分支 Object Pascal 就常被用來做 Windows 的應用程式開發上。蘋果於 1983 年推出的 Lisa 個人電腦與知名的 Skype 也用了這個程式語言。


1972 年
著名的 C 語言是在這年誕生的,由貝爾實驗室的丹尼斯·里奇(Dennis Ritchie)以早期的 B 語言為基礎所開創出來的,是為了在早期的電腦上執行 UNIX 系統所開創出來的,並做為通用開發的低階程式語言。C 語言有著眾多分支版本,且都相當的知名且使用者多,如 C#、Java、Javascript、Perl、PHP 與 Python 等均是。其主要運用在跨平台的應用程式、系統程式、UNIX 程式與遊戲軟體的開發上,使用相當廣泛,早期 WWW 網際網路伺服器也是以 C 語言在 1973 年重新撰寫的 UNIX 上運作的


1983 年
C++ 早期被稱之為「C with Classes(包含型別的 C 語言)」,同樣由貝爾實驗室的比雅尼·史特勞斯特魯普(Bjarne Stroustrup)發明,其後才另命名為 C++,其「+」表示為增強之意,C++ 屬中階程式語言,加強了 C 語言中的 Classes(型別)、虛擬函式、模版等功能。它也被廣泛的使用在應用軟體、嵌入式軟體、伺服器軟體與電視遊樂器中的遊戲開發中,從 Adobe、Google Chrome、Mozilla、Microsoft Internet Explorer(IE)等,使用的都是 C++。

有趣的是,另有名為「C+」的程式語言,不過 C+ 卻與 C/C++ 無關。


1983 年
Objective-C 同樣是洐生至 C 語言的程式語言,由 Stepstone 公司的創辦人布萊德·考克斯(Brad Cox)與湯姆·勒(Tom Love)共同發明,屬於通用、高階的程式語言,其並加入了物件導向與 Smalltalk 語言的訊息傳遞風格。Objective-C 最早由蘋果公司創辦人 Steve Jobs 另創的 NeXT 公司買下授權並做為 NeXTSTP 系統的使用者界面與開發的環境的基礎。

在 NeXT 被蘋果併購後,NeXTSTEP 的架構成為 OS X 與行動裝置上的 iOS 的核心後,Objective-C 也就成了蘋果公司開發軟體的主要程式語言,iPhone/iPad 於市場熱銷下,Objective-C 的知名度與使用者也大幅增加。


1987 年
Perl 為通用型的高階程式語言,其一開始是 Unisys 的拉里·沃爾(Larry Wall)為了在 UNIX 系統上處理報表更為方便而開創的,Perl 的高性能與靈活度佳被廣為稱道,甚至有程式語言的瑞士刀之稱,其應用範圍很廣,在 CGI、資料庫軟體、系統管理、網路程式與圖形程式都適用,因此著名的電影資料庫網站 IMDB、線上購物王者亞馬遜(Amazon)與 Pirceline、Ticketmaster 都採用了 Perl。

Perl 本來打算以「Pearl」為名,是以 Larry Wall 的妻子 Gloria 來命名,在發現已有其他以 Peral 為名的程式語言後,只好更名成 Perl。當年 O’Reilly 出版社的出版的《Programming Perl》一書中封面圖片使用了一隻駱駝圖片,也讓駱駝成為 Perl 非官方的代表標誌。


1991 年
Python 是Guido van Rossum(Guido van Rossum)於 CWI(Centrum Wiskunde & Informatica;國家數學和計算機科學研究學會)任職時為了打發時間而開發出來的,其名字則來自其喜愛的英國電視喜劇《Monty Python’s Flying Circus(蒙提·派森的飛行馬戲團)》,也是一個通用型的高階程式語言。Python 可用來支援各種不同的程式且易於使用,明確、簡單、結構又清楚的語法是其特性。

在 Web 軟體、軟體開發與資訊安全方面有諸多應用,Google、Yahoo 與線上音樂平台 Spotify 都有採用。而 Python 如同其語言名稱來自喜劇一般,Python 的練習範例中,就有許多源自 Monty Python 的惡搞,如用 Spam 火腿與雞蛋來取代傳統的 foo 與 bar。


1993 年
以創造人松本行弘(Yukihiro Matsumoto)的誕生石為名的 Ruby 是這幾年頗為當紅的程式語言,也是統計中成長最快的,其受 Perl、Ada、Lisp、Smalltalk 等程式語言影響很大,是為了更快效率並讓程式的編寫更為愉快而開創的。

Ruby 其通用、高階語言的特性多用於 Web 程式開發,以及近來頗知名的 Ruby on Rails 這個開源版的 Web 開發框架上。著名的 Twitter、線上串流影音服務 Hulu 與 Groupon 都有採用。Ruby 從 Perl 借用了不少東西,開發者自己也認為 Ruby 這名做為接續 Perl 之後的程式語言其實頗為恰當,甚至 Perl 之父也喜歡 Ruby,還從中借了操作符號加入 Perl 6 中。


1995 年
與咖啡同名的 Java,其名字也真的來自咖啡,只因昇陽工程師詹姆斯·高斯林(James Gosling)覺得在開發此一程式語言時需要耗掉大量的咖啡。其實 Java 本來要命名為 Oak,只不過名稱已被先行註冊,只好更名為 Java。

Java 一開始是為了互動電視的專案而開發,是一個高階通用型的程式語言,其跨平台的特性是最大的特色,在網路程式、Web 應用軟體開發、使用者圖形界面開發等應用都有被採用。為網路而設計的 Java 目前在瀏覽器上的地位式微,不過在 Android 採用了 Java 為系統並做為應用軟體開發平台下,Java 反而成為目前最受歡迎的開發程式語言。


1995 年
PHP 的原文其實是 Personal Home Page 個人首頁,是開創者拉斯姆斯·勒多夫(Rasmus Lerdorf)為了要維護個人網頁所開發的程式集,由於可以組成動態的網頁,在釋出後經各方改寫另外更名成了現今的 Hypertext Preprocessor 超文字預處理器。

PHP 為一個開源通用的語言,主要用來建構動態網頁,也是廣為各企業使用在網頁中的開源軟體,無論是 Facebook、維基百科、Digg、WordPress 與 Joomla 都採用了 PHP。各版本的 PHP 在網址後加上「?=PHPE9568F36-D428-11d2-A769-00AA001ACF42」的字串,會各自呈現不同的標誌,算是一個小小又有趣的彩蛋。


1995 年
JavaScript 是屬於高階語言,是由網景 Netscape 的布蘭登·艾克(Brendan Eich)為了添增網頁功能而設計而發明的,可用在動態網頁中提交、確認表格資料,創造互動、動畫,或是追踪使用者行為。除了動態網頁的開發外,PDF 文件、瀏覽器與桌面小工具都可利用 JavaScript 來開發。Gmail、Adobe Photoshop 與 Mozilla Firefox 等產品中都有用到 JavaScript。

JavaScript 雖然名字中也有 Java 的名稱,但其語法結構與出身其實與 Java 一點關係都沒有,只是單純的當初想讓他外表的樣子如同 Java 一般,其原始開發時的代號名稱其實是 Mocha 及 LiveScript。

诞生与改变

Java,是一种可以撰寫跨平台应用软件的面向对象的程序设计语言,由Sun公司的詹姆斯•高斯林(James Gosling)等人于1990年代初开发。它最初被命名为Oak,目標設定在家用电器等小型系統的编程语言,來解决诸如电视机、电话、闹钟、烤面包机等家用电器的控制和通讯问题。由于这些智能化家电的市场需求没有预期的高,Sun放弃了该项计划。就在Oak几近失敗之时,随着互聯網的发展,Sun看到了Oak在计算机网络上的广阔应用前景,于是改造了Oak,在1995年5月以“Java”的名称正式发布了。Java伴随着互联网的迅猛发展而发展,逐渐成为重要的网络编程语言。
Java编程语言的风格十分接近C++语言。继承了C++ 语言面向对象技术的核心,Java舍弃了C++语言中容易引起错误的指针(以引用取代)、运算符重载(operator overloading)、多重继承(以接口取代)等特性,增加了垃圾回收器功能用于回收不再被引用的对象所占据的内存空间。在Java SE 1.5版本中Java又引入了泛型编程(Generic Programming)、类型安全的枚举、不定长参数和自动装/拆箱等语言特性。
Java不同於一般的编译執行计算机语言和解释执行计算机语言。它首先将源代码编译成字节码(bytecode),然后依赖各种不同平台上的虚拟机来解释执行字节码,从而实现了“一次编译、到处执行”的跨平台特性。不过,这同时也在一定程度上降低了Java程序的运行效率。但在J2SE1.4.2发布后,Java的執行速度有了大幅提升。
与传统程序不同Sun公司在推出Java之际就将其作为一种开放的技术。全球数以万计的Java开发公司被要求所设计的Java软件必须相互兼容。“Java语言靠群体的力量而非公司的力量”是Sun公司的口号之一,并获得了广大软件开发商的认同。这与微软公司所倡导的注重精英和封闭式的模式完全不同。
Sun公司对Java编程语言的解释是:Java编程语言是个简单、面向对象、分布式、解释性、健壮、安全与系统无关、可移植、高性能、多线程和动态的语言。
Java平台是基于Java语言的平台。这样的平台目前非常流行,因此微软公司推出了与之竞争的.NET平台以及模仿Java的C#语言。
目录
[隐藏]
• 1 历史
o 1.1 早期的Java
o 1.2 Java和互联网
o 1.3 Java和「Java」
o 1.4 Java和浏览器
o 1.5 Java近况
o 1.6 Java開放原始碼項目
o 1.7 版本历史(时间表)
• 2 语言特性
o 2.1 面向对象
• 3 用途
o 3.1 桌面应用
o 3.2 移动设备
o 3.3 网络服务器和企业级应用
o 3.4 跨平台性
o 3.5 自动垃圾回收(Garbage Collection)
o 3.6 接口和类別
• 4 Java 5.0的特性
o 4.1 自動裝箱/拆箱 (Auto-Boxing/Unboxing)
o 4.2 泛型 (Generic Types)
o 4.3 註釋 (Annotation)
o 4.4 枚举类型 (enum)
o 4.5 输入输出
o 4.6 应用程序开发接口
o 4.7 Hello World
o 4.8 国际化
o 4.9 其它
• 5 深入JAVA
o 5.1 数据类型
o 5.2 JAVA关键字
• 6 關於Java的批評
o 6.1 語言問題
o 6.2 類庫問題
o 6.3 性能問題
• 7 Java运行时环境
• 8 扩展和相关架构
• 9 参见
• 10 参考文献
o 10.1 技术开发
o 10.2 集成开发环境IDE
o 10.3 一般应用
o 10.4 Java历史
o 10.5 Java评论
• 11 注釋

[编辑] 历史
[编辑] 早期的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等軟件開發工具
• JEdit
• Azureus BitTorrent客户端。
• JNode操作系统
• Apache軟件基金會的Ant、Derby、Hadoop、Jakarta、POI和Tomcat
• JBoss和GlassFish應用服務器
商用軟體:
• EIOffice(永中Office)
• 纯Java 3D游戏合金战士Chrome
• IBM Websphere、ColdFusion和WebLogic
还有许多用Java写的软件,可以在http://www.java.com 找到。 在以下网页可以看到非常多用Java写的程序: http://java.sun.com/products/ 下面有大量用Java Swing开发的桌面Java程序 http://java.sun.com/products/jfc/tsc/sightings/ 目前Java提供以下三个版本:
• Java Platform, Enterprise Edition(Java EE:Java平台企业版)
• Java Platform, Standard Edition(Java SE:Java平台标准版)
• Java Platform, Micro Edition(Java ME:Java平台微型版)
[编辑] Java開放原始碼項目
2006年昇陽在JavaOne公佈Java 開放原始碼項目,並推出OpenJDK計畫。[2] Java虛擬機、Java編譯器和Java類庫以GNU通用公共許可證公開。
[编辑] 版本历史(时间表)
• 1995年5月23日,Java语言诞生
• 1996年1月,第一个JDK-JDK1.0诞生
• 1996年4月,10个最主要的操作系统供应商申明将在其产品中嵌入JAVA技术
• 1996年9月,约8.3万个网页应用了JAVA技术来制作
• 1997年2月18日,JDK1.1发布
• 1997年4月2日,JavaOne会议召开,参与者逾一万人,创当时全球同类会议规模之纪录
• 1997年9月,JavaDeveloperConnection社区成员超过十万
• 1998年2月,JDK1.1被下载超过2,000,000次
• 1998年12月8日,JAVA2企业平台J2EE发布
• 1999年6月,SUN公司发布Java的三个版本:标准版(J2SE)、企业版(J2EE)和微型版(J2ME)
• 2000年5月8日,JDK1.3发布
• 2000年5月29日,JDK1.4发布
• 2001年6月5日,NOKIA宣布,到2003年将出售1亿部支持Java的手机
• 2001年9月24日,J2EE1.3发布
• 2002年2月26日,J2SE1.4发布,自此Java的计算能力有了大幅提升
• 2004年9月30日18:00PM,J2SE1.5发布,成为Java语言发展史上的又一里程碑。为了表示该版本的重要性,J2SE1.5更名为Java SE 5.0
• 2005年6月,JavaOne大会召开,SUN公司公开Java SE 6。此时,Java的各种版本已经更名,以取消其中的数字“2”:J2EE更名为Java EE,J2SE更名为Java SE,J2ME更名为Java ME
• 2006年12月,SUN公司发布JRE6.0
[编辑] 语言特性
Java之所以被开发,是要达到以下五个目的:
• 应当使用面向对象程序设计方法学
• 应当允许同一程序在不同的计算机平台执行
• 应当包括内建的对计算机网络的支持
• 应当被设计成安全地执行远端代码
• 应当易于使用,并借鉴以前那些面向对象语言(如C++)的长处。
Java技术主要分成几个部分:Java语言、运行环境JVM、类库。一般情况下说Java时并不区分指的是哪个部分。
[编辑] 面向对象
Java的特点之一就是面向对象,是程序设计方法的一种。“面向对象程序设计语言”的核心之一就是开发者在设计软件的时候可以使用自定义的类型和关联操作。代码和数据的实际集合体叫做“对象”。一个对象可以想像成绑定了很多“行为(代码)”和“状态(数据)”的物体。对于数据结构的改变需要和代码进行通信然后操作,反之亦然。面向对象设计让大型软件工程的计划和设计变得更容易管理,能增强工程的健康度,减少失败工程的数量。
面向对象设计另外一个目标就是能产生很多的有关联的类,可以让软件的再开发变得简单。举例来说,很多软件工程都有同样的功能,尤其是很多应用了同一原理组织的软件工程。软件的二次开发者想自己为软件开发插件以增强功能的时候,绝对不想看到混乱的开发代码和管理计划。面向对象的目的就是不生產难懂且难以使用的代码,为软件各个功能群之间建立有效的通信通道。很多开源软件社区正在计划给软件作者提供更多的类来让软件的二次开发变得简便。
[编辑] 用途
[编辑] 桌面应用
根据Sun公司的统计,安裝Java运行环境的个人计算机已经超过7亿。[3]自从Sun指控微软添加Windows特效类文件到Java运行环境(JRE),并通过Visual J++运行这些类文件,微软不再绑定Java运行环境到Windows操作系统。Apple’s Mac OS X一般默认绑定Java运行环境, 而且许多Linux distributions也绑定一些兼容性的自由软件包GNU Classpath。[4]
一些Java软件被桌面计算机广泛应用,比如NetBeans和Eclipse integrated development environments,文件共享程序如LimeWire和Vuze. Java还被应用于线性代数计算编程环境,包括用户界面和部分系统核心功能。
[编辑] 移动设备
Java ME在移动设备上越来越流行,并开始与Symbian, BREW,和.NET Compact Framework展开竞争。
因为手机制造商的多样性,需要一种新的统一标准,使程序可以运行于不同手机供应商制造的手机上。第一代这样的标准是MIDP 1,它假设手机显示屏很小,没有音频操作权限,而且只允许小于32kb的程序运行。MIDP2有声音访问权限,程序大小限制提高到了64kb。随着手机设计的能力和速度的快速提升,其发展速度远比标准的制定快的多,一些厂商开始放松了对标准的遵守,比如允许更大的程序在手机上运行。
[编辑] 网络服务器和企业级应用
J2EE企业级架构
[编辑] 跨平台性
Java语言的第二个特性就是跨平臺性,也就是说使用Java语言编写的程序可以在编译后不用经过任何更改,就能在任何硬件设备条件下运行。这个特性经常被称为“一次编译,到处运行”。
执行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或相关技术建立。
[编辑] 自动垃圾回收(Garbage Collection)
C++语言被用户诟病的原因之一就是大多数C++编译器不支持垃圾收集机制。通常使用C++编程的时候,程式設計師於程式中初始化對象時,會在主機記憶體堆疊上分配一塊記憶體與位址,當不需要此對象時,進行解構或者删除的时候再释放分配的記憶體位址。如果對象是在堆疊上分配的,而程序员又忘记进行删除,那么就会造成内存泄漏(Memory Leak)。长此以往,程序运行的时候可能会生成很多不清除的垃圾,浪费了不必要的記憶體空间。更糟糕的是,如果同一内存地址被删除两次的话,程序会变得不稳定,甚至崩溃。因此有经验的C++程序员都会在删除之后将指针重置为0,然后在删除之前先判断指针是否为0。
Java语言则不同,上述的情况被自动垃圾收集功能自动处理。對象的建立和放置都是在記憶體堆上面进行的。程序或者其他的对象可以锁定一块栈地址来进行其他对象的引用。当一个对象没有任何引用的时候,Java的自动垃圾收集机制就发挥作用,自动删除这个对象所占用的空间,释放内存以避免内存泄漏。但是内存泄漏并不是就此避免了,当程序员疏忽大意地忘记解除一个对象不应该有的引用的时候,内存泄漏仍然不可避免,不过发生的几率要比不启用垃圾收集机制的C++程序少很多。但是总体来讲,自动垃圾收集机制要安全和简单许多。
不同厂商、不同版本的JVM中的内存垃圾回收机制并不完全一样,通常越新版本的内存回收机制越快,IBM、BEA、SUN等等开发JVM的公司都曾宣称过自己制造出了世界上最快的JVM, JVM性能的世界纪录也在不断的被打破并提高。
IBM有一篇有关Java内存回收机制比不启用垃圾收集机制的C++内存处理快数倍的技术文章,可在如下网址找到:
http://www-128.ibm.com/developerworks/cn/java/j-jtp09275.html
而著名的Java技术书籍《Java编程思想》(《Thinking in Java》)也有一段论述Java内存及性能达到甚至超过C++的章节:
http://www.sdau.edu.cn/support/thinkinjava/chapter/appe.htm
但是应该注意到,C++中也可以使用“智能指针”(Smart Pointer)或者使用C++托管扩展编译器的方法来实现自动化内存释放,智能指针可以在标准类库中找到,而C++托管扩展被微软的Visual C++ 7.0及以上版本所支持。智能指针的优点是不需引入缓慢的垃圾收集机制,而且可以不考虑线程安全的问题,但是缺点是如果不善使用智能指针的话,性能有可能不如垃圾收集机制,而且不断地分配和释放内存可能造成内存碎片,需要手动对堆进行压缩。除此之外,由于智能指针是一个基于模板的功能,所以没有经验的程序员在需要使用多态特性进行自动清理时也可能束手无策。
當然,作為一個「負責任」的程式編撰員,在程式完結前应该手動清理不再需要的變數和對象,令效能有點提升。以Java为例,finalize方法位於java.lang.Object內,而Object這個类是每一個类自動承繼的。因此清理需要的便是覆寫finalize便行了
protected void finalize() throws Throwable{
super.finalize();
}
當中若有任何變數要清理,可以在super.finalize()前加上 <變數> = null;或 <所屬的Class>.<變數> = null;
不過事實上,就算使用了finalize(),你還是不能保證你在堆疊中所使用的空間會馬上被回收,垃圾回收機制只有在你的你堆疊已經毫無空間可以使用的情況下,才會真的去進行回收的動作,因此在程式設計上,還是要避免記憶體空間的浪費。
[编辑] 接口和类別
Java自带了创建接口的类別,可以这样使用:
public interface Deleteable {
void delete();
}
这段代码的意思是任何实现(implement)Deleteable接口的类別都必须实现delete()方法。每个类別对这个方法的实现可以自行定制。由此概念可以引出很多种使用方法,下面是一个类別的例子:
public class Fred implements Deleteable {
//Must include the delete () method to satisfy the Deleteable interface
public void delete() { //code implementation goes here
}
//Can also include other methods
public void doOtherStuff() {
}
}
在另外一个类別中,可以使用这样的代码:
public void deleteAll (Deleteable [] list) {
for (int i = 0; i < list.length; i++) {
list[i].delete();
}
}
因为队列中所有的对象都可以使用delete()方法。Deleteable队列中包含Fred对象的引用,而这个类別和其他Deleteable类別在使用deleteAll()方法时候不需要进行任何改变。
之所以这样做就是为了在接口的执行和其代码之间进行区别。举例来说,一个名叫Collection的接口可以包含任何对象所需要的引入、转换和存储数据的方法,其他的类都可以使用这个接口。但是这个接口可以是一个可重定义大小的队列、一个链表或者是其他功能的集合。
这种特性其实是一种折中的办法。Java的设计者们不想让Java有多重继承的特性,因为C++的多重继承显示了这种特性的困难。Java的接口功能可以提供同样的功能,但是又不会很复杂。
[编辑] Java 5.0的特性
[编辑] 自動裝箱/拆箱 (Auto-Boxing/Unboxing)
沒有自動裝箱/拆箱:
int int1 = 1;
Integer integer2 = new Integer(int1);
int int3 = integer2.intValue();
有自動裝箱/拆箱:
int int1 = 1;
Integer integer2 = int1; // 自動裝箱
int int3 = integer2; // 自動拆箱
[编辑] 泛型 (Generic Types)
泛型就像是C++的模板。原有的Collection API加上泛型支援後,增加對型別的檢查,減少程式錯誤的機會。
沒有泛型:
HashMap hm = new HashMap();
int i=1;
String tt=”test”;
hm.put(new Integer(i), tt);
使用Generic:
HashMap

Java的特点

通过静态局部变量这一非常小的语言细节,可以发现这几门语言的特点。

C++ 编译器是勤劳全面的全才,尽量为用户提供更多的语言功能,而做到这些必须偷偷为用户生成代码,从而导致C++语言的复杂性和“冰山效应”。(想想C++的多重继承,栈上对象,复制构造。。。)

Java和C#则注重易用性,避免二义性,对于同样功能,只给用户一个正确的选择。(想想单继承、对象只能建立在堆上,垃圾回收)

C则始终保持其简洁高效透明,编译器老实巴交,看到了代码也基本上就能预测到生成的汇编。

PHP的结构化部分模仿C的语法,所以很多特性与之类似,然其毕竟是解释性语言,特别是变量名,类名等本身就可以作为变量的解释性语言特性,让其变得异常灵活。面向对象部分则模仿Java的语法,同时又充分体现了解释语言的特点。


java语言是解释性语言。java很特殊,java程序也需要编译,但是没有直接编译称为机器语言,而是编译称为字节码,然后用解释方式执行字节码。Java既可以被编译,也可以被解释。通过编译器,可以把Java程序翻译成一种中间代码- 称为字节码- 可以被Java解释器解释的独立于平台的代码。通过解释器,每条Java字节指令被分析,然后在计算机上运行。只需编译一次,程序运行时解释执行。
Java字节码使“写一次,到处运行”成为可能。可以在任何有Java编译器的平台上把Java程序编译成字节码。这个字节码可以运行在任何Java VM上。例如,同一个Java程序可以运行在WindowsNT、Solaris和Macintosh上。

Java开发环境的搭建

1.下载安装JDK

联网进入Oracle官网下载JDK的安装程序,并设置安装路径和环境变量

2.下载安装Eclipse

可以再Eclipse官网下载Eclipse for Java Developers的最新版本,解压缩后直接运行Eclipse程序进入

3.在Eclipse创建项目

new->project->class

入门级的Java程序

import javax.swing.JOptionPane;public class Hello {    private static String name;    public static void main(String[] args) {        System.out.println("Hello,world!");        JOptionPane.showMessageDialog(null,"Hello,Superman!");    }}
import javax.swing.JOptionPane;import com.sun.org.apache.bcel.internal.generic.RETURN;public class Hello {    private static String name;    public static void main(String[] args) {        name = JOptionPane.showInputDialog("请输入你的名字:");        JOptionPane.showMessageDialog(null, "你好"+name);        System.exit(0);    }}
0 0