java零基礎入門-面向對象篇(十一)? 數(shù)據(jù)流動與包裝類
面向對象學了這么多,滿腦子都是對象,面向對象千好萬好,可是就是不知道對象到底有什么用。
這節(jié)課來講講對象和數(shù)據(jù)流動,以及如何選取合適的方式處理數(shù)據(jù)。
講解過程可能會涉及到web知識,沒關系,先混個眼熟,只用理解對象那一塊即可。
數(shù)據(jù)的流動
本人曾經(jīng)炒過股票,那過程可是一個驚險萬分,驚心動魄,驚為天人啊。一直都非常自信非常自我非常驕傲的我,認為自己完全就是天選之人,沒賺到錢只是暫時的,總有一天我會抓住大黑馬,然后走向人生巔峰。
直到有一天我突然看見了一張圖。
我看著這張圖,發(fā)現(xiàn)這個世界上居然有人能把我的心態(tài)揣摩的這么詳細,高,實在是高。當然,最后虧得差不多了,我就金盆洗手了。
為了玩股票,肯定少不了看股票網(wǎng)站或者app,我們看看對象如何 “帶著”?數(shù)據(jù)一起動起來。
首先有一個網(wǎng)站,他為廣大韭菜們提供各種各樣的股票數(shù)據(jù)。數(shù)據(jù)的獲取渠道有很多種,我們這里不詳細說。只用知道每個網(wǎng)站都有“一個”數(shù)據(jù)庫,用來存放數(shù)據(jù)。
網(wǎng)站有了數(shù)據(jù),并且存放在了數(shù)據(jù)庫,然后就等著各種端,WEB端,移動端來獲取數(shù)據(jù)。但是各種客戶端是不能夠直接與數(shù)據(jù)庫進行交互的,他們需要一個中介,那就是服務器。
我們前面有介紹過服務器,這個中介很厲害,他一邊可以接受來自客戶端的請求,一邊從數(shù)據(jù)庫里面掏出數(shù)據(jù),遞給客戶端,這就是服務器的作用。
其實精確的說,應該是服務器上的java代碼幫我們完成了這個動作。客戶端的請求發(fā)送到java代碼,java代碼去數(shù)據(jù)庫查找客戶端需要的數(shù)據(jù),然后返回給客戶端,這樣就形成了數(shù)據(jù)的流動。
數(shù)據(jù)庫和客戶端我們現(xiàn)在不去了解,我們重點來看看這里的java做的工作,這里的java代碼用對象將數(shù)據(jù)封裝起來,從數(shù)據(jù)庫“搬運”到了客戶端。具體看個例子。
我們可以將數(shù)據(jù)庫里面的數(shù)據(jù),想象成excel表格中的一行數(shù)據(jù),像這樣。
有沒有一種熟悉的感覺?這不就是屬性和賦值嗎?你的感覺很對,我們在設計數(shù)據(jù)庫的時候也會參考對象的設計理念,雖然設計數(shù)據(jù)庫還有各種各樣數(shù)據(jù)庫自己的規(guī)則。
我們從數(shù)據(jù)庫里面將這一條數(shù)據(jù)拿出來,直接將他放進一個對象里面。
客戶端也是可以直接獲取對象的,在拿到服務器返回的數(shù)據(jù)以后,客戶端就可以將數(shù)據(jù)展現(xiàn)在網(wǎng)頁或者APP里面了。
這樣就完成了數(shù)據(jù)從數(shù)據(jù)庫 “流動” 到客戶端的過程,java里的對象很好的體現(xiàn)了載體的作用,他將數(shù)據(jù)合理的聚合在一起,使我們很方便的操作數(shù)據(jù)。
包裝類
講完了數(shù)據(jù)的流動,我們再來講一個概念,包裝類。
包裝類就是將基礎類型轉換為對象,讓操作基礎類型可以像操作對象一樣簡單。
java里面的數(shù)據(jù)操作一般都是通過基礎類型完成。比如我們對數(shù)據(jù)進行加減,求和等等,但是基礎數(shù)據(jù)也有局限性,比如一些非計算的操作。
有時候我們獲取到的數(shù)據(jù)是字符串,而又需要將字符串String里面的內(nèi)容當做數(shù)字進行計算,這時候我們就需要使用包裝類來做轉換。
八種基礎類型對應八種包裝類。Double,Float,Long,Integer,Short,Byte,Character,Boolean。
其中數(shù)值類型使用頻率最高,數(shù)值類型中Integer,Long,Double使用頻率最高。
這里通過使用頻率最高的Integer來講解包裝類,其他的幾個包裝類大同小異。
查看源碼的方法前面講過了,這里展示了包裝類的基本用法。
首先定義一個基礎類型。然后使用這個基礎類型創(chuàng)建一個Integer的對象,Integer包裝類也是一個類,他有自己的方法,成員變量,當我們使用基礎類型作為參數(shù)的時候,我們可以看到,這個包裝類僅僅就是把這個基礎類型當成了成員變量。
而基礎類型的操作可以通過方法來實現(xiàn),比如這里是將currentPrice對象轉換成float類型,在源碼里面,其實是將成員變量value進行了強制轉換。
各位看清楚了沒有,其實包裝類就是將基礎類型封裝到一個類里面,基礎類型是不具備擴展性的,而類是可以擴展的,我們可以為類添加各種各樣的方法,這樣我們就可以定制各種我們需要的功能。
這個字符串轉換的操作使用比較頻繁,因為在開發(fā)過程中,不同的系統(tǒng)對數(shù)據(jù)的定義可能不一樣,有很大的概率碰到這種字符串數(shù)據(jù),所以需要進行類型轉換以后再進行操作才能得到我們想要的結果。
自動裝箱與拆箱
上面在定義包裝類的時候是用 new 來創(chuàng)建對象,但是這個操作比較麻煩,好在jdk幫我們做了一些操作,看下面的例子。
首先看自動裝箱,自動裝箱就是直接將一個int類型的數(shù)值賦值給Integer類型對象,不需要使用 new關鍵字來創(chuàng)建。其實這個地方只是沒有手動new對象而已,在我們看不見的地方,jdk幫我們完成了new對象這個動作。
我們查看源碼可以看到,Integer有一個專門的緩存,用來存放-128到127之間的數(shù)據(jù)。當我們需要的值在這個范圍內(nèi),程序會直接從緩存中獲取值并返回給我們,然后賦值給變量currentPrice1。如果值不在這個范圍內(nèi),比如我們這里是? 218 ,它不在緩存范圍,那么程序做的事其實和我們一樣,使用 new 關鍵字創(chuàng)建了一個 Integer 類型對象賦值給 currentPrice1。這就是自動裝箱的過程。
自動拆箱就更簡單了,將一個Integer類型的對象直接賦值給一個int類型變量,就是自動拆箱。
通過源碼我們看到,他是將一個Integer類型對象中的成員變量value,使用 intValue 方法拿出來,賦值給currentPriceInt1。
有了自動裝箱與拆箱,在編寫程序的過程中可以更加靈活方便的在基礎類型與對象之間進行轉換。
-----分割線----------------------------
越簡單的知識越難寫,最近更新慢,各位見諒。