導航:首頁 > 操作系統 > android智能指針

android智能指針

發布時間:2022-09-28 01:47:07

『壹』 android有什麼好的技術點適合進行技術分享

  1. 進程間通信的Binder機制。FrameWork 層的核心。

  2. JNI 的使用。FrameWork 層的基石,幾乎整個 FrameWork 層都是通過 JNI 實現對 Library 層調用的。

  3. Material Design 設計。傳說中設計師導向型的 UI 風格。

  4. OpenGL ES 3.1 ,Android 5.0開始提供 java 介面和原生支持。

  5. 低功耗藍牙(貌似從4.3開始支持)。

  6. Android 5.0提供的 JobScheler API。允許通過為系統定義要在以後的某個時間或特定條件下非同步運行的任務,優化電池壽命。

  7. Zygote 進程。FrameWork 層的祖宗,所有的 app 進程以及系統服務進程都是 zygote fork 出來的。不然怎麼會叫 zygote 呢。

  8. Android Netd。Android 中網路守護進程,通過封裝各種底層協議,隔離底層網路介面的差異,給 FrameWork 層提供統一介面服務。

  9. Vold: Volume Daemon, 用於管理和控制 Android 平台外部存儲設備的後台進程,這些管理和控制,包括 SD 卡的插拔事件檢測、 SD 卡掛載、卸載、格式化等。

  10. Rild: Radio Interface Layer Daemon, 用於智能手機的通信管理和控制的後台進程,所有和手機通信相關的功能,例如接打電話、收發簡訊/彩信、 GPRS 等都需要 Rild 的參與。

  11. Surface 系統。你會明白 Activity 是如何完成界面繪制的。

  12. 有 Zygote fork 出來的 SystemServer 。Android 中幾乎所有的核心服務(ActivityManagerService、WindowManagerService 等)都存在於 SystemServer 中。

  13. 智能指針。所有 Android 源碼剖析的書必講的一個。

『貳』 android平台下怎麼使用智能指針

Android中定義了兩種智能指針類型,一種是強指針sp(strong pointer),一種是弱指針(weak pointer)。其實成為強引用和弱引用更合適一些。強指針與一般意義的智能指針概念相同,通過引用計數來記錄有多少使用者在使用一個對象,如果所有使用者都放棄了對該對象的引用,則該對象將被自動銷毀。

『叄』 OpenCV(二)掩碼操作與平滑(均值,高斯模糊)

OpenCV知識總結來到了下一個難度高一點的,掩碼操作和模糊效果,這是圖像處理裡面常見的操作。
如果遇到問題請在這里聯系我: https://www.jianshu.com/p/67324fb69074

掩碼操作實際上思想上很簡單:根據一個掩碼矩陣(卷積核)重新計算圖像中的每一個像素。掩碼矩陣中的值表示近鄰像素的值(包括自身像素的值)對新像素的值有多大的影響,從數學上觀點看來,就是對掩碼矩陣內每一個設置好權重,然後對對應的像素領域內做一個權加平均。

卷積是什麼?用一個簡單的公式來表示:

本質上,卷積就是這種思想。卷積把萬事萬物看成一個輸入,當萬事萬物的狀態出現了變化,則會通過某種系統產生變化,變成另一種輸出狀態。而這個系統往往就在數學眼裡就叫做卷積。

而在深度學習中,往往每一個卷積核是一個奇數的矩陣,做圖像識別的時候會通過這個卷積核做一次過濾,篩選出必要的特徵信息。

那麼掩碼操作在數學上是怎麼回事?我們平常運用掩碼做什麼?在OpenCV中掩碼最常見的操作就是增加圖片對比度。對比度的概念是什麼,在上一節聊過,通俗來講就是能夠增強像素之間的細節。我們可以對對每個像素做如下操作:

可能這幅圖,理解起來比較困難。實際上流程如此:

舉個例子,就以計算出掩碼矩陣之後的E的位置,能看到此時是原圖中所有的像素都會取出和掩碼矩陣一樣大小的矩陣。也就是取出原圖的紅色那一塊的領域,分別對E周邊包括自己做了一次加權處理,最後賦值回E中。

並且進行如下的權加公式:

這樣就能對原來的矩陣進行掩碼處理。但是這么做發現沒有,如果我們要對A做掩碼處理就會發現掩碼矩陣對應到原圖的位置不存在。現在處理有兩種,一種是不對邊緣的像素做掩碼處理,另一種是為周邊的圖像做一個padding處理,這種操作在深度學習的圖像處理中很常見,通常設置0像素,或者拷貝對邊的邊緣像素。

能看到這里處理和卷積處理不太一樣,只是為了方便,把這種掩碼濾波操作稱為一種核,是自相關,並不是去計算卷積。

能看到此時這兩張圖片的對比度有很明顯的區別。經過掩碼矩陣之後,會發現原圖會更加平滑一點,而掩碼操作之後會導致整個圖片最亮和最暗之間的差距拉大。

從數學公式上來看,當前像素權重為5,周邊的點的權重是-1和0.能夠發現會對當前的節點加深,同時把周圍的像素值減掉,就增加了每一個像素點和周邊像素差值,也就是對比度。

當然在OpenCV中,有這么一個函數filter2D,處理掩碼操作。

這里創建一個3*3的核。這個核實際上就是上圖的那個。這樣傳遞一個掩碼矩陣和圖像的深度就完成了掩碼操作。

平滑也稱為模糊,是一項高頻率使用的操作。
平滑的作用有很多,其中一項就是降噪音。平滑處理和掩碼操作有點相似,也是需要一個濾波器,我們最常用的濾波器就是線性濾波器。線性濾波處理的輸出像素值 是輸出像素值 的權加和:

其中,h(k,l)成為核,它僅僅只是一個權加系數。圖形上的操作和上面的圖相似。不妨把核當成一個滑動窗口,不斷的沿著原圖像素的行列掃動,掃動的過程中,不斷的把路過像素都平滑處理。

這里先介紹均值濾波器,它的核心如下:

這里的參數意思是,src:輸入的圖像,dst:經過均值模糊之後的輸出圖像,Size:是指這個濾波器的大小,Point是指整個圖像模糊繞著哪個原點為半徑的進行處理,傳入(-1,-1)就是指圖像中心,這樣就能模糊整個圖像。

其計算原理很簡單就是,把核裡面的所有權重設置為1,最後全部相加求平均值。最後賦值到原來的像素上。

最有用的濾波器 (盡管不是最快的)。 高斯濾波是將輸入數組的每一個像素點與 高斯內核 卷積將卷積和當作輸出像素值。

高斯模糊實際上是一個二維的高斯核。回顧一下一維的高斯函數:

那麼二維實際上就是,就是在原來的x,y軸的情況下,增加一個z軸的緯度,實際上看起來就像一座山一樣。

二維的高斯函數可以表示為:

為了達到達到

其OpenCV的調用方式:

這里的參數意思是,src:輸入的圖像,dst:經過高斯模糊之後的輸出圖像,Size:是指這個濾波器的大小。sigmaX和sigmaY分別指代的是高斯模糊x軸上和y軸上的二維高斯函數的變化幅度。

換個形象的話說,用上圖舉個例子,就是確定這個高斯函數這個山的x方向的陡峭程度以及y軸方向的陡峭程度。

下面就高斯模糊,均值模糊和原圖的比對

能看到,高斯模糊比起均值模糊保留了圖像中相關的形狀信息。

為什麼會這樣呢?原因很簡單。因為在計算高斯模糊之前,會根據當前像素區域中所有的像素點進行一次,核的計算,越往中心的權重越高,權重如同小山一下,因此中心的像素權重像素一高了,雖然模糊但是還是保留了原來的形狀。

但是當高斯模糊的矩陣大小和sigmaX,sigmaY相似的時候,整個高斯函數就不像山,而是想平原一樣平坦。換句話說,整個高斯核中的權重就會,偏向一,就會導致和均值模糊類似效果。

高斯模糊計算流程:
圖像中某一段圖形的像素是如下分布,

這個時候高斯模糊需要一個核去對每一個位置做濾波。此時不同於均值模糊,沒有固定的核矩陣,而是通過上面這個矩陣,計算出高斯的核,最後再計算變化後的矩陣每一個對應的像素。

雖然原理是這樣,但是實際上OpenCV為了迅速,在原生實現的時候,內部判斷到核是小於7的大小,設置一套固定的高斯模糊矩陣。

這樣直接就結束,不是我文章的風格,作為一個程序員,還是有必要探索一下,為什麼OpenCV計算速度會比我們自己手寫的快。

為了讓源碼看的不那麼辛苦,先聊聊OpenCV底層的設計思想。首先在OpenCV中,內置了幾種計算方案,按照效率高低優先度依次的向後執行。

這種設計可以看成我們的平常開發的攔截器設計。當發現優先度高的計算模式發現可以使用的時候,OpenCV將會使用這種模式下的演算法進行運算。

一般來說,OpenCV內置如下四個層級計算方案,按照優先順序依次為:

能看到按照這個優先順序不斷的向下查找,找到當前OpenCV最快的計算環境。除了最後一個之外,其他三個都是並發計算。

記住這個流程,我們查看OpenCV的源碼就很輕鬆了。

先來看看filter2D的源碼。

果不其然,在filter2D實現的第一步,就開始調用CV_OCL_RUN宏去調用OpenCL的顯卡並發計算。

能看到,這裡面發送了一個condition和一個方法到OpenCL中運行。但是如果,OpenCV在編譯的時候,我們沒有打開這個OpenCL的選項,沒有OpenCL的環境的時候,它實際上就是一個沒什麼用處的宏:

當有了OpenCL的環境,這個宏就會替換成這個:

能清晰的看到,此時會判斷當前的OpenCL是否還在活躍,活躍的狀態,並且條件和方法符合規范,就會通過CV_IMPL_ADD,把方法添加到一個vector向量中,讓OpenCL讀取執行。

在這裡面,OpenCV想要使用OpenCL進行計算,就需要這個Mat的類型是UMat,並且是緯度小於等於2.當不符合這兩個條件將不會執行OpenCL。

UMat是專門給OpenCL規范計算而使用的矩陣。裡面有很多和Mat相似的方法。

此時可能是多線程處理,因此會添加一個智能鎖,去保證數據的正確性。

具體的思路,將不作為重點,這邊先看看OpenCV是傳入了ocl_filter2D的方法,看看這個方法在OpenCL中的執行流程。

OpenCL會把命令最後發送到顯卡處理。

實際上這一步和上面的方法有點相似。本質上都是獲取需要模糊的區域,如果是(-1,-1),則取中心點,接著判斷當前濾波對邊緣的處理(BORDER_ISOLATED 不去獲取Point為圓心設置的模糊之外的區域)。

能看到這個枚舉已經解釋很清楚了,默認的邊緣處理是復制二個和倒數第二個填充邊緣。
最後進入到hal的filter2D進一步操作。

能看到這里有四種方式:

在情況1中,一般的情況replacementFilter2D返回的是一個沒有實現的錯誤碼,第二種情況是Intel的並行計算庫,沒有任何研究,跳過。我們來看看第三種情況和第四種情況

當然這裡面判斷能夠使用dft的判斷首先要當前必須要整張圖做濾波處理,其次是不能是(0,0)的點為圓心做濾波。最後要判斷當前當前的cpu指令是否支持,支持則允許核的寬 高最高為130以內使用原生實現,否則只支持核的寬 高為50以內使用原生實現。

能看到這裡面的核心就是調用crossCorr,處理核以及原圖的矩陣(使用了快速傅立葉處理相關性計算)。最後從同add添加到目標Mat中,由於add的delta函數為0,因此就和替代的效果一致。

能看到此時,先初始化一個FilterEngine(線性濾波引擎),接著使用apply調用濾波引擎的執行方法。

我們來看看線性引擎的創建:

實際上在這個過程中通過makePtr創建一個sharedptr的指針指向FilterEngine,其原理和Android的智能指針相似。

這個引擎不是關鍵關鍵的是getLinearFilter,這個方法創建了一個線性濾波器的實際操作對象。

我們來看看這個結構體:
能看到這裡面會根據次數傳進來的目標矩陣和原始矩陣的位深創建不同的濾波操作者。

假設,我們現在原圖和目標圖都是8位位深的矩陣,我們只需要關注下面這個構造函數。

Fliter2D結構體持有著模糊中心點,核,原/目標矩陣, 可以猜測到實際上正在做操作的就是這個結構體。

在preprocess2DKernel方法中,Fliter2D把核的相關信息存儲到coords,coeffs中

可以看到此時會判斷當前的核矩陣中type是什麼,接著再把矩陣中每一個不為0的位置設置進coords,像素數值設置到_coeffs。此時相當於把核矩陣展開成一個向量。

能看到此時濾波引擎會先調用FilterEngine__start,再調用FilterEngine__proceed執行計算。
實際上在FilterEngine__start中計算的是本次循環,需要計算的邊界。

FilterEngine__proceed中才是正式計算,做dst循環,最後把具體操作丟給線性引擎生成的Fliter2D的方法中。

了解這兩個東西我們直接抽出核心看看fliter是如何運作:

『肆』 c++難學么不學c直接c++可以么

c++其實和c有很大的不同,c++是面向對象的,所以可以不用學c而直接學c++,我覺得這樣更容易上手,不容易受c的影響;至於難學,是指裡面的指針等內容吧,對於編程語言,只要多看多練,應該都不難掌握的,關鍵是堅持。

『伍』 Android系統開發人員選項中指針位置如何實現的

Android系統的智能指針(輕量級指針、強指針和弱指針)的實現原理分析

1、Android
系統的運行時庫層代碼是用C++來編寫的,用C++來寫代碼最容易出錯的地方就是指針了,一旦使用不當,輕則造成內存泄漏,重則造成系統崩潰。不過系統提供了智能指針,避免出現上述問題;
2、在使用C++來編寫代碼的過程中,指針使用不當造成內存泄漏一般就是因為new了一個對象並且使用完之後,忘記了delete這個對象,而造成系統崩潰。一般就是因為一個地方delete了這個對象之後,其它地方還在繼續使原來指向這個對象的指針。
3、為了避免出現上述問題,一般的做法就是使用引用計數的方法,每當有一個指針指向了一個new出來的對象時,就對這個對象的引用計數增加1,每當有一個指針不再使用這個對象時,就對這個對象的引用計數減少1,每次減1之後,如果發現引用計數值為0時,那麼,就要delete這個對象了,這樣就避免了忘記delete對象或者這個對象被delete之後其它地方還
在使用的問題了。
4、如何實現這個對象的引用計數呢?肯定不是由開發人員來手動地維護了,要開發人員時刻記住什麼時候該對這個對象的引用計數加1,什麼
時候該對這個對象的引用計數減1,一來是不方便開發,二來是不可靠,一不小心哪裡多加了一個1或者多減了一個1,就會造成災難性的後果。
5、智能指針是一個對象,不過這個對象代表的是另外一個真實使用的對象,當智能指針指向實際對象的時候,就是智能指針對象創建的時候,當智能指針不再指向實際對象的時候,就是智能指針對象銷毀的時候。在C++中,對象的創建和銷毀時會分別自動地調用對象的構造函數和析構函數,負責對真實對象的引用計數加1和減1的工作就落實到智能指針對象的構造函數和析構函數的身上了,這也是為什麼稱這個指針對象為智能指針的原因。

『陸』 android 中什麼時候使用弱指針wp

Android中定義了兩種智能指針類型,一種是強指針sp(strong pointer),另外一種是弱指針(weak pointer)。其實稱之為強引用和弱引用更合適一些。強指針與一般意義的智能指針概念相同,通過引用計數來記錄有多少使用者在使用一個對象,如果所有使用者都放棄了對該對象的引用,則該對象將被自動銷毀。
弱指針也指向一個對象,但是弱指針僅僅記錄該對象的地址,不能通過弱指針來訪問該對象,也就是說不能通過弱智真來調用對象的成員函數或訪問對象的成員變數。要想訪問弱指針所指向的對象,需首先通過wp類所提供的promote()方法將弱指針升級為強指針。弱指針所指向的對象是有可能在其它地方被銷毀的,如果對象已經被銷毀,wp的promote()方法將返回空指針,這樣就能避免出現地址訪問錯的情況。
弱指針是怎麼做到這一點的呢?其實說白了一點也不復雜,原因就在於每一個可以被智能指針引用的對象都同時被附加了另外一個weakref_impl類型的對象,這個對象中負責記錄對象的強指針引用計數和弱指針引用計數。這個對象是智能指針的實現內部使用的,智能指針的使用者看不到這個對象。弱指針操作的就是這個對象,只有當強引用計數和弱引用計數都為0時,這個對象才會被銷毀。

『柒』 import語法什麼時候開始支持

Java是一種廣泛使用的計算機編程語言,擁有跨平台、面向對象、泛型編程的特性,廣泛應用於企業級Web應用開發和移動應用開發。

任職於太陽微系統的詹姆斯·高斯林等人於1990年代初開發Java語言的雛形,最初被命名為Oak,目標設置在家用電器等小型系統的程序語言,應用在電視機、電話、鬧鍾、烤麵包機等家用電器的控制和通信。由於這些智能化家電的市場需求沒有預期的高,Sun公司放棄了該項計劃。隨著1990年代互聯網的發展,Sun公司看見Oak在互聯網上應用的前景,於是改造了Oak,於1995年5月以Java的名稱正式發布。Java伴隨著互聯網的迅猛發展而發展,逐漸成為重要的網路編程語言。

Java編程語言的風格十分接近C++語言。繼承了C++語言面向對象技術的核心,Java舍棄了C++語言中容易引起錯誤的指針,改以引用取代,同時移除原C++與原來運算符重載,也移除多重繼承特性,改用介面取代,增加垃圾回收器功能。在Java SE 1.5版本中引入了泛型編程、類型安全的枚舉、不定長參數和自動裝/拆箱特性。太陽微系統對Java語言的解釋是:「Java編程語言是個簡單、面向對象、分布式、解釋性、健壯、安全與系統無關、可移植、高性能、多線程和動態的語言」

Java不同於一般的編譯語言或直譯語言。它首先將源代碼編譯成位元組碼,然後依賴各種不同平台上的虛擬機來解釋執行位元組碼,從而實現了「一次編寫,到處運行」的跨平台特性。在早期JVM中,這在一定程度上降低了Java程序的運行效率。但在J2SE1.4.2發布後,Java的運行速度有了大幅提升。

與傳統類型不同,Sun公司在推出Java時就將其作為開放的技術。全球數以萬計的Java開發公司被要求所設計的Java軟體必須相互兼容。「Java語言靠群體的力量而非公司的力量」是 Sun公司的口號之一,並獲得了廣大軟體開發商的認同。這與微軟公司所倡導的注重精英和封閉式的模式完全不同,此外,微軟公司後來推出了與之競爭的.NET平台以及模仿Java的C#語言。後來Sun公司被甲骨文公司並購,Java也隨之成為甲骨文公司的產品。

現時,移動操作系統Android大部分的代碼採用Java 編程語言編程。

早期的Java

Java的發明人詹姆斯·高斯林

Duke,Java語言的吉祥物

語言最開始只是Sun計算機(Sun MicroSystems)公司在1990年12月開始研究的一個內部項目。Sun計算機公司的一個叫做帕特里克·諾頓的工程師被公司自己開發的C++和C語言編譯器搞得焦頭爛額,因為其中的API極其難用。帕特里克決定改用NeXT,同時他也獲得了研究公司的一個叫做「Stealth計劃」的項目的機會。

「Stealth計劃」後來改名為「Green計劃」,詹姆斯·高斯林和麥克·舍林丹也加入了帕特里克的工作小組。他們和其他幾個工程師一起在加利福尼亞州門羅帕克市沙丘路的一個小工作室裡面研究開發新技術,瞄準下一代智能家電(如微波爐)的程序設計,Sun公司預料未來科技將在家用電器領域大顯身手。團隊最初考慮使用C++語言,但是很多成員包括Sun的首席科學家比爾·喬伊,發現C++和可用的API在某些方面存在很大問題。

工作小組使用的是嵌入式系統,可以用的資源極其有限。很多成員發現C++太復雜以至很多開發者經常錯誤使用。他們發現C++缺少垃圾回收系統,還有可移植的安全性、分布程序設計、和多線程功能。最後,他們想要一種易於移植到各種設備上的平台。

根據可用的資金,喬伊決定開發一種集C語言和Mesa語言大成的新語言,在一份報告上,喬伊把它叫做「未來」,他提議Sun公司的工程師應該在C++的基礎上,開發一種面向對象的環境。最初,高斯林試圖修改和擴展C++的功能,他自己稱這種新語言為C++ ++ --,但是後來他放棄了。他將要創造出一種全新的語言,被他命名為「Oak」(橡樹),以他的辦公室外的橡樹命名。

就像很多開發新技術的秘密工程一樣,工作小組沒日沒夜地工作到了1993年的夏天,他們能夠演示新平台的一部分了,包括Green操作系統,Oak的程序設計語言,類庫及其硬體。最初的嘗試是面向一種類PDA設備,被命名為Star7,這種設備有鮮艷的圖形界面和被稱為「Duke」的智能代理來幫助用戶。1992年12月3日,這台設備進行了展示。

同年11月,Green計劃被轉化成了「FirstPerson有限公司」,一個Sun公司的全資子公司,團隊也被重新安排到了帕洛阿爾托。FirstPerson團隊對建造一種高度交互的設備感興趣,當時代華納發布了一個關於電視機頂盒的徵求提議書時(Request for proposal),FirstPerson改變了他們的目標,作為對徵求意見書的響應,提出了一個機頂盒平台的提議。但是有線電視業界覺得FirstPerson的平台給予用戶過多的控制權,因此FirstPerson的投標敗給了SGI。與3DO公司的另外一筆關於機頂盒的交易也沒有成功,由於他們的平台不能在電視工業產生任何效益,公司被並回Sun公司。

Java和互聯網

1994年6月,在經歷了一場歷時三天的腦力激盪的討論後,約翰·蓋吉、詹姆斯·高斯林、比爾·喬伊、帕特里克·諾頓、韋恩·羅斯因和埃里克·斯庫米,團隊決定再一次改變了努力的目標,這次他們決定將該技術應用於萬維網。他們認為隨著Mosaic瀏覽器的到來,網際網路正在向同樣的高度互動的遠景演變,而這一遠景正是他們在有線電視網中看到的。作為原型,帕特里克·諾頓寫了一個小型萬維網瀏覽器,WebRunner,後來改名為HotJava[12]。

1994年10月,HotJava和Java平台為公司高層進行演示。1994年,Java

1.0a版本已經可以提供下載,但是Java和HotJava瀏覽器的第一次公開發布卻是在1995年3月23日SunWorld大會上進行的。升陽公司的科學指導約翰·蓋吉宣告Java技術。這個發布是與網景公司的執行副總裁馬克·安德森的驚人發布一起進行的,宣布網景將在其瀏覽器中包含對Java的支持。1996年1月,升陽公司成立了Java業務集團,專門開發Java技術。

Java和「Java」

由於商標搜索顯示,Oak已被一家顯示卡製造商注冊。於是同年,Oak被改名為Java。當使用十六進制編輯器打開由Java源代碼編譯出的二進制文件(.class文件)的話,最前面的32位將顯示為CA FE BA BE,即片語「CAFE BABE」(咖啡屋寶貝)。

Java近況

一套Java編輯器軟體

J2SE環境與CDC的關連

JVM的所在角色

JSPX網頁的概念

在流行幾年之後,Java在瀏覽器中的地位被逐步侵蝕。它在簡單交互性動畫方面的用途已經完全被Adobe公司的Flash排擠,2005年Java傾向只被用於雅虎游戲那樣的更為復雜的應用程序。Java同時遭受到來自微軟的反對,他們決定在新版本的Internet Explorer和Windows中不再附帶Java平台。

與此相反。在萬維網的伺服器端和手持設備上,Java變得更加流行。很多網站在後端使用JSP和其他的Java技術。

在桌面系統上,獨立的Java程序還是相對少見,這是因為Java平台的運行開銷較大,而許多人的電腦上沒有安裝Java,由於網路帶寬在以前較小,下載Java曾經是個耗時的事情。但是隨著計算機計算能力、網路帶寬在10年中獲取了很大的進步,同時虛擬機和編譯器的質量得到了提高,許多應用程序得到了廣泛的使用,包括:

開源軟體:

NetBeans和Eclipse等軟體開發工具

Android操作系統

JEdit

Azureus BitTorrent客戶端。

JNode操作系統

Apache軟體基金會的Ant、Derby、Hadoop、Jakarta、POI和Tomcat

JBoss和GlassFish應用伺服器

商業軟體:

EIOffice(永中Office)

Minecraft

純Java 3D游戲合金戰士Chrome

IBM Websphere、ColdFusion和WebLogic

IntelliJ IDEA

還有許多用Java寫的軟體,可以在http://www.java.com 找到。在以下網頁可以看到非常多用Java寫的程序:http://java.sun.com/procts/ 下面有大量用Java Swing開發的桌面Java程序 http://java.sun.com/procts/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 Platform, Card Edition

Java開放源代碼項目

2006年SUN在JavaOne公布Java 開放源代碼項目,並推出OpenJDK項目。[13]Java虛擬機、Java編譯器和Java類庫以GNU通用公共許可證公開。

版本歷史

主條目:Java版本歷史

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

2009年12月,SUN公司發布Java EE 6

2010年11月,由於Oracle公司對於Java社區的不友善,因此Apache揚言將退出JCP[14]

2011年7月28日,Oracle公司發布Java SE 7

2014年3月18日,Oracle公司發表Java SE 8

語言特性

Java之所以被開發,是要達到以下五個目的:

應當使用面向對象程序設計方法學

應當允許同一程序在不同的計算機平台執行

應當包括內建的對計算機網路的支持

應當被設計成安全地執行遠端代碼

應當易於使用,並借鑒以前那些面向對象語言(如C++)的長處。

Java技術主要分成幾個部分:Java語言、Java運行環境、類庫。一般情況下說Java時並不區分指的是哪個部分。

Java在1.5版本時,做了重大改變,Sun公司並1.5版本重命名為Java 5.0。

面向對象

Java的特點之一就是面向對象,是程序設計方法的一種。「面向對象程序設計語言」的核心之一就是開發者在設計軟體的時候可以使用自定義的類型和關聯操作。代碼和數據的實際集合體叫做「對象」。一個對象可以想像成綁定了很多「行為(代碼)」和「狀態(數據)」的物體。對於數據結構的改變需要和代碼進行通信然後操作,反之亦然。面向對象設計讓大型軟體工程的計劃和設計變得更容易管理,能增強工程的健康度,減少失敗工程的數量。

跨平台性

Java語言的第二個特性就是跨平台性,也就是說使用Java語言編寫的程序可以在編譯後不用經過任何更改,就能在任何硬體設備條件下運行。這個特性經常被稱為「一次編譯,到處運行」。

執行Java應用程序必須安裝爪哇運行環境(Java Runtime Environment,JRE),JRE內部有一個Java虛擬機(Java Virtual Machine,JVM)以及一些標準的類庫(Class Library)。通過JVM才能在電腦系統執行Java應用程序(Java Application),這與.Net Framework的情況一樣,所以電腦上沒有安裝JVM,那麼這些程序將不能夠執行。

實現跨平台性的方法是大多數編譯器在進行Java語言程序的編碼時候會生成一個用位元組碼寫成的「半成品」,這個「半成品」會在Java虛擬機(解釋層)的幫助下運行,虛擬機會把它轉換成當前所處硬體平台的原始代碼。之後,Java虛擬機會打開標准庫,進行數據(圖片、線程和網路)的訪問工作。主要注意的是,盡管已經存在一個進行代碼翻譯的解釋層,有些時候Java的位元組碼代碼還是會被JIT編譯器進行二次編譯。

有些編譯器,比如GCJ,可以自動生成原始代碼而不需要解釋層。但是這些編譯器所生成的代碼只能應用於特定平台。並且GCJ目前只支持部分的Java API。

甲骨文公司對於Java的許可是「全兼容的」,這也導致了微軟和升陽關於微軟的程序不支持RMI和JNI介面、並且增加特性為己所用的法律爭端。升陽最終贏得了官司,獲得了大約兩千萬美元的賠償,法院強制要求微軟執行升陽公司關於Java的許可要求。作為回應,微軟不再在Windows系統中捆綁Java,最新的Windows版本,Windows Vista和Internet Explorer 7.0版本也不再提供對於Java應用程序和控制項的支持。但是升陽公司和其他使用Java運行時系統的公司在Windows操作系統下對用戶提供無償的第三方插件和程序支持。

Java語言使用解釋層最初是為了輕巧性。所以這些程序的運行效率比C語言和C++要低很多,用戶也對此頗有微詞。很多最近的調查顯示Java的程序運行速度比幾年前要高出許多,有些同樣功能的程序的效率甚至超過了C++和C語言編寫的程序[來源請求]。

Java語言在最開始應用的時候是沒有解釋層的,所有需要編譯的代碼都直接轉換成機器的原始代碼。這樣做的後果就是獲得了最佳的性能,但是程序臃腫異常。從JIT技術開始,Java的程序都經過一次轉換之後才變成機器碼。很多老牌的第三方虛擬機都使用一種叫做「動態編譯」的技術,也就是說虛擬機實時監測和分析程序的運行行為,同時選擇性地對程序所需要的部分進行編譯和優化。所有這些技術都改善了代碼的運行速度,但是又不會讓程序的體積變得失常。

程序的輕便性事實上是軟體編寫很難達到的一個目標,Java雖然成功地實現了「一次編譯,到處運行」,但是由於平台和平台之間的差異,所編寫的程序在轉換代碼的時候難免會出現微小的、不可察覺的錯誤和意外。有些程序員對此非常頭疼,他們嘲笑Java的程序不是「一次編譯,到處運行」,而是「一次編譯,到處調試」。以Java

AWT為例,早期Java

AWT內提供的按鈕、文字區等均是以計算機系統所默認的樣式而顯示。這令Java程序在有些沒有提供圖案的計算機系統產生錯誤(在Microsoft

Windows設有窗口管理器,在一些Linux distribution則沒有)。後來SUN公司針對Java AWT一些問題而推出Java

Swing。

平台無關性讓Java在伺服器端軟體領域非常成功。很多伺服器端軟體都使用Java或相關技術建立。

自動垃圾回收(Garbage Collection)

C++語言被用戶詬病的原因之一是大多數C++編譯器不支持垃圾收集機制。通常使用C++編程的時候,程序員於程序中初始化對象時,會在主機內存堆棧上分配一塊內存與地址,當不需要此對象時,進行析構或者刪除的時候再釋放分配的內存地址。如果對象是在堆棧上分配的,而程序員又忘記進行刪除,那麼就會造成內存泄漏(Memory

Leak)。長此以往,程序運行的時候可能會生成很多不清除的垃圾,浪費了不必要的內存空間。而且如果同一內存地址被刪除兩次的話,程序會變得不穩定,甚至崩潰。因此有經驗的C++程序員都會在刪除之後將指針重置為NULL,然後在刪除之前先判斷指針是否為NULL。

C++中也可以使用「智能指針」(Smart Pointer)或者使用C++託管擴展編譯器的方法來實現自動化內存釋放,智能指針可以在標准類庫中找到,而C++
(題主你怎麼可以問這么沙比的問題!)

託管擴展被微軟的Visual

C++

7.0及以上版本所支持。智能指針的優點是不需引入緩慢的垃圾收集機制,而且可以不考慮線程安全的問題,但是缺點是如果不善使用智能指針的話,性能有可能不如垃圾收集機制,而且不斷地分配和釋放內存可能造成內存碎片,需要手動對堆進行壓縮。除此之外,由於智能指針是一個基於模板的功能,所以沒有經驗的程序員在需要使用多態特性進行自動清理時也可能束手無策。

Java語言則不同,上述的情況被自動垃圾收集功能自動處理。對象的創建和放置都是在內存堆棧上面進行的。當一個對象沒有任何引用的時候,Java的自動垃圾收集機制就發揮作用,自動刪除這個對象所佔用的空間,釋放內存以避免內存泄漏。

注意程序員不需要修改finalize方法,自動垃圾收集也會發生作用。但是內存泄漏並不是就此避免了,當程序員疏忽大意地忘記解除一個對象不應該有的引用時,內存泄漏仍然不可避免。

不同廠商、不同版本的JVM中的內存垃圾回收機制並不完全一樣,通常越新版本的內存回收機制越快,IBM、BEA、SUN等等開發JVM的公司都曾宣稱過自己製造出了世界上最快的JVM[來源請求],JVM性能的世界紀錄也在不斷的被打破並提高。

IBM有一篇有關Java內存回收機制比不激活垃圾收集機制的C++內存處理快數倍的技術文章[15],而著名的Java技術書籍《Java編程思想》(Thinking in Java)也有一段論述Java內存及性能達到甚至超過C++的章節[16]。

基本語法

編寫Java程序前應注意以下幾點:

大小寫敏感:Java是大小寫敏感的,這就意味著標識符Hello與hello是不同的。

類名:對於所有的類來說,類名的首字母應該大寫。如果類名由若干單片語成,那麼每個單詞的首字母應該大寫,例如MyFirstJavaClass。

方法名:所有的方法名都應該以小寫字母開頭。如果方法名含有若干單詞,則後面的每個單詞首字母大寫,例如myFirstJavaMethod。

源文件名:源文件名必須和類名相同。當保存文件的時候,你應該使用類名作為文件名保存(切記Java是大小寫敏感的),文件名的後綴為.java。(如果文件名和類名不相同則會導致編譯錯誤)。

主方法入口:所有的Java程序由public static void main(String[] args)方法開始執行。

Java關鍵字

關鍵字 下面列出了Java關鍵字。這些關鍵字不能用於常量、變數、和任何標識符的名稱。

關鍵字

描述

abstract

抽象方法,抽象類的修飾符

assert

斷言條件是否滿足

continue

不執行循環體剩餘部分

default

switch語句中的默認分支

do-while

循環語句,循環體至少會執行一次

double

64-bit雙精度浮點數

else

if條件不成立時執行的分支

enum

枚舉類型

extends

表示一個類是另一個類的子類

final

表示定義常量

finally

無論有沒有異常發生都執行代碼

float

32-bit單精度浮點數

for

for循環語句

goto

用於流程跳轉(不可用,意即不可隨意跳轉)

if

條件語句

implements

表示一個類實現了介面

import

導入類

instanceof

測試一個對象是否是某個類的實例

int

32位整型數

interface

介面,一種抽象的類型,僅有方法和常量的定義

long

64位整型數

native

表示方法用非java代碼實現

new

分配新的類實例

package

一系列相關類組成一個包

private

表示私有欄位,或者方法等,只能從類內部訪問

protected

表示保護類型欄位

public

表示共有屬性或者方法

return

方法返回值

short

16位數字

static

表示在類級別定義,所有實例共享的

strictfp

浮點數比較使用嚴格的規則

super

表示基類

switch

選擇語句

synchronized

表示同一時間只能由一個線程訪問的代碼塊

this

調用當前實例或者調用另一個構造函數

throw

拋出異常

throws

定義方法可能拋出的異常

transient

修飾不要序列化的欄位

try

表示代碼塊要做異常處理

void

標記方法不返回任何值

volatile

標記欄位可能會被多個線程同時訪問,而不做同步

while

while循環

注釋

注釋作用:標識程序是干什麼的,以及它是如何構建的。注釋幫助程序員進行相互溝通以及理解程序。注釋不是程序設計語言,所以編譯器編譯程序時忽略它們。

介面和類別

Java自帶了創建介面的類別,可以這樣使用:

public interface Deleteable {

void delete();

}

這段代碼的意思是任何實現(implement)Deleteable介面的類別都必須實現delete()方法。每個類別對這個方法的實現可以自行定製。由此概念可以引出很多種使用方法,下面是一個類別的例子:

『捌』 Android圖形系統(六)-app與SurfaceFlinger服務連接過程

經過上一篇的概覽,我們對Android圖形系統渲染流程有了一個大致的了解,這篇開始做細節分析。那麼先來總結下app與SurfaceFlinger服務連接過程。

經過前面的activity 、window 、view 的分析我們大致了解了Activity的顯示過程。其實Surface的創建過程與Activity的顯示過程密不可分。

那麼就從Activity.makeVisible 開始捋下流程:

1 Activity.makeVisible getWindowManager() 並執行addView。

2 經過WindowManagerImpl 和 WindowManagerGlobal addView , 最終創建了ViewRootImpl

3 ViewRootImpl 內部會new Surface() ,它是一個Parcelable對象,可在進程間傳遞,但目前僅是一個空殼,還未被賦值。
同時,通過WindowManagerGlobal.getWindowSession()獲取了Session實例,准備好了與WMS通信,並且Session內有個成員變數SurfaceSession值得關注,它的初始化是在Session的windowAddedLocked方法,先埋個伏筆。

4 根據流程我們知道,最終ViewRootImpl會在走setView, 在這個方法中開始了兩個流程:

requestLayout執行會走消息,因此它雖然在addToDisplay前面,但是執行是在之後的,因此我們先來看看mWindowSession.addToDisplay,這個過程最終是在WMS執行addWindow方法:

我們之前埋過伏筆的,windowAddedLocked創建了SurfaceSession 對象,並將當前 Session 添加到 WMS.mSessions 成員變數。SurfaceSession 的創建會調用 JNI,在 JNI 調用 nativeCreate()。

從這里開始要細說下了,這是應用程序與SurfaceFlinger建立連接的關鍵點:

跟蹤到android_view_SurfaceSession.cpp 的nativeCreate()方法,創建了SurfaceComposerClient 對象,並且將這個對象賦值給類型為sp<SurfaceComposerClient>的智能指針mSession時,就會導致SurfaceComposerClient類的成員函數onFirstRef被調用:

SurfaceComposerClient類的成員函數getComposerService用來獲得SurfaceFlinger服務的一個代理介面.

ComposerService類是單例模式,當我們第一次調用它的靜態函數getInstance的時候,它就會在構造函數中獲得SurfaceFlinger服務的一個代理介面,並且保存在它的成員變數mComposerService中,同時會通過這個代理介面的成員函數getCblk來獲得一塊匿名共享內存mServerCblkMemory。這塊匿名共享內存是由SurfaceFlinger服務創建的,用來描述系統顯示屏的信息,例如,顯示屏的個數、大小、方向、密度等等信息。

這時候sm有值了,在接著onFirstRef()往下執行:

是不是感覺特別繞,下面來簡單總結下:

首先ComPoserService作為client 與 SurfaceFlinger server進行binder IPC , 獲取到SurfaceFlinger創建的Client對象,它相當於是SurfaceFlinger內部對應用程序客戶端的封裝對象,而Client與SurfaceComposerClient又互為binder ipc的兩端,SurfaceComposerClient為client端,Client為server端。

這樣,應用進程成功通過SurfaceComposerClient與SurfaceFlinger建立了連接。

下篇分析app請求SurfaceFlinger創建Surface過程。

參考:
https://blog.csdn.net/Luoshengyang/article/details/7857163
https://blog.csdn.net/armwind/article/details/73436532

『玖』 如何從github獲取源代碼

Java是一種廣泛使用的計算機編程語言,擁有跨平台、面向對象、泛型編程的特性,廣泛應用於企業級Web應用開發和移動應用開發。

任職於太陽微系統的詹姆斯·高斯林等人於1990年代初開發Java語言的雛形,最初被命名為Oak,目標設置在家用電器等小型系統的程序語言,應用在電視機、電話、鬧鍾、烤麵包機等家用電器的控制和通信。由於這些智能化家電的市場需求沒有預期的高,Sun公司放棄了該項計劃。隨著1990年代互聯網的發展,Sun公司看見Oak在互聯網上應用的前景,於是改造了Oak,於1995年5月以Java的名稱正式發布。Java伴隨著互聯網的迅猛發展而發展,逐漸成為重要的網路編程語言。

Java編程語言的風格十分接近C++語言。繼承了C++語言面向對象技術的核心,Java舍棄了C++語言中容易引起錯誤的指針,改以引用取代,同時移除原C++與原來運算符重載,也移除多重繼承特性,改用介面取代,增加垃圾回收器功能。在Java SE 1.5版本中引入了泛型編程、類型安全的枚舉、不定長參數和自動裝/拆箱特性。太陽微系統對Java語言的解釋是:「Java編程語言是個簡單、面向對象、分布式、解釋性、健壯、安全與系統無關、可移植、高性能、多線程和動態的語言」

Java不同於一般的編譯語言或直譯語言。它首先將源代碼編譯成位元組碼,然後依賴各種不同平台上的虛擬機來解釋執行位元組碼,從而實現了「一次編寫,到處運行」的跨平台特性。在早期JVM中,這在一定程度上降低了Java程序的運行效率。但在J2SE1.4.2發布後,Java的運行速度有了大幅提升。

與傳統類型不同,Sun公司在推出Java時就將其作為開放的技術。全球數以萬計的Java開發公司被要求所設計的Java軟體必須相互兼容。「Java語言靠群體的力量而非公司的力量」是 Sun公司的口號之一,並獲得了廣大軟體開發商的認同。這與微軟公司所倡導的注重精英和封閉式的模式完全不同,此外,微軟公司後來推出了與之競爭的.NET平台以及模仿Java的C#語言。後來Sun公司被甲骨文公司並購,Java也隨之成為甲骨文公司的產品。

現時,移動操作系統Android大部分的代碼採用Java 編程語言編程。
早期的Java

Java的發明人詹姆斯·高斯林

Duke,Java語言的吉祥物

語言最開始只是Sun計算機(Sun MicroSystems)公司在1990年12月開始研究的一個內部項目。Sun計算機公司的一個叫做帕特里克·諾頓的工程師被公司自己開發的C++和C語言編譯器搞得焦頭爛額,因為其中的API極其難用。帕特里克決定改用NeXT,同時他也獲得了研究公司的一個叫做「Stealth計劃」的項目的機會。

「Stealth計劃」後來改名為「Green計劃」,詹姆斯·高斯林和麥克·舍林丹也加入了帕特里克的工作小組。他們和其他幾個工程師一起在加利福尼亞州門羅帕克市沙丘路的一個小工作室裡面研究開發新技術,瞄準下一代智能家電(如微波爐)的程序設計,Sun公司預料未來科技將在家用電器領域大顯身手。團隊最初考慮使用C++語言,但是很多成員包括Sun的首席科學家比爾·喬伊,發現C++和可用的API在某些方面存在很大問題。

工作小組使用的是嵌入式系統,可以用的資源極其有限。很多成員發現C++太復雜以至很多開發者經常錯誤使用。他們發現C++缺少垃圾回收系統,還有可移植的安全性、分布程序設計、和多線程功能。最後,他們想要一種易於移植到各種設備上的平台。

根據可用的資金,喬伊決定開發一種集C語言和Mesa語言大成的新語言,在一份報告上,喬伊把它叫做「未來」,他提議Sun公司的工程師應該在C++的基礎上,開發一種面向對象的環境。最初,高斯林試圖修改和擴展C++的功能,他自己稱這種新語言為C++ ++ --,但是後來他放棄了。他將要創造出一種全新的語言,被他命名為「Oak」(橡樹),以他的辦公室外的橡樹命名。

就像很多開發新技術的秘密工程一樣,工作小組沒日沒夜地工作到了1993年的夏天,他們能夠演示新平台的一部分了,包括Green操作系統,Oak的程序設計語言,類庫及其硬體。最初的嘗試是面向一種類PDA設備,被命名為Star7,這種設備有鮮艷的圖形界面和被稱為「Duke」的智能代理來幫助用戶。1992年12月3日,這台設備進行了展示。

同年11月,Green計劃被轉化成了「FirstPerson有限公司」,一個Sun公司的全資子公司,團隊也被重新安排到了帕洛阿爾托。FirstPerson團隊對建造一種高度交互的設備感興趣,當時代華納發布了一個關於電視機頂盒的徵求提議書時(Request for proposal),FirstPerson改變了他們的目標,作為對徵求意見書的響應,提出了一個機頂盒平台的提議。但是有線電視業界覺得FirstPerson的平台給予用戶過多的控制權,因此FirstPerson的投標敗給了SGI。與3DO公司的另外一筆關於機頂盒的交易也沒有成功,由於他們的平台不能在電視工業產生任何效益,公司被並回Sun公司。

Java和互聯網
1994年6月,在經歷了一場歷時三天的腦力激盪的討論後,約翰·蓋吉、詹姆斯·高斯林、比爾·喬伊、帕特里克·諾頓、韋恩·羅斯因和埃里克·斯庫米,團隊決定再一次改變了努力的目標,這次他們決定將該技術應用於萬維網。他們認為隨著Mosaic瀏覽器的到來,網際網路正在向同樣的高度互動的遠景演變,而這一遠景正是他們在有線電視網中看到的。作為原型,帕特里克·諾頓寫了一個小型萬維網瀏覽器,WebRunner,後來改名為HotJava[12]。

1994年10月,HotJava和Java平台為公司高層進行演示。1994年,Java
1.0a版本已經可以提供下載,但是Java和HotJava瀏覽器的第一次公開發布卻是在1995年3月23日SunWorld大會上進行的。升陽公司的科學指導約翰·蓋吉宣告Java技術。這個發布是與網景公司的執行副總裁馬克·安德森的驚人發布一起進行的,宣布網景將在其瀏覽器中包含對Java的支持。1996年1月,升陽公司成立了Java業務集團,專門開發Java技術。

Java和「Java」
由於商標搜索顯示,Oak已被一家顯示卡製造商注冊。於是同年,Oak被改名為Java。當使用十六進制編輯器打開由Java源代碼編譯出的二進制文件(.class文件)的話,最前面的32位將顯示為CA FE BA BE,即片語「CAFE BABE」(咖啡屋寶貝)。

Java近況

一套Java編輯器軟體

J2SE環境與CDC的關連

JVM的所在角色

JSPX網頁的概念

在流行幾年之後,Java在瀏覽器中的地位被逐步侵蝕。它在簡單交互性動畫方面的用途已經完全被Adobe公司的Flash排擠,2005年Java傾向只被用於雅虎游戲那樣的更為復雜的應用程序。Java同時遭受到來自微軟的反對,他們決定在新版本的Internet Explorer和Windows中不再附帶Java平台。

與此相反。在萬維網的伺服器端和手持設備上,Java變得更加流行。很多網站在後端使用JSP和其他的Java技術。

在桌面系統上,獨立的Java程序還是相對少見,這是因為Java平台的運行開銷較大,而許多人的電腦上沒有安裝Java,由於網路帶寬在以前較小,下載Java曾經是個耗時的事情。但是隨著計算機計算能力、網路帶寬在10年中獲取了很大的進步,同時虛擬機和編譯器的質量得到了提高,許多應用程序得到了廣泛的使用,包括:

開源軟體:

NetBeans和Eclipse等軟體開發工具
Android操作系統
JEdit
Azureus BitTorrent客戶端。
JNode操作系統
Apache軟體基金會的Ant、Derby、Hadoop、Jakarta、POI和Tomcat
JBoss和GlassFish應用伺服器

商業軟體:

EIOffice(永中Office)
Minecraft
純Java 3D游戲合金戰士Chrome
IBM Websphere、ColdFusion和WebLogic
IntelliJ IDEA

還有許多用Java寫的軟體,可以在http://www.java.com 找到。在以下網頁可以看到非常多用Java寫的程序:http://java.sun.com/procts/ 下面有大量用Java Swing開發的桌面Java程序 http://java.sun.com/procts/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 Platform, Card Edition

Java開放源代碼項目
2006年SUN在JavaOne公布Java 開放源代碼項目,並推出OpenJDK項目。[13]Java虛擬機、Java編譯器和Java類庫以GNU通用公共許可證公開。

版本歷史
主條目:Java版本歷史

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
2009年12月,SUN公司發布Java EE 6
2010年11月,由於Oracle公司對於Java社區的不友善,因此Apache揚言將退出JCP[14]
2011年7月28日,Oracle公司發布Java SE 7
2014年3月18日,Oracle公司發表Java SE 8

語言特性
Java之所以被開發,是要達到以下五個目的:

應當使用面向對象程序設計方法學
應當允許同一程序在不同的計算機平台執行
應當包括內建的對計算機網路的支持
應當被設計成安全地執行遠端代碼
應當易於使用,並借鑒以前那些面向對象語言(如C++)的長處。

Java技術主要分成幾個部分:Java語言、Java運行環境、類庫。一般情況下說Java時並不區分指的是哪個部分。

Java在1.5版本時,做了重大改變,Sun公司並1.5版本重命名為Java 5.0。

面向對象
Java的特點之一就是面向對象,是程序設計方法的一種。「面向對象程序設計語言」的核心之一就是開發者在設計軟體的時候可以使用自定義的類型和關聯操作。代碼和數據的實際集合體叫做「對象」。一個對象可以想像成綁定了很多「行為(代碼)」和「狀態(數據)」的物體。對於數據結構的改變需要和代碼進行通信然後操作,反之亦然。面向對象設計讓大型軟體工程的計劃和設計變得更容易管理,能增強工程的健康度,減少失敗工程的數量。

跨平台性
Java語言的第二個特性就是跨平台性,也就是說使用Java語言編寫的程序可以在編譯後不用經過任何更改,就能在任何硬體設備條件下運行。這個特性經常被稱為「一次編譯,到處運行」。

執行Java應用程序必須安裝爪哇運行環境(Java Runtime Environment,JRE),JRE內部有一個Java虛擬機(Java Virtual Machine,JVM)以及一些標準的類庫(Class Library)。通過JVM才能在電腦系統執行Java應用程序(Java Application),這與.Net Framework的情況一樣,所以電腦上沒有安裝JVM,那麼這些程序將不能夠執行。

實現跨平台性的方法是大多數編譯器在進行Java語言程序的編碼時候會生成一個用位元組碼寫成的「半成品」,這個「半成品」會在Java虛擬機(解釋層)的幫助下運行,虛擬機會把它轉換成當前所處硬體平台的原始代碼。之後,Java虛擬機會打開標准庫,進行數據(圖片、線程和網路)的訪問工作。主要注意的是,盡管已經存在一個進行代碼翻譯的解釋層,有些時候Java的位元組碼代碼還是會被JIT編譯器進行二次編譯。

有些編譯器,比如GCJ,可以自動生成原始代碼而不需要解釋層。但是這些編譯器所生成的代碼只能應用於特定平台。並且GCJ目前只支持部分的Java API。

甲骨文公司對於Java的許可是「全兼容的」,這也導致了微軟和升陽關於微軟的程序不支持RMI和JNI介面、並且增加特性為己所用的法律爭端。升陽最終贏得了官司,獲得了大約兩千萬美元的賠償,法院強制要求微軟執行升陽公司關於Java的許可要求。作為回應,微軟不再在Windows系統中捆綁Java,最新的Windows版本,Windows Vista和Internet Explorer 7.0版本也不再提供對於Java應用程序和控制項的支持。但是升陽公司和其他使用Java運行時系統的公司在Windows操作系統下對用戶提供無償的第三方插件和程序支持。

Java語言使用解釋層最初是為了輕巧性。所以這些程序的運行效率比C語言和C++要低很多,用戶也對此頗有微詞。很多最近的調查顯示Java的程序運行速度比幾年前要高出許多,有些同樣功能的程序的效率甚至超過了C++和C語言編寫的程序[來源請求]。

Java語言在最開始應用的時候是沒有解釋層的,所有需要編譯的代碼都直接轉換成機器的原始代碼。這樣做的後果就是獲得了最佳的性能,但是程序臃腫異常。從JIT技術開始,Java的程序都經過一次轉換之後才變成機器碼。很多老牌的第三方虛擬機都使用一種叫做「動態編譯」的技術,也就是說虛擬機實時監測和分析程序的運行行為,同時選擇性地對程序所需要的部分進行編譯和優化。所有這些技術都改善了代碼的運行速度,但是又不會讓程序的體積變得失常。

程序的輕便性事實上是軟體編寫很難達到的一個目標,Java雖然成功地實現了「一次編譯,到處運行」,但是由於平台和平台之間的差異,所編寫的程序在轉換代碼的時候難免會出現微小的、不可察覺的錯誤和意外。有些程序員對此非常頭疼,他們嘲笑Java的程序不是「一次編譯,到處運行」,而是「一次編譯,到處調試」。以Java
AWT為例,早期Java
AWT內提供的按鈕、文字區等均是以計算機系統所默認的樣式而顯示。這令Java程序在有些沒有提供圖案的計算機系統產生錯誤(在Microsoft
Windows設有窗口管理器,在一些Linux distribution則沒有)。後來SUN公司針對Java AWT一些問題而推出Java
Swing。

平台無關性讓Java在伺服器端軟體領域非常成功。很多伺服器端軟體都使用Java或相關技術建立。

自動垃圾回收(Garbage Collection)
C++語言被用戶詬病的原因之一是大多數C++編譯器不支持垃圾收集機制。通常使用C++編程的時候,程序員於程序中初始化對象時,會在主機內存堆棧上分配一塊內存與地址,當不需要此對象時,進行析構或者刪除的時候再釋放分配的內存地址。如果對象是在堆棧上分配的,而程序員又忘記進行刪除,那麼就會造成內存泄漏(Memory

Leak)。長此以往,程序運行的時候可能會生成很多不清除的垃圾,浪費了不必要的內存空間。而且如果同一內存地址被刪除兩次的話,程序會變得不穩定,甚至崩潰。因此有經驗的C++程序員都會在刪除之後將指針重置為NULL,然後在刪除之前先判斷指針是否為NULL。

C++中也可以使用「智能指針」(Smart Pointer)或者使用C++託管擴展編譯器的方法來實現自動化內存釋放,智能指針可以在標准類庫中找到,而C++
(題主你怎麼可以問這么沙比的問題!)
託管擴展被微軟的Visual

C++
7.0及以上版本所支持。智能指針的優點是不需引入緩慢的垃圾收集機制,而且可以不考慮線程安全的問題,但是缺點是如果不善使用智能指針的話,性能有可能不如垃圾收集機制,而且不斷地分配和釋放內存可能造成內存碎片,需要手動對堆進行壓縮。除此之外,由於智能指針是一個基於模板的功能,所以沒有經驗的程序員在需要使用多態特性進行自動清理時也可能束手無策。

Java語言則不同,上述的情況被自動垃圾收集功能自動處理。對象的創建和放置都是在內存堆棧上面進行的。當一個對象沒有任何引用的時候,Java的自動垃圾收集機制就發揮作用,自動刪除這個對象所佔用的空間,釋放內存以避免內存泄漏。

注意程序員不需要修改finalize方法,自動垃圾收集也會發生作用。但是內存泄漏並不是就此避免了,當程序員疏忽大意地忘記解除一個對象不應該有的引用時,內存泄漏仍然不可避免。

不同廠商、不同版本的JVM中的內存垃圾回收機制並不完全一樣,通常越新版本的內存回收機制越快,IBM、BEA、SUN等等開發JVM的公司都曾宣稱過自己製造出了世界上最快的JVM[來源請求],JVM性能的世界紀錄也在不斷的被打破並提高。

IBM有一篇有關Java內存回收機制比不激活垃圾收集機制的C++內存處理快數倍的技術文章[15],而著名的Java技術書籍《Java編程思想》(Thinking in Java)也有一段論述Java內存及性能達到甚至超過C++的章節[16]。

基本語法
編寫Java程序前應注意以下幾點:

大小寫敏感:Java是大小寫敏感的,這就意味著標識符Hello與hello是不同的。
類名:對於所有的類來說,類名的首字母應該大寫。如果類名由若干單片語成,那麼每個單詞的首字母應該大寫,例如MyFirstJavaClass。
方法名:所有的方法名都應該以小寫字母開頭。如果方法名含有若干單詞,則後面的每個單詞首字母大寫,例如myFirstJavaMethod。
源文件名:源文件名必須和類名相同。當保存文件的時候,你應該使用類名作為文件名保存(切記Java是大小寫敏感的),文件名的後綴為.java。(如果文件名和類名不相同則會導致編譯錯誤)。
主方法入口:所有的Java程序由public static void main(String[] args)方法開始執行。

Java關鍵字
關鍵字 下面列出了Java關鍵字。這些關鍵字不能用於常量、變數、和任何標識符的名稱。

關鍵字
描述

abstract
抽象方法,抽象類的修飾符

assert
斷言條件是否滿足

continue
不執行循環體剩餘部分

default
switch語句中的默認分支

do-while
循環語句,循環體至少會執行一次

double
64-bit雙精度浮點數

else
if條件不成立時執行的分支

enum
枚舉類型

extends
表示一個類是另一個類的子類

final
表示定義常量

finally
無論有沒有異常發生都執行代碼

float
32-bit單精度浮點數

for
for循環語句

goto
用於流程跳轉(不可用,意即不可隨意跳轉)

if
條件語句

implements
表示一個類實現了介面

import
導入類

instanceof
測試一個對象是否是某個類的實例

int
32位整型數

interface
介面,一種抽象的類型,僅有方法和常量的定義

long
64位整型數

native
表示方法用非java代碼實現

new
分配新的類實例

package
一系列相關類組成一個包

private
表示私有欄位,或者方法等,只能從類內部訪問

protected
表示保護類型欄位

public
表示共有屬性或者方法

return
方法返回值

short
16位數字

static
表示在類級別定義,所有實例共享的

strictfp
浮點數比較使用嚴格的規則

super
表示基類

switch
選擇語句

synchronized
表示同一時間只能由一個線程訪問的代碼塊

this
調用當前實例或者調用另一個構造函數

throw
拋出異常

throws
定義方法可能拋出的異常

transient
修飾不要序列化的欄位

try
表示代碼塊要做異常處理

void
標記方法不返回任何值

volatile
標記欄位可能會被多個線程同時訪問,而不做同步

while
while循環

注釋

注釋作用:標識程序是干什麼的,以及它是如何構建的。注釋幫助程序員進行相互溝通以及理解程序。注釋不是程序設計語言,所以編譯器編譯程序時忽略它們。

介面和類別
Java自帶了創建介面的類別,可以這樣使用:

public interface Deleteable {
void delete();
}

這段代碼的意思是任何實現(implement)Deleteable介面的類別都必須實現delete()方法。每個類別對這個方法的實現可以自行定製。由此概念可以引出很多種使用方法,下面是一個類別的例子:

閱讀全文

與android智能指針相關的資料

熱點內容
神鼠全集 瀏覽:49
破案電影全部 瀏覽:934
中文字幕在線觀看網站網址 瀏覽:183
獸人電影有多少部 瀏覽:514
女同超人 瀏覽:923
電影大象生殖器 瀏覽:741
英語視聽說伺服器地址輸錯了怎麼辦 瀏覽:108
重生楊過收穆念慈,洗澡 瀏覽:836
工商總局app在哪裡下載 瀏覽:246
免費成人影院網站是多少 瀏覽:156
hp伺服器閃紅燈什麼意思 瀏覽:244
php加入購物車代碼 瀏覽:921
奇跡男孩電影完整版免費播放 瀏覽:663
羅曼史生孩子在那一段在幾分鍾 瀏覽:953
成龍40部經典電影 瀏覽:795
程序員連出兩次線上事故 瀏覽:427
啄木鳥電影什麼意思 瀏覽:292
主角叫柱子的鄉村小說 瀏覽:962
肉特別多的電影 瀏覽:970
好的在觀看網站 瀏覽:307