導語
時至今日,Java語言已歷時二十多年,已經發展成為計算機史上影響最為深遠的編程語言之一,在某種程度上甚至已經超過了編程語言的范疇,成為了一種開發平臺,一種開發規范。更有甚者,Java已經成為了一種信仰,一種對開源和分享精神的代表。
了解Java
我們不妨在搜索引擎里面直接搜索下Java
好吧,開個玩笑,搜索出來的前幾列都是廣告,這恰恰證明了Java的火爆。我們還是看下百度百科對于Java的描述吧。
Java是一門面向對象編程語言,不僅吸收了C++語言的各種優點,還摒棄了C++里難以理解的多繼承、指針等概念,因此Java語言具有功能強大和簡單易用兩個特征。Java語言作為靜態面向對象編程語言的代表,極好地實現了面向對象理論,允許程序員以優雅的思維方式進行復雜的編程 。
Java具有簡單性、面向對象、分布式、健壯性、安全性、平臺獨立與可移植性、多線程、動態性等特點 。Java可以編寫桌面應用程序、Web應用程序、分布式系統和嵌入式系統應用程序等
這里面重點是面向對象、安全性、平臺獨立與可移植性。
- 安全性
Java提供一個相對安全的內存管理和訪問機制,避免了絕大部分的內存泄露和指針越界問題。這里先了解下內存泄露概念:
內存泄露:分配出去的內存得不到及時回收,如此便會導致系統運行速度變慢,更有甚者,導致系統癱瘓。什么情況下會導致內存泄露呢?程序忘記及時回收無用的資源、程序錯誤回收核心類庫內存。前者只是讓系統變慢,后者可能造成系統的癱瘓。 - 平臺獨立與可移植性
如何才能稱為平臺獨立與可移植性呢?那就得是在不同的cpu、Java編譯器或者操作系統上運行代碼得出的結果應該是一致的。JVM給Java提供了一個虛擬CPU般的存在使得Java呈現出這個特性。 - 面向對象我們在后續的章節里面具體分析。
Java的發展歷史
計算機從無到有,因此,任何語言也是有發展歷程的,Java也不能例外。但是有意思的是,Java的誕生更為的有意思,甚至可以說是一場意外。
1990年年末,Sun公司打算給智能家電編寫一個通用的系統,因此Java之父James Gosling領導的“Green計劃”團隊準備為此開發。起初考慮使用C++語言,該團隊很多成員發現C++和可用的Api在某些方面存在很大的問題,該團隊資源有限,且C++太過復雜,缺少垃圾回收、可移植性和分布式等特性。于是乎,Gosling創造了一種新的語言Oak,Oak便是Java的前身。
- 1995年Sun公司發布了Java,Sun公司直接把Java放在互聯網上,供大家免費使用。
- 1996年Sun公司發布了Java1.0,這個環境下已經包含了JRE和JDK
- 中間省略掉某些版本,我們直接聊聊Java1.4,這個版本是一個相對成熟的版本,目前國內還有很多公司在使用。2002年2月發布,在此期間,誕生了大量的基于Java的開源框架,如我們熟悉的三大框架Spring,Struts,Hibernate,同時也涌現了大量的企業應用服務器,Weblogic,Jboss等。
- 2004年10月發布了Java的里程碑版本Java1.5(更名Java5.0),把之前一直稱呼的J2EE正式更名為Java EE。這個版本增加了增強for、泛型、可變參數、枚舉類、注解、自動裝箱和拆箱等。
- 2014年3月18日,Oracle公司發布了Java SE8,(Sun公司很不幸的被收購了)。這次更新帶來了全新的Lambda表達式和很多其他的新特性。
Java程序的基本規則
說完發展歷史,我們直接說點實在的,說說代碼吧。
首先我們要理解兩個概念:類和實例。
類:英文名class在Java里面隨處可見,所有的Java文件編譯后都是.class,程序員面向世界的第一個代碼如下
public class HelloWorld{
}
這就是一個類,百度百科描述:類(Class)是面向對象程序設計(OOP,Object-Oriented Programming)實現信息封裝的基礎。類是一種用戶定義類型,也稱類類型。每個類包含數據說明和一組操作數據或傳遞消息的函數。
好吧,其實說白了,就是存放我們要寫的代碼的容器,我們的代碼都寫在類里面(狹義的,后面還有接口,枚舉等)。專業點的說法就是:類是Java程序的最小程序單位。
實例:英文名instance,也稱之為對象,就是我們常說的面向對象的對象。是類的具體實現。如new HelloWorld();
,就是一個實例。還有一種創建實例的方式,我們可以根據英文名稱,去java.lang.Class類中查找下關于實例的方法,找到一個叫newInstance()
,顧名思義,這也是創建實例的一種方式。
- Java的一些規范
和Linux操作系統般的,Java是大小寫敏感的。我們會有一些約定的規范,類名首字母為大寫,方法名首字母為小寫(其實,反過來,Java也能編譯成功,不會影響結果),命名規范為駝峰原則(早期sun公司并沒有遵守這個規范比如大名鼎鼎的Hashtable),final修飾的常量采用全部大寫的方式(這個 java.awt.Color類里面很有意思的是出現一個大寫,一個小寫的變量,可能當時開發粗心導致的吧,后續為了修復這個問題全部改大寫了,實現的效果是一樣的,再次說明Java大小寫敏感)。類的程序入口是main方法,且這個main方法是public static void 修飾,形參是String[] 數組。
淺談垃圾回收機制
之前說到Java安全特性,我們聊到了內存泄露和指針越界的問題,其實就引出了垃圾回收機制。
眾所周知,Java的堆是一個運行時數據區,用以保存Java的實例(對象)。由于Java程序員不負責對象的回收,那么Java需要自己把無用對象回收掉,這就是垃圾回收機制。你可以這樣理解,C/C++ 就好比一個小孩在房間里面玩折紙,地上無用的紙屑,需要小孩自己去撿起來,扔掉。而Java,則允許小孩丟紙屑,不必自己去撿起來,有一臺掃地機器人幫忙丟掉無用的紙屑。
- 優點
- 提高編程效率 (玩的開心)
- 保護程序完整性(不打斷玩)
- 特性
- 回收無用對象的內存空間,只回收內存資源,對于物理資源、數據庫連接、磁盤I/O等無能為力(如果紙屑在桌子上,機器人表示無能為力)
- 將引用變量置為null,能暗示垃圾回收機制可以回收對象
- 垃圾回收發生不可預知,System.gc()或Runtime對象的gc()只是起到建議作用
- 垃圾回收機制能精確標記活著的對象;垃圾回收器能精確定位到對象之間的引用關系。
- JVM有多種不同的垃圾回收實現
關于運行時內存區域:2014年3月發布的Java8刪除了HotSpot JVM中的永久代內存(PermGen,永久代內存主要用于存儲一些需要常駐內存、通常不會被回收的信息),而是改為使用本地內存來存儲類的元數據信息,并稱之為元空間,這就意味著以后不會出現Java.lang.OutOfMemoryEror:PermGen錯誤(解決了eclipse自動重啟報錯的問題)
尾聲
篇幅加上個人能力有限,對于初遇Java只能寫到這里了。后續將會發布更多可能含有些技術含量的文章,再見。